DelphiからEXCELへのデーター転送
Delphiで測定器から測定値をサンプリングして、そのデーターを保存する時、EXCEL形式で保存の仕様を要求される場合があります。
CSV形式で、保存すればよいのですが、測定用のPCにEXCELがインストールされていたら、それを利用してEXCEL形式で保存するのが良いでしょう。
測定値の処理まで、平均値、分散の計算、グラフの表示等も、EXCELで行わせても良いのですが、利用者はあまりそれは望まないようです。
測定者によって、測定値の処理の方法が違うので、処理の方法をDelphiでプログラム化するする事はあまりありません。
測定中、測定データーをオシロスコープのようにリアルタイムに、画面に表示し、正しく測定できていることが判断でき、測定した結果を、分かり易いフォーマットでEXCEL形式でファイルに出力する事を要求されます。
測定器の利用者は、自分でECCELにマクロをくみ、EXCEL形式で保存されたデーターを開き、マクロを組んだ自分のEXCELにコピー&ペーストでデーターを転送し処理をする事が多いようです。
この方法なら、測定器のデーターを個々の人が自由に処理が出来ます。
測定データーのグラフ出力、平均値、分散、推定等をDelphで行ったにしても、単純に測定値だけを、EXCEL形式で保存出来る様にしておくと、利用者にとって使い勝手のよいものになるでしょう。
量産ライン用の測定器であれば別ですが、量産ラインの場合は、測定値により製品の合否判定があるのと、利用者が誰でも簡単に操作出来る様にしなければなりません。
ここでは、単にDelphiからEXCELにデーターを転送し、保存するプログラム例を紹介します。
ダウンロードして試してみて下さい。
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の操作をされないようにした方が良いでしょう。
DelphiExcel.zip
最初に戻る