Migaro. 技術Tips

                       

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


Delphi OLEのExcel操作術 第4回:セル操作編(応用)

DelphiアプリケーションでExcelを操作する便利な方法を
全7回に分けてご紹介してまいります。

今回は前回より少し踏み込んだセル・行・列で実行できる操作についてご説明します。

 

※第1~3回でも使用した以下の変数は、今回も引き続き使用します。

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宣言不要になります。)

 


行の高さや列幅の変更

本項ではセルの幅や高さを変更する方法をご紹介します。

セルの指定であれば今まで出てきたようにCellを使って列・行番号を指定する方法と
Rangeを使ってセル名を指定する方法があります。
またRangeはセルの範囲指定も行えます。

さらにEntireRowを使用するとRangeで指定したセル範囲を含む行、
EntireColumnでRangeで指定したセル範囲を含む列を指定できます。

 

【幅の変更】
ColumnWidth
に値を設定することで幅を変更できます。
ひとつのセルの幅を指定するとその列全体の幅が変更されます。

Rangeを使って範囲を指定するとその範囲の列全体が変更されます。

また特定の行にある列をすべて変更することでそのシート全体の列幅が変更されます。

  // 単一列
  WSheet.Cells[1,1].ColumnWidth  := 40;
  WSheet.Range['B2'].ColumnWidth  := 40;

  // 範囲に含まれる列
  WSheet.Range['C3','E5'].ColumnWidth  := 40;

  // シート全体
 WSheet.Rows[1].ColumnWidth := 40;

 

【高さの変更】
RowHeight
に値を設定することで高さを変更できます。
考え方は幅の場合と同じで、ひとつの行や範囲内の行、またシート全体の行を変更できます。

  // ひとつの行
  WSheet.Cells[1,1].RowHeight  := 20;
  WSheet.Range['D3'].RowHeight := 20;

  // 範囲に含まれる行
  WSheet.Range['D3','E10'].RowHeight := 20;

  // シート全体
  WSheet.Columns[1].RowHeight := 20;

 


行の高さや列幅の自動調整

前項ではセルの行や幅を値を指定して変更する方法をご紹介しましたが、
文字のサイズに合わせて自動調整することができます。
(セルの境界をダブルクリックして自動調整する時と同じ挙動となります)

 

【自動で列幅を調整】
EntireColumnのAutoFitを使用することで、
そのセルの文字に合わせて幅が自動で調整されます。

  // ひとつの列
  WSheet.Cells[1,1].EntireColumn.AutoFit;
  WSheet.Range['B2'].EntireColumn.AutoFit;

  // 範囲に含まれる列
  WSheet.Range['C3','E5'].EntireColumn.AutoFit;

  // シート全体
  WSheet.Rows[1].EntireColumn.AutoFit;

 

【自動で行の高さを調整】
EntireRowのAutoFitを使用することで、
そのセルの文字に合わせて高さが自動で調整されます。

  // ひとつの行
  WSheet.Cells[1,1].EntireRow.AutoFit;
  WSheet.Range['B2'].EntireRow.AutoFit;

  // 範囲に含まれる行
  WSheet.Range['C3','E5'].EntireRow.AutoFit;

  // シート全体
  WSheet.Columns[1].EntireRow.AutoFit;

 


セルに式を設定する方法

ここからは、セルに式を設定する方法をご紹介します。

 

【基本的な式】
式といっても、「=」 で始まる文字列をセットするだけですので、
例えばよく使用される計算式であれば、次のようになります。

  WSheet.Cells[1, 1].Value := 100;
  WSheet.Cells[2, 1].Value := 200;
  WSheet.Cells[3, 1].Value := '=A1+A2';

関数であっても同様です。

  WSheet.Range['B1'].Value := 1000;
  WSheet.Range['B2'].Value := 2000;
  WSheet.Range['B3'].Value := '=SUM(B1:B2)';
  WSheet.Range['B4'].Value := '=AVERAGE(B1:B2)';

 

最終行・最終列を利用した式

集計などの範囲が固定でなく、先頭から最終行までを範囲とする場合には
最終行をプロパティから取得できますので、次のような形になります。

