|
簡単な例 |
まずは Excelを起動して指定のセルに文字をセットする簡単なサンプルを作ります。が、よく見ると
Serversパレットにはエクセル関係のコンポーネントがいくつもあります。どれを使うのでしょうか??今回使うコンポーネントはこのうちの
・ TExcelApplication
・ TExcelWorkbook
・ TExcelWorksheet
の3つです。 名前のとおり TExcelApplication は エクセルそのものを意味し、後のふたつはそれぞれ
Workbook 、 Worksheet を意味します。ワークブックはファイルの事で、保存や読み込みの対象となります。ワークシートはブック内のそれぞれのページになります。では、この3つをフォームに配置してください。それから
TEdit と TButton をひとつずつ配置します。Button をクリックされたらエクセルを起動し、セルに Edit
の内容をセットするようにコーディングします。
TExcelApplicationで、エクセルを起動
まずは、TExcelApplicationコンポーネントを使ってプログラムからエクセルを起動します。従来ならば CreateOleObject
を使っていましたが TExcelApplication では Connect
メソッドを使用します。このメソッドでエクセルを起動します。すでに起動している場合はそのインスタンスが使用されます。起動しただけではエクセルは画面上には現れません。さらに
Visibleプロパティでエクセルを画面上に表示します。なお、引数はよく分からなかったので (えへへ)
ゼロを入れています。
■ Connect メソッドの例 |
procedure TForm1.Button1Click(Sender: TObject);
begin
//エクセル起動
ExcelApplication1.Connect;
//エクセル表示
ExcelApplication1.Visible[0] := True;
end;
|
実行してみると見事エクセルが起動するのですが、よく見るとブックが作成されていません。 TExcelApplication
には Workbooksプロパティがあります。ここまで見つけることが出来ればその Workbooksクラスの Addメソッドを見つけるのは容易です。これでワークブックを追加することができます。引数にはテンプレートファイルを指定できますが、必要ないなら
Null を指定します。
■ ブック追加の例 |
procedure TForm1.Button1Click(Sender: TObject);
begin
//エクセル起動
ExcelApplication1.Connect;
//エクセル表示
ExcelApplication1.Visible[0] := True;
//ブック追加
ExcelApplication1.Workbooks.Add(Null, 0);
end;
|
TExcelWorkbook でワークブックを操作
これで実行するとエクセル起動後、ブックが追加されます。次はこの新たに追加されたブックを TExcelWorkbook
に適用してブックを操作できるようにします。よく見るとこの TExcelApplication の Workbooks.Add
メソッドは追加したブックオブジェクトを返します。と、言うことは・・・
//ブック追加 ※これはエラー
ExcelWorkbook1 := ExcelApplication1.Workbooks.Add(Null, 0);
|
こう記述したくなりますが、これだとコンパイルエラーが発生してしまいます。残念ながら Workbooks.Add が返すブックオブジェクトとは型が一致しないようです。では、どうやるのかと言いますと、、、分からないので
Demos の Wordのデモを探ったところ、 ConnectTo メソッドを使うことが判明しました。
■ TExcelWorkbookの ConnectToの例 |
procedure TForm1.Button1Click(Sender: TObject);
begin
//エクセル起動
ExcelApplication1.Connect;
//エクセル表示
ExcelApplication1.Visible[0] := True;
//ブック追加
ExcelWorkbook1.ConnectTo(
ExcelApplication1.Workbooks.Add(Null, 0));
end;
|
これで追加したブックが TExcelWorkbook で操作できるようになります。試しに TExcelWorkbook.Sheets.Add
とすると新しいシートがブックに追加されます。
■ シート追加の例 |
//ブック追加
ExcelWorkbook1.ConnectTo(
ExcelApplication1.Workbooks.Add(Null, 0));
ExcelWorkbook1.Sheets.Add(Null, Null, Null, Null, 0)
|
TExcelWorksheet でワークブックを操作
後はブック内のシートを ExcelWorksheet にセットすれば OK です。シートもブックと同じように Add
する際などに ConnectTo を使えばいいような感じです。
■ TExcelWorksheet の ConnectToの例 |
//ブック追加
ExcelWorkbook1.ConnectTo(
ExcelApplication1.Workbooks.Add(Null, 0));
//シート1を ExcelWorksheetに接続 ※これはエラー
ExcelWorksheet1.ConnectTo(
ExcelWorkbook1.Worksheets['Sheet1']);
|
と、これで良さそうなんですがエラーが発生します。なぜか TExcelWorkbookの Worksheetsプロパティは
_Worksheet 型を返してくれません。同じように Addメソッドも _Worksheet 型を返しません。戻ってくるのは
IDispatch型です。従来の OLEオートメーションでの操作で、 IUnknown型を他の型にキャストして使用したのを覚えていればこれをクリアすることはそう難しくありません。以下のように記述すればいいのです。
■ IDispatchを _Worksheet へキャストする例 |
//シートを ExcelWorksheetに接続
ExcelWorksheet1.ConnectTo(
ExcelWorkbook1.Worksheets['Sheet1'] as _Worksheet);
|
簡単な例、完成!
シートまで取得できれば後は簡単です、目的のセルに値をセットするだけです。セルを指定するには Rangeプロパティを使用します。以下は完全なコードです。
■ エクセルを起動して値をセルに入れる例 |
procedure TForm1.Button1Click(Sender: TObject);
begin
//エクセル起動
ExcelApplication1.Connect;
//エクセル表示
ExcelApplication1.Visible[0] := True;
//ブック追加
ExcelWorkbook1.ConnectTo(
ExcelApplication1.Workbooks.Add(Null, 0));
//シートを ExcelWorksheetに接続
ExcelWorksheet1.ConnectTo(
ExcelWorkbook1.Worksheets['Sheet1'] as _Worksheet);
//A1に文字をセット
ExcelWorksheet1.Range['A1','A1'].Value := Edit1.Text;
end;
|
エクセルが起動し、セルの A1 に Editに入力した文字列が見事セットされました。
Rangeの引数を "A1" , "C5" とすれば A1から C5 まですべてを同じ文字で埋め尽くすことが出来ます。
Range は指定されたセルを選択しません。選択状態にするには Rangeの Select メソッドを使用します。
|