Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2009年05月24日] [更新 2016年06月11日] エクセル操作フォームEx
エクセル操作フォームEx   参考コード類
セルの書式設定・関数定義など
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro + Excel 2010







文字の色やセルの背景色


セルの文字サイズ、位置、色、セルの背景色の設定例です。
これらのプロパティは、Excel 2013 VBA のヘルプでは Range オブジェクトのプロパティとして掲載されています。一方、MSDN オンラインでは CellFormat オブジェクトのプロパティとして掲載されています。


図1
実行結果

リスト1 
procedure TplExcelFormEx1.Button1Click(Sender: TObject);
var
  ARange : Txlf2000Range;
begin
  xlfActiveSheetName := 'Sheet1';
  ARange := xlfExcelSheet.Range['B2', 'B2'];

  //セルに文字1
  //エクセル操作フォームで用意したプロパティを使用
  xlfCellValue['B4'] := 'Delphi';

  //セルの書式設定
  ARange.Value               := '文字の色等';
  ARange.RowHeight           := 50;                  //行高さ(ポイント)
  ARange.HorizontalAlignment := xlLeft;;             //横方向の配置
  ARange.VerticalAlignment   := xlCenter;            //縦方向の配置
  ARange.Font.Size           := 16.5;                //文字サイズ(ポイント)
  ARange.Font.Color          := clBlue;              //文字の色
  ARange.Font.Name           := 'MS Pゴシック';   //フォント名
  ARange.Interior.Color      := clSilver;            //背景色

  //セルF3の背景をxlGray16の編掛け模様
  xlfExcelSheet.Range['B6', 'C5'].Interior.Pattern := xlGray16;
end;




関数式の設定


エクセルのシートでの設定と同じです。文字列で関数式を代入します。リストでは B2~B4 までの合計を B5 のセルに定義しています。


図2
実行結果
  • セル B5 が B2~B4 までの合計値

リスト2 
procedure TplExcelFormEx1.Button2Click(Sender: TObject);
begin
  xlfActiveSheetName := 'Sheet1';
  xlfCellValue['B5'] := '=SUM(B2:B4)';
end;




関数式の連続コピー


関数 (メソッド) には複数セルに対して操作可能なものあります。その 1 つです。
次のサンプルは、B1 と C1 の平均値をセル D1 に代入します。この D1 に設定した関数、数式を連続したセルにコピーします。
本エクセル操作フォームExにメソッ ド xlfCopyCells がありますが、このサンプルと同じ様なコードを実行するようになっています。


図3
実行前
図4
実行結果

リスト3 
procedure TplExcelFormEx1.Button3Click(Sender: TObject);
var
  ARange : OleVariant;
begin
  xlfActiveSheetName := 'Sheet1';

  ARange := xlfExcelSheet.Range['D2', 'D2'];
  ARange.Formula := '=AVERAGE(B2:C2)';
  ARange.AutoFill(xlfExcelSheet.Range['D2', 'D7']);
end;




ワークシート関数の使用


エクセルのワークシート関数、WorkSheetFunction オブジェクトのメソッドの使用例です。
このワークシート関数は、Windows2000.pas を見ると、関数によっては引数が非常に多いのがあります。このような場合、WorkSheetFunction そのものを OleVariant で扱うと便利です。
サンプルは Match 関数の例で、セル C1 と同じ値を A1~A7 の範囲内から検索し、その行番号と値を取得して表示します。


図5
実行前
  • 文字列[沓掛 時次郎]を指定セル範囲検索
図6
実行結果

リスト4 
procedure TplExcelFormEx1.Button4Click(Sender: TObject);
var
  AFunction : OleVariant;
  AValue    : OleVariant;
  CellStr   : string;
begin
  xlfActiveSheetName := 'Sheet1';

  AFunction := xlfExcelApp.WorksheetFunction;

  //実際にはMatch関数の引数は3つしかないのでOleVariantにする必要はほとんどない
  //C2と同じ値がA2~A7までにあるかを検索
  try
    AValue := AFunction.Match(xlfExcelSheet.Range['C2', 'C2'],
                              xlfExcelSheet.Range['A2', 'A7'],
                              0);
    xlfExcelSheet.Range['D2', 'D2'].Value := AValue + 1;
    CellStr := 'B' + IntToStr(Round(AValue) + 1);
    xlfExcelSheet.Range['E2', 'E2'].Value :=
                                    xlfExcelSheet.Range[CellStr, CellStr].Value;
  except
    MessageBox(Handle, '検索語句はありません', '結果', MB_ICONINFORMATION);
  end;
end;




文字としての数字


エクセルのセルに「数字」を入力すると、デフォルトでは「数値」として扱われます。例えば固定桁数の商品番号の値等を入力しても、先頭の 0 は削除されます。
入力した数字を文字列として認識させるためには、次のコードのように、セルの書式の表示形式を「文字列」とします。



[備考]
数字を常に指定桁数で表示したい場合、数値を書式設定して表示する方法も考えられます。


図7
数字入力
  • 00123 を入力
図8
入力確定
  • 先頭の 0 はなくなってしまう
図9
文字列として扱う方法
  • セルの書式を「文字列」とする

リスト5 
procedure TplExcelFormEx1.Button5Click(Sender: TObject);
var
  ARange : Txlf2000Range;
begin
  xlfActiveSheetName := 'Sheet1';

  ARange := xlfExcelSheet.Range['B1','B10'];
  ARange.NumberFormatLocal := '@';
  xlfCellValue['B2']       := '000123';
end;