【最終行を使った式】

  WSheet.Cells[1, 1].Value := 100;
  WSheet.Cells[2, 1].Value := 200;
  WSheet.Cells[3, 1].Value := 300;
  ・・・

  // 最終行
  r :=  WSheet.UsedRange.Rows.Count;

  // 最終行を使って式を設定
  WSheet.Cells[r+1, 1].Value := '=SUM(A1:A' + IntToStr(r) + ')';

式の設定は上記のように文字列の連結以外にFormat関数を使用してもわかりやすくなります。

  WSheet.Cells[r+1, 1].Value := Format('=SUM(A%d:A%d)',[1,r]);

 

【最終列を使った式】
最終列も最終行と同様にプロパティから取得できますが、
A列ならば1、というように数値になります。
セルの式では 列指定は数字ではなく、アルファベットを指定しなければなりません。
このため、数値をアルファベットにDelphiで変換ロジックを作成する方法もありますが、
Excelの関数からでも行えます。

例えば1行目のA列から6番目の列(F列)の合計を求めたい場合の式は
  =SUM(A1:INDIRECT(ADDRESS(1,6,4)))
となります。
【最終行を使った式】と同様に、文字列の連結とFormat関数を使用すると次のようになります。

  WSheet.Cells[1, 1].Value := 100;
  WSheet.Cells[1, 2].Value := 200;
  WSheet.Cells[1, 3].Value := 300;
  ・・・

  // 最終列
  c :=  WSheet.UsedRange.Columns.Count;

  // 最終列を使って式を設定(文字列連結)
  WSheet.Cells[1,c+1].Value :=  '=SUM(A1:INDIRECT(ADDRESS(1,'
                              + IntToStr(c)
                              + ',4)))';

  // 最終列を使って式を設定(Format関数)
  WSheet.Cells[1,c+1].Value :=
             Format('=SUM(A%d:INDIRECT(ADDRESS(1,%d,4)))',[1,3]);

 


罫線のセット

ここからは、罫線を引く方法をご紹介します。
罫線を引く場合には、セル範囲を指定して行います。
線の種類等は数値となりますが、constで定数を指定しておくとわかりやくなります。
(※冒頭で記載の通り、uses節にExcel2000があればconst宣言は不要です)

const
  // 罫線の種類
  xlContinuous       = 1;      // 実線(細)
  xlDash             = -4115;  // 破線
  xlDashDot          = 4;      // 一点鎖線
  xlDashDotDot       = 5;      // 二点鎖線
  xlDot              = -4118;  // 点線
  xlDouble           = -4119;  // 二重線
  xlSlantDashDot     = 13;     // 斜め斜線
  xlLineStyleNone    = -4142;  // 無し(罫線を消す)

  // 罫線の太さ
  xlHairline         = 1;      // 極細
  xlMedium           = -4138;  // 中
  xlThick            = 4;      // 太
  xlThin             = 2;      // 細

  // 罫線の位置
  xlEdgeLeft         = 7;      // 左端
  xlEdgeTop          = 8;      // 上端
  xlEdgeBottom       = 9;      // 下端
  xlEdgeRight        = 10;     // 右端
  xlInsideVertical   = 11;     // 内側縦線
  xlInsideHorizontal = 12;     // 内側横線
  xlDiagonalDown     = 5;      // 右下がり斜線
  xlDiagonalUp       = 6;      // 右上がり斜線

 

【範囲内のすべてのセルに外枠と中枠の罫線を引く】
セル範囲のBorders.LineStyleにxlContinuousを指定します。
xlContinuousでなくxlLineStyleNone(またはxlNone)を指定すると、
枠線を消すことができます。

  // 罫線を指定
  WSheet.Range['A1','C30'].Borders.LineStyle  := xlContinuous;
  // 罫線を消す
  WSheet.Range['A1','C30'].Borders.LineStyle  := xlNone;

 

【範囲の罫線位置を指定する】
罫線をセル範囲の左右・上下のどの位置に引くかをBordersに指定します。

  // 左端
  WSheet.Range['B2','C3'].Borders[xlEdgeLeft].LineStyle   := xlContinuous;
  // 右端
  WSheet.Range['B2','C3'].Borders[xlEdgeRight].LineStyle  := xlContinuous;
  // 上端
  WSheet.Range['B2','C3'].Borders[xlEdgeTop].LineStyle    := xlContinuous;
  // 下端
  WSheet.Range['B2','C3'].Borders[xlEdgeBottom].LineStyle := xlContinuous;

  // 上記の上下左右の指定は外枠になりますが、
  // xlInsideVertical(垂直)やxlInsideHorizontal(水平)を指定すると
  // 中枠に罫線が引かれます。

 

【斜線】
右下がり(xlDiagonalDown)か右上がり(xlDiagonalUp)かを指定します。
次のコードではセルのA1とB1に×の線が引かれます。

  WSheet.Range['A1','B1'].Borders[xlDiagonalDown].LineStyle := xlContinuous;
  WSheet.Range['A1','B1'].Borders[xlDiagonalUp].LineStyle   := xlContinuous;

 

【罫線の色を指定】
標準(黒)でない色を指定して罫線を引く場合は、Borders.Colorを指定します。
※罫線位置を指定する場合は上記と同様にBordersにパラメータを付与します。
 ただし、右下がりと右上がりはExcel側の仕様で同色になるようです。

  WSheet.Range['A1','B1'].Borders.Color := clRed;
  WSheet.Range['A1','B1'].Borders[xlDiagonalUp].Color := clBlue;

 


セルの背景色設定

ここからは、セルの背景色を指定する方法をご説明します。

【色番号で色を指定する方法】
Interior.ColorIndex
で色番号(ColorIndex)を指定することで背景色を指定できます。
色番号の1は黒、2は白、3は赤など基本色が56色あり、また0は塗りつぶしなしになります。
セル単位からの指定以外にRangeで範囲指定することも可能です。

  WSheet.Cells[1,2].Interior.ColorIndex     := 3;  // 赤
  WSheet.Range['A3'].Interior.ColorIndex    := 4;  // 明るい緑
  WSheet.Range['C1:D5'].Interior.ColorIndex := 5;  // 青
参考:ColorIndexの一覧
  for i := 1 to 8  do
  begin
    for j := 1 to 7 do
    begin
      WSheet.Cells[i, j].Interior.ColorIndex := (i - 1) * 7 + j;
      WSheet.Cells[i, j].Value := (i - 1) * 7 + j;
    end;
  end;

Delphiから次のコードを実行すると、Excelの7列×8行の各セルにColorIndexの番号と
実際の色がセットされますので、こちらでもご確認いただけます。

 

【RGBで色を指定する方法】
ColorIndexで色番号を指定する場合、規定の56色しか指定できません。
ここからは様々な色を指定できるRGBでの指定方法をご説明します。

RGBは赤 (Red)、緑 (Green)、青 (Blue) の3つの色を指定すると、
それを混ぜ合わせた色が表現されます。

値は0~255ですので、幅広い色を指定することができます。(全16,777,216色)

例えば黒は(赤=0,緑=0,青=0)、青は(赤=0,緑=0,青=255)となります。
この場合、コードでは次のようになります。

  WSheet.Cells[1,2].Interior.Color  := RGB(0, 0, 0);    // 黒
  WSheet.Range['A3'].Interior.Color := RGB(0, 0, 255);  // 青

 

色から値を確認するには、Web上にRGB色の一覧などもございますが、
Excelからであれば、「塗りつぶしの色」で「その他の色」を選び、
[ユーザー設定]で色を選択すると、RGBの各値がセットされます。

Excelのバージョンによっては、[ツール|オプション]を選択し、「色」タブからになります。
色に対するR、G、Bの値が表示されますので、RGB関数から指定します。

  WSheet.Range['C1:D5'].Interior.Color := RGB(135, 206, 235);

 


(本記事は、以下の資料をもとに最新情報を含めた再構成をしております。)

  • ミガロ.情報マガジン「MIGARO News!!」
    • Vol.125 2011年4月号より(行の高さや列幅の変更)
    • Vol.126 2011年5月号より(行の高さや列幅の自動調整)
    • Vol.128 2011年7月号より(セルに式を設定する方法+最終行列を利用した式)
    • Vol.130 2011年9月号より(罫線のセット)
    • Vol.133 2011年12月号より(セルの背景色をColorIndexで指定)
    • Vol.134 2012年1月号より(セルの背景色をRGBで指定)