DelphiアプリケーションでExcelを操作する便利な方法を
全7回に分けてご紹介してまいります。
今回は前回よりさらに踏み込んだセル・行・列で実行できる操作についてご説明します。
- 第1回:基本編
- 第2回:印刷編
- 第3回:セル操作編(基本)
- 第4回:セル操作編(応用)
- 第5回:セル操作編(発展)
- 第6回:ウインドウ編
- 第7回:その他・発展編
※第1~5回でも使用した以下の変数は、今回も引き続き使用します。
uses節には「System.Win.ComObj」を追加しておいて下さい。
(Delphi XE以前では「ComObj」)
var // 「OLEのExcel操作術」各Tips共通で使用する変数宣言 MsExcel: OleVariant; // ExcelのOLE変数 MsApplication: OleVariant; // アプリケーションのOLE変数 WBook: OleVariant; // ブックのOLE変数 WSheet: OleVariant; // シートのOLE変数
また、記事中の各コードは対象となるExcelアプリケーションなどの各変数が
設定されていることが前提です。
(プログラムではExcelファイルが開かれるコードを実行した状態になります)
手っ取り早く検証のみ行いたい場合は、上記変数定義ののち以下を記述します。
// Excel起動 MsExcel := CreateOleObject('Excel.Application'); MsApplication := MsExcel.Application; MsApplication.Visible := True; // 新規ファイルを作成 WBook := MsApplication.WorkBooks.Add ; WSheet := WBook.ActiveSheet;
また、本文中で登場するExcel側で決められた定数は
constで宣言しておくとわかりやすくなります。
(※uses節に「Excel2000」を追加しておくと本記事で使用する名前の定数の大半が
含まれているため、const宣言不要になります。
またExcel2000ではなく「Office2000」または「OfficeXP」に含まれる定数もあります。)
ウィンドウ枠の固定
本項では「ウィンドウ枠の固定」を行う方法をご説明します。
セルを選択した後、Excelの ActiveWindow.FreezePanes をTrueにします。
このときのExcelというのは、CreateOleObjectを行ったオブジェクトになります。
『MsExcel := CreateOleObject(‘Excel.Application’); 』
のように CreateOleObject を実行していた場合、MsExcel を指しますので、次のようになります。
WSheet.Range['C5'].Select; MsExcel.ActiveWindow.FreezePanes := True;
また「ウィンドウ枠の固定」を解除するには、このプロパティをFalseに戻すだけです。
なおすでに設定されている「ウィンドウ枠の固定」のセルを変更する場合、
一旦プロパティをFalseにして解除する必要がございます。
MsExcel.ActiveWindow.FreezePanes := False; WSheet.Range['D6'].Select; MsExcel.ActiveWindow.FreezePanes := True;
オートフィルターの設定
本項ではデータの抽出を行うフィルター処理についてご説明します。
オートフィルター①(基本編)
データ範囲の先頭セル(左上)を指定して、AutoFilterを実行すると、
先頭行の各セルにオートフィルターの矢印が表示されます。
手動で条件式を指定する場合には、次のコードだけで行えます。
WSheet.Range['A1'].AutoFilter;
条件式をコードから行う場合、AutoFilter実行時のパラメータの
「Field」で列番号、「Criteria1」で値を指定します。
次のコードでは、1列目のセル値≧2000 となる行が抽出されます。
WSheet.Range['A1'].AutoFilter(Field:=1, Criteria1:='>=2000' );
2つめの条件式を指定する場合、
「Criteria2」で値を、「Operator」で条件式の結合’xlAnd‘または’xlOr‘をセットします。
次のコードでは、’AND’で条件を結んでいますので、
「2000≦1列目のセル値<3000」に該当する行が抽出されます。
const xlAnd = $00000001; xlOr = $00000002; begin WSheet.Range['A1'].AutoFilter(Field:=1, Criteria1:='>=2000', Operator:=xlAnd, Criteria2:='<3000');
また3つ以上の値を指定する場合には、Variant型の配列にセットします。
次のように値をセットした変数OleArrayを「Criteria1」に設定します。
また「Operator」は’xlFilterValues’になります。
数値項目であってもセットする値を”で囲む必要がありますので、ご注意下さい。
const xlFilterValues = $00000007; var OleArray : Variant; begin OleArray := VarArrayCreate([0,2],varVariant); OleArray[0] := '1000'; OleArray[1] := '2000'; OleArray[2] := '3000'; WSheet.Range['A1'].AutoFilter(Field:=1, Criteria1:=OleArray, Operator:=xlFilterValues);
ここまで基本編として紹介してきたオートフィルターの条件式で使用される記号は
Delphiでも使用される「=」「<>」「>」「>=」「<」「<=」 などです。
オートフィルター②(応用編)
文字のオートフィルターでは、
「XXXで始まる」「XXXで終わる」「XXXを含む」「XXXを含まない」
といったことも指定できます。
これらの指定には、Windowsで一般的に使用されているワイルドカードを使用します。
任意の1文字を表す「?」と任意の文字列となる「*」が使用できます。
例えば次のコードでは、6番目の列(都道府県名)の値が’山’で始まるデータを抽出します。
// '山'で始まる … '山形県' '山口県'など WSheet.Range['A1'].AutoFilter(Field:=6, Criteria1:='山*');
同様にワイルドカードの位置を変えることで、他の条件を指定できます。
// '山'を含む … '山形県' '山口県' '岡山県' '和歌山県'など WSheet.Range['A1'].AutoFilter(Field:=6, Criteria1:='*山*'); // '府'で終わる … '大阪府' '京都府'など WSheet.Range['A1'].AutoFilter(Field:=6, Criteria1:='*府');
「XXXを含まない」場合には、
指定する値に等しくないことを表す記号「<>」を先頭に付加します。
// '県'を含まない WSheet.Range['A1'].AutoFilter(Field:=6, Criteria1:='<>*県*');
ただこの場合ですと、6列目が空白セルのデータも抽出されます。
空白セルは抽出しないのであれば、「<>」だけの式をANDで結びます。
// '県'を含まず、空白セルは除く WSheet.Range['A1'].AutoFilter(Field:=6, Criteria1:='<>*県*', Operator:=xlAnd, Criteria2:='<>');
なお空白セルのみ抽出するには、ワイルドカードなどを使わず、単に”を指定します。
// 空白セルのみ WSheet.Range['A1'].AutoFilter(Field:=6, Criteria1:='');
またコードで続けてフィルターを指定した場合、
同じ列(Field指定番号)に対して行ったものについては、最後に行われたフィルター条件のみ有効です。
次のコードでは、最後の条件である’東京都’のみ抽出されます。
WSheet.Range['A1'].AutoFilter(Field:=6, Criteria1:='大阪府'); WSheet.Range['A1'].AutoFilter(Field:=6, Criteria1:='東京都');
しかし、別の列に対して行うと、続けてフィルター処理が行われます。
次の場合、6列目=’大阪府’ かつ 7列目=’大阪市’のデータが抽出されます。
WSheet.Range['A1'].AutoFilter(Field:=6, Criteria1:='大阪府'); WSheet.Range['A1'].AutoFilter(Field:=7, Criteria1:='大阪市');
呼び出したExcel画面を最前面表示
Delphi/400からはOLEを使ってExcel操作ができますので、
IBM i(AS/400)上のデータをExcelへの出力するといったことはよく行われています。
その際にExcel画面がDelphi/400画面の背面となってしまうことがあります。
別プログラムとしてExcelが呼び出されるために、Windowsの仕様としてこのようになりますが、
Windows APIのSetForegroundWindow関数をDelphi/400から呼び出すことで、
最前面にすることが可能です。
SetForegroundWindow関数には最前面にしたいウィンドウのハンドルを引き渡します。
Excel画面のハンドルは、Excel 2002 以降であれば、
Excelオブジェクトのプロパティで取得できます。
var … xlsHD : THandle; begin MsExcel := CreateOleObject('Excel.Application'); // ハンドル取得 xlsHD := MsExcel.Hwnd; // 最前面に SetForegroundWindow(xlsHD);
(本記事は、以下の資料をもとに最新情報を含めた再構成をしております。)
- ミガロ.情報マガジン「MIGARO News!!」
- Vol.135 2012年2月号より(ウィンドウ枠の固定)
- Vol.138 2012年5月号より(オートフィルター 基本編)
- Vol.139 2012年6月号より(オートフィルター 応用編)
- Vol.144 2012年11月号より(最前面表示)