DelphiからEXCELへのデーター転送

EXCEL出力1
 Delphiで測定器から測定値をサンプリングして、そのデーターを保存する時、EXCEL形式で保存の仕様を要求される場合があります。
CSV形式で、保存すればよいのですが、測定用のPCにEXCELがインストールされていたら、それを利用してEXCEL形式で保存するのが良いでしょう。
測定値の処理まで、平均値、分散の計算、グラフの表示等も、EXCELで行わせても良いのですが、利用者はあまりそれは望まないようです。
測定者によって、測定値の処理の方法が違うので、処理の方法をDelphiでプログラム化するする事はあまりありません。
測定中、測定データーをオシロスコープのようにリアルタイムに、画面に表示し、正しく測定できていることが判断でき、測定した結果を、分かり易いフォーマットでEXCEL形式でファイルに出力する事を要求されます。
 測定器の利用者は、自分でECCELにマクロをくみ、EXCEL形式で保存されたデーターを開き、マクロを組んだ自分のEXCELにコピー&ペーストでデーターを転送し処理をする事が多いようです。
この方法なら、測定器のデーターを個々の人が自由に処理が出来ます。
測定データーのグラフ出力、平均値、分散、推定等をDelphで行ったにしても、単純に測定値だけを、EXCEL形式で保存出来る様にしておくと、利用者にとって使い勝手のよいものになるでしょう。
 量産ライン用の測定器であれば別ですが、量産ラインの場合は、測定値により製品の合否判定があるのと、利用者が誰でも簡単に操作出来る様にしなければなりません。
ここでは、単にDelphiからEXCELにデーターを転送し、保存するプログラム例を紹介します。
ダウンロードして試してみて下さい。
DelphiToEXCEL Excelの起動と接続ボタンは、TExcelApplicationを利用してExcelを起動します。
新しいシートの追加ボタンは、WorkBookに新しいシートを追加、新しいシートをアクティブにします。
Editの内容転送Testボタンは、Editの内容と、プログラムされた内容をWorksheetに転送します。
CellのフォーマットTestボタンは、その名のとおり、Cellのフォーマットを設定するもので、全てを含んでいるわけではありません。
Excelの切断と終了
ボタンは、起動したEXCELを終了させますが、その際、データーのファイル保存がされていない場合、通常のExcel終了と同じように、保存されていないことのメッセージを表示し、保存忘れの防止をするようになっています。
TExcelApplicationでコントロールする場合、単に閉じてしまうと、データーの更新があっても、保存メッセージは出ません、保存されているかどうかの問い合わせをExcelにしてから閉じる必要があります。
FileOpenボタンは、Excelファイルを起動したExcelにOpenさせるものです。
Excelファイのオープン時には、既に接続しているWorkBookを閉じてから新しいファイルをオープンします。
これも、通常オープン時は、起動時のWorkBookが更新されていない限り自動的に閉じられますが、TExcelApplicationでコントロールする場合は、Delphiから閉じるコマンドを実行する必要があります。
Excelファイル保存ボタンは、Excelにファイル名を指定して保存をさせるボタンです、その場合、既に保存されている名前を選択すると、既に保存されているファイルをバックアップに変更し、新しいデーターを保存します。
Excelの起動接続書き込みテストボタンは、Excelの起動からデーターの書き込みまで行うものです。
Column文字テストボタンは、Excelは列をアルファベットで表し、行は数字で表し、二つをつないで、Cellの位置を表すようになっているので、その列番号の確認用です。
Excel2007以前は、列は256(IV)迄しかありません注意が必要です、Excel2007以降は18278(ZZZ)迄となります。
列番号、行番号をそのまま利用して、Excelに書き込みが出来ないわけではありませんが、範囲を指定する場合は、列はアルファベット、行は数字で二つ加算した文字で指定する必要があります。

const ColTitle: array[1..26] of char = ('A','B','C','D','E','F','G','H','I','J',
                                        'K','L','M','N','O','P','Q','R','S','T',
                                        'U','V','W','X','Y','Z');

// 列名(ColNoからA~ZZZ)を取得する。
function TExcelF.GetColTitle(idx: integer): string;
var
   t: string;
 idj: integer;
begin
  if idx <= 26 then                                 // idx <= Z(26) なら
    begin
      t := ColTitle[idx];                            // A~Z (26)
    end
    else                                            // idx > Z(26) なら   
    begin
      if idx <= (26 + 1) * 26 then                  // idx <= ZZ(26^2 + 26 = 702) なら
        begin
          t := ColTitle[(idx - 1) div 26];           // AA~Z? AA = 27 Z? (26^2) ZZ = 702
          t := t + ColTitle[(idx - 1) mod 26 + 1];   // A~Z A = 1 Z = 26
        end
        else                                        // idx > ZZ(702)なら
        begin
          idj := (idx - (26 + 1)) div (26 * 26);     // AAA~Z?? AAA = 703 Z?? (26^3) ZZZ = 26^3+26^2+26 = 18278
            t := ColTitle[idj];
          idx := idx - 26 * 26 * idj;
            t := t + ColTitle[(idx - 1) div 26];     // AA~Z? AA = 27 Z? (26^2) ZZ = 26^2+26 = 702
            t := t + ColTitle[(idx - 1) mod 26 + 1]; // A~Z A = 1 Z = 26
        end;
    end;
  result := t;
end;

const
  Col := 4; // 4列目
  Row := 1; // 1行目
var
  St,En: string;

procedure TExcelF.Test;
begin
  St := GetColTitle(Col) + intTostr(Row);            // St = 'D1';
  En := GetColTitle(Col + 2) + intTostr(Row + 2);    // En = 'F3'
  ExcelWorksheet1.Range[St,En].Value := 'Text';      // Range による書き込み 'D1'から'F3'の範囲で'Text'が書き込まれる
end;


フォーマット例左図はセルのフォーマット指定例です。
Excel全てのフォーマットの指定が出来ます。
 出力したExcelファイルをそのまま使用するのであれば、フォーマットや、平均、分散の計算、グラフ化などをDelphiから行っても良いと思いますが、前記したように、たいがいは、自分用のマクロを組み込んだ、Excelファイルを使用して、コピー&ペーストにより処理をする事が殆どであることを考えると、単に、分かり易いフォーマットとするか、フォーマットはデフォルトのままにして、出力するのが良いかと思います。
 単にExcelファイルにして出力するのであれば、起動したExcelは非表示にして、間違ってExcelの操作をされないようにした方が良いでしょう。


download DelphiExcel.zip


最初に戻る