DelphiでExcelを自在に操作|OLEVariant・CreateOleObjectの実用コード集
DelphiからExcelを操作するには、OLEオートメーションを使ったCreateOleObjectの活用が鍵となります。
このページでは、セルの値設定・罫線描画・印刷設定・保存処理などの実用コードをサンプル形式で紹介します。
OLEVariantの使い方や、PageSetupによる印刷調整など、業務で役立つ細部まで網羅しています。
DelphiからExcelを使用するにはユニットを追加する必要があります。
uses system.win.comobj, ExcelXP;
又は
uses system.win.comobj, Excel2000;
ExcelXPかExcel2000のパッケージがインストールされているかは [コンポーネント]⇒[パッケージのインストール]から
以下のどちらかにチェックが入っているかで確認できます。
- 「Microsoft Office 2000 オートメーション サーバー ラッパー コンポーネント」
- 「Microsoft Office XP オートメーション サーバー ラッパー コンポーネント」
エクセルを作成(起動)するには以下ソースコードで、変数exにエクセルが設定されます。
変数exを使ってエクセルを操作できるようになります。
var ex:olevariant; //「エクセル」アプリケーション
ex:=CreateOleObject('excel.application');
新規ワークブックを作成するには以下で、変数wbに作成したワークブックが設定されます。
var wb:olevariant;
wb:=ex.workbooks.Add;
以下で既存のワークブックを開くことが出来ます。
var wb:olevariant;
wb:=ex.workbooks.open('ファイル名.xlsx');
//ワークブックを追加するか開くと、エクセルを(表示したい場合には)表示させることが出来ます。
ex.visible:=True;
ワークブック内のシート数は以下で取得できます。
wb.worksheets.count;
シートを扱うにはworksheets配列を使います。
1個目のワークシートを変数wsに設定するには以下のソースコードとなります。
添え字が1から始まることに注意してください。
var ws:olevariant;
ws:=wb.worksheets[1];
ワークシートのセルを扱うには以下のソースコードとなります。
添え字が1から始まることに注意してください。
var ws:olevariant; //ワークシート
ws:=wb.worksheets[1];
ws.cells[1,1].value='セルの値を設定'; //セルA1
ワークシートのセル範囲(レンジ)を扱うには以下のソースコードとなります。
var ws:olevariant; //ワークシート
ws:=wb.worksheets[1];
ws.range['A1:B2'].value='セル範囲の値を設定';
1.プロジェクトを作成する
ファイル⇒新規作成⇒Windows VCLアプリケーション -Delphi
から新規アプリを作成します。フォームにボタン1つを配置します。
2.ソースコード
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls ;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses system.win.comobj, ExcelXP;
procedure TForm1.Button1Click(Sender: TObject);
var ex:olevariant; //「エクセル」アプリケーション
wb:olevariant; //ワークブック
ws:olevariant; //ワークシート
SaveFileName:string;
begin
//<注意>
//エクセルは添え字が1から始まります。
//ブック(ex.workbooks[1])、シート(ex.workbooks[1].worksheets[1])、セル[行,列](ex.workbooks[1].worksheets[1].cells[1,1])
//アプリケーション エクセルを作成
ex:=CreateOleObject('excel.application');
//新規ワークブックを作成する
wb:=ex.workbooks.Add;
//エクセルを表示する
ex.visible:=True;
//ブック内のシートを削除して1シートのみにする
while wb.worksheets.count>1 do
wb.worksheets[wb.worksheets.count].delete;
//1つ目のシートを変数に代入
ws:=wb.worksheets[1];
//セルB2の値に2を設定する
ws.range['B2'].value:=2;
//セルC2の値に4を設定する
ws.cells[2,3].value:=4;
//セルD2に式 B2*C2 を設定する
ws.cells[2,4].value:='=B2*C2';
//セル範囲の左の罫線を設定
ws.range['B2:D4'].Borders[xlEdgeLeft].Weight := xlThick;
//セル範囲の上部の罫線を設定
ws.range['B2:D4'].Borders[xlEdgeTop].LineStyle := xlDashDotDot;
ws.range['B2:D4'].Borders[xlEdgeTop].Color:=$0000FF;//赤色
ws.range['B2:D4'].Borders[xlEdgeTop].Weight:=xlThin;
//セル範囲の右の罫線を設定
ws.range['B2:D4'].Borders[xlEdgeRight].LineStyle:=LongInt(xlDashDot);
ws.range['B2:D4'].Borders[xlEdgeRight].Color:=$00FF00;//緑色
ws.range['B2:D4'].Borders[xlEdgeRight].Weight:=xlThin;
//セル範囲の下の罫線を設定
ws.range['B2:D4'].Borders[xlEdgeBottom].LineStyle:=xlContinuous;
ws.range['B2:D4'].Borders[xlEdgeBottom].Color:=$FF0000;//青色
ws.range['B2:D4'].Borders[xlEdgeBottom].Weight:=LongInt(xlMedium);
//セル範囲の内側縦罫線を設定
ws.range['B2:D4'].Borders[xlInsideVertical].LineStyle:=xlContinuous;
ws.range['B2:D4'].Borders[xlInsideVertical].Color:=$000000;
ws.range['B2:D4'].Borders[xlInsideVertical].Weight:=xlHairline;
//セル範囲の内側横罫線を設定
ws.range['B2:D4'].Borders[xlInsideHorizontal].LineStyle:=xlContinuous;
ws.range['B2:D4'].Borders[xlInsideHorizontal].Color:=$777777;
ws.range['B2:D4'].Borders[xlInsideHorizontal].Weight:=xlThin;
//セルの書式設定を"文字"に設定する
ws.range['B4:D4'].NumberFormatLocal:='@';
//式を入れても、書式が文字なので計算しない
ws.cells[4,2].value:='=B2+C2';
//文字を横方向中央揃えに設定する
ws.cells[4,2].HorizontalAlignment := LongInt(xlCenter);
//文字を上下方向中央揃えに設定する
ws.cells[4,2].VerticalAlignment := LongInt(xlCenter);
//B~C列目の幅を24("0"の文字が24個の幅)に設定する
ws.columns['B:C'].ColumnWidth:=24;
//4行目の高さを27ポイントに設定する
ws.rows['4:4'].RowHeight:=27;
//セルC3の書式設定を日付[年/月/日 時:分:秒(曜日)]に設定する
ws.Range['C3:C3'].NumberFormatLocal:='yyyy/mm/dd hh:mm:ss(aaa)';
//セルC3に値を設定する
ws.Range['C3:C3'].value:='2022/1/1 22:22:14';
//セルC3:D4を結合する
ws.range['C3:D4'].merge;
//以下もセルC3:D4を結合するのと同じ
//ws.range[ws.cells[3,3],ws.cells[4,4]].merge;
//2行目~4行目をクリップボードにコピー
ws.rows['2:4'].copy;
//セルA6を選択
ws.cells[6,1].select;
//クリップボードから貼り付け
ws.paste;
//セルA12を選択
ws.cells[12,1].select;
//クリップボードから貼り付け
ws.paste;
//クリップボードを空にする
ex.CutCopyMode:=False;
//セルA1を選択
ws.cells[1,1].select;
//シートの用紙サイズをA4に設定
ws.PageSetup.PaperSize:=xlPaperA4;
//シートの用紙方向設定(xlLandscape:横向き xlPortrait:縦向き)
ws.PageSetup.Orientation:=xlLandscape;
//シートの印刷倍率を80%に設定する場合
//ws.PageSetup.Zoom:=80;
//シートの印刷倍率を横幅に合わせる場合
ws.PageSetup.Zoom:=False;
ws.PageSetup.FitToPagesWide:=1;
ws.PageSetup.FitToPagesTall:=False;
//シートの左マージンを20mmに設定する
ws.PageSetup.LeftMargin:= trunc(20*72/25.4);
//シートの右マージンを10mmに設定する
ws.PageSetup.RightMargin:= trunc(10*72/25.4);
//シートの上マージンを10mmに設定する
ws.PageSetup.TopMargin:= trunc(10*72/25.4);
//シートの下マージンを20mmに設定する
ws.PageSetup.BottomMargin:= trunc(20*72/25.4);
//ファイル保存時に上書きしますか?の警告を出さないようにする
ex.DisplayAlerts:=false;
SaveFileName:=ExtractFilePath(Application.ExeName)+'a.xlsx';
//ブックを保存
wb.saveas(SaveFileName);
ex.DisplayAlerts:=true;
//エクセルを終了する
ex.quit;
end;
end.