次のコードのように、先頭に「'」(アポストロフィ) を付ける方法もあります。
先頭にアポストロフィを付けても、セルの書式の表示形式を文字列にしても、エクセルのバージョンによっては、下図のようなヒント表示が現れることがあります。下のコードでは、この表示が現れないようにしていますが、これはエクセル全体の設定です。必要ならば終了時に元に戻しておきます。


図10
文字列の先頭に ' を付ける
図11
ヒント (警告?) 表示

リスト6 
var
  objExcelApp : OleVariant;
begin
  //Excel 2007以降の[オプション][数式][エラーチェックルール]の
  //[文字列形式の数値,またはアポトロフィで始まる数値]のチェックを外す
  //エクセル操作フォームはExcel2000.pasを使用しているのでErrorCheckingOptionsが
  //ない。そこでOleVariantにして設定
  if xlfExcelVersionNo >= 12 then begin
    objExcelApp := xlfExcelApp.Application;
    objExcelApp.ErrorCheckingOptions.NumberAsText := False;
  end;

  xlfActiveSheetName := 'Sheet1';
  xlfCellValue['B2'] := '''000123';
end;




マクロ関数の使用


マクロ関数 ExecuteExcel4Macro は、名前から推測できるように Excel 4.0 時代からの機能ですが、Excel 2007 でも使用可能です。当時はマクロの記録と言う機能はなく、マクロシートというマクロを書くだけのシートにマクロを書いていました。リファレンスブック等が各社から発売されていました。数年前まではマイクロソフトのサイトから英語版のヘルプがダウンロード可能でしたが、現在はないようです。エクセルのヘルプにも詳しい説明は書いてありません。
マクロ関数を使用しなければならない場面はほとんどないと思われますが、場合によっては機能的に便利なこともあります。ネット上でサンプルを掲載しているサイトもあるようです。

以下のサンプルは、ブックを表示しないで、その指定シートのセル値を取得する例です。エクセルのインスタンスを作成し、非表示のままで操作すれば同じことが可能ですので、このサンプルはマクロ関数はどのように使用するかという参考です (非表示の方が描画更新がない分速度的には有利)。マクロ関数の引数は文字列 1 つだけです。この文字列に全ての実行内容を記述します。
対象のブックが Excel 2007 以降の xlsx でも動作します。


図12
対象ブックのシート
  • セル C7 (R7C3) の値を取得する
図13
実行結果

リスト7 
procedure TplExcelFormEx1.Button7Click(Sender: TObject);
var
  ABookPath : String;
  SrcSheet  : String;
  SrcCells  : String;
  AValue    : OleVariant;
begin
  xlfActiveSheetName := 'Sheet1';

  ABookPath  := ExtractFilePath(ParamStr(0)) + '[シート選択テスト.xlsx]';
  SrcSheet   := QuotedStr(ABookPath + '第1四半期');
  SrcCells   := '!R7C3';

  AValue := xlfExcelApp.ExecuteExcel4Macro(SrcSheet + SrcCells);

  if VarIsError(AValue) then begin
    ShowMessage('失敗しました。');
  end else begin
    xlfCellValue['A2'] := AValue;
  end;
end;




表示書式の設定と取得


下図は、B2~B5 のセル範囲に対して表示書式を設定してるシートです。
一般に、セルに表示関係の書式を設定しておいた方が処理が速くなると言われています。ただし、これを行、列単位で設定すると、値が入力されていない行または列もデータ範囲に含まれ、空白のページが印刷されてしまう場合があります。
行や列単位で設定した場合は、データ入力後に、空白の行や列を削除してから保存しておくといいのではないかと思われます。


[備考]
エクセルのセルの書式の形式と、Delphi の Format 関数等による書式の形式が必ずしも一致するとは限りません。
したがって、エクセルのセルに表示されている形式を、例えば TStringGrid のセルに、同じ形式の書式で表示できるとは限りません。



図14
実行画面

リスト8 
procedure TplExcelFormEx1.Button8Click(Sender: TObject);
var
  ARange : Txlf2000Range;
begin
  xlfActiveSheetName := 'Sheet1';

  ARange := xlfExcelSheet.Range['B2','B10'];
  ARange.NumberFormatLocal := '#,##0.000';
end;


セルの書式は次のようなコードで取得できます。
書式の設定の時と同じ Range オブジェクトの NumberFormatLocal プロパティを使用します。このプロパティは読み書き両用です。下図は、書式が設定していない標準のセルの場合です。


図15
指定セルの書式を調べる

リスト9
指定したセルの書式を調べる
procedure TplExcelFormEx1.Button10Click(Sender: TObject);
var
  ARange  : Txlf2000Range;
  strText : String;
begin
  ARange  := xlfExcelSheet.Range['B12', 'B12'];
  strText := ARange.NumberFormatLocal;
  MessageBox(Handle, PChar(strText), '情報', MB_ICONINFORMATION);
end;




書式設定の NumberFormatLocal プロパティによる条件分岐


セルの表示の書式を設定する Range オブジェクトの NumberFormatLocal プロパティは、文字の色も設定できます。また、条件分岐の設定も可能です。その例です。


図16
80 以上の値を入力した場合
図17
80 未満の値を入力した場合

リスト10
NumberFormatLocal プロパティによる条件分岐の例
procedure TplExcelFormEx1.Button9Click(Sender: TObject);
var
  ARange : Txlf2000Range;
begin
  ARange := xlfExcelSheet.Range['B1','B10'];
  ARange.Font.Size := 12;

  ARange.NumberFormatLocal := '[>=80][色41]"合格"_#0;[赤]"落第"_#0';
end;