Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


Delphi OLEのExcel操作術 第6回:ウインドウ編

DelphiアプリケーションでExcelを操作する便利な方法を
全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月号より(最前面表示)