思いもよらずはまったので、自分メモとして保存。
DelphiからExcelを操作する方法としては、
- Excelのタイプライブラリーをインポート
- dbGoを使用する
- サードパーティのコンポーネントを使用する
- ・・・
今回は、1.タイプタイプライブラリーをインポートしてExcelを操作しシート名を一覧表示する
処理をつかった。
以下、ソース
- 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;
- ListBox1: TListBox;
- procedure Button1Click(Sender: TObject);
- private
- { Private 宣言 }
- public
- { Public 宣言 }
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.dfm}
- uses Excel_TLB,System.Win.ComObj;
- const
- LCID = LOCALE_SYSTEM_DEFAULT;
- procedure TForm1.Button1Click(Sender: TObject);
- Var
- ExcelApp : Excel_TLB.ExcelApplication;
- ExcelBook : Excel_TLB.ExcelWorkbook;
- ExcelSheet : Excel_TLB.ExcelWorksheet;
- BookPath : String;
- i : integer;
- begin
- ListBox1.Clear;
- ExcelApp := CreateComObject(CLASS_ExcelApplication) as ExcelApplication;
- ExcelApp.DisplayAlerts[LCID] := false;
- BookPath := IncludeTrailingPathDelimiter(ExtractFileDir(Application.ExeName)) + 'Test.xlsx';
- ExcelBook := ExcelApp.Workbooks.Add(BookPath, LCID);
- (* このように書きたいが
- 'GetEnumerator' のメンバが含まれていないかアクセスできないため)
- 通常では使用不可
- for ExcelSheet in ExcelBook.Worksheets do
- begin
- ListBox1.Items.Add(ExcelSheet.Name);
- end;
- *)
- // Excelのコレクションは1基数なので1からカウントを始める。
- for i := 1 to ExcelBook.Worksheets.Count do
- begin
- ExcelSheet := ExcelBook.Worksheets.Item[i] As Excel_TLB.ExcelWorksheet;
- ListBox1.Items.Add(ExcelSheet.Name);
- end;
- ExcelSheet := nil;
- ExcelBook.Close(false,BookPath,false,LCID);
- ExcelBook := nil;
- if Assigned(ExcelApp) then
- begin
- ExcelApp.Quit;
- ExcelApp := nil;
- end;
- end;
- end.
E2431 for-in ステートメントはコレクション型 'Sheets' で動作できません('Sheets' に 'GetEnumerator' のメンバが含まれていないかアクセスできないため)
のメッセージが、出てEXEが作れないため、従来のfor文で列挙している。
Excelのコレクションが1基数なので、for 文は、1からシート数まででにしていのが
ポイントです。(ポイントというもののものではありませんが・・・)
まあ、Excelに限らず、Win32版のVisual Basic(VB6,VB5)とか、VBAのコレクションInterface
は基本1基数なのですが・・・
下図のようなブックに対して
上のような処理を実行すると
のような結果がえられます。
以下は、余談ですが、
自分 、Excelのコレクションが1基数だということをすっかり忘れていて、結果、午前中つぶしちゃいました。
0 件のコメント:
コメントを投稿