Delphi6では、Excelからの読み込み、Excelへの書き込みができたのですが、
Delphi8では、コンパイルが通りません。
あまりにも初歩的な質問で申し訳ありませんが、
Delphi8でのExcelの起動方法、読み込み、書き込みの例を教えていただけないでしょうか?
その際、Uses節や、typeなどにも記述しなければならないものがあれば全て教えてください。よろしくお願いします。
Delphi8は.NETのフレームワークを使うか、VCLを使うかで処理がわかれます。
どちらをお使いですか?
bobさん
VCLフォームアプリケーションで作成しています。
Delphi6ではCreateOleObject('Excel.Application')で呼び出せたのですが、Delphi8になり、CreateOleObjectが使えないようなので、CreateComObjectという関数を使えばよいのか?、と途方にくれています。
CreateComObjectの引数を'Excel.Application'とすると、
[エラー] Unit1.pas(32): 'Guid' と 'string' には互換性がありません
となってしまいます。
解決方法をご存知でしたら、教えてください。よろしくお願いします。
D8は家にしか無いので、土日に試してみます。
bobさん
ありがとうございます。よろしくお願いいたします。
やっと出来た。めんどくせー^^;
一応意図したとおりに、動きましたが合ってるか不明
環境:D8Pro + Office2003 + XP + .NET Framework 1.1
手順:
1.新規VCLフォームアプリケーションを作成
2.[参照の追加]-[COMインポート]で"Microsoft Excel 11 Object Library"を選択
3.Formにボタンを貼り付け
4.usesにComObjとExcelを追加
5.ボタンのクリックイベントに以下のソースを割り当て
−−−
procedure TForm1.Button1Click(Sender: TObject);
Var
objExcel: Tobject;
objApp: Excel.Application;
objBook: Excel.Workbook;
objSheet: Excel.Worksheet;
begin
objExcel := CreateComObject(ProgIDToClassID('Excel.Application'));
objApp := (objExcel as Excel.Application).Application;
objBook := objApp.Workbooks.Add(system.Type.Missing);
objSheet := objBook.Worksheets.Add(system.Type.Missing, system.Type.Missing,
system.Type.Missing, system.Type.Missing);
objSheet.Cells[TObject(1), TObject(2)] := 'test';
(objApp as Excel.Application).Quit;
objExcel := Unassigned;
objBook := Unassigned;
objSheet := Unassigned;
end;
−−−
P.S.
ソース見ればわかると思いますが、ClassNameからGUIDを取得するにはProgIDToClassIDで出来ます。
でもヘルプには
> CreateComObject は,オブジェクトと情報をやり取りするために使用されるインターフェースへの参照を返します。CreateComObject の場合,このインターフェースは IUnknown 型です。IDispatch 型のインターフェースへの参照を返す OLE オブジェクトを作成するには,CreateOleObject を使用します。
って書いてあるから、CreateOleObjectがあってもいい気がするけどね^^;
参考:
http://www.microsoft.com/japan/msdn/officedev/vsto2003/ExcelObj.asp
bobさん
すごい!
できました。どうもありがとうございます。
度々、すみませんが指定ファイルを開く場合は
どうしたらよいのでしょうか。
応用がきかずにすみません。本当に初心者なのです。
下記のようにすると
objBook:=objApp.WorkBooks.Open(ExtractFilePath(ParamStr(0))+'test.xls');
[エラー] Unit1.pas(34): 指定された引数で呼び出すことのできるオーバーロード関数 'Open' が定義されていません
と怒られてしまいます。
簡単に解決するようでしたら、教えてください。
よろしくお願いいたします。
Openメソッドの第2引数にfalseを指定してもダメですか?
# Delphi8を持っていないので確認できないですが
D8は、2月のカンファレで購入して以来、全然さわってなかったので試行錯誤の連続ですが、まぁ何となくわかってきました。
試していませんが、system.Type.Missingか、にしのさんのアドバイス通りFalseで試してみてください。
P.S.
VB.NETやC#のサンプルなら見つかると思いますが、基本的にVB.NETのサンプルの省略引数はC#ではType.Missingとなっています。
よってDelphiでもType.Missingでコンパイルが通るようです。
bobさん にしのさん
アドバイスありがとうございました。
後ほど、試してみます。
勘でできてしまう、皆様がうらやましいです。
bobさん、にしのさん、どうもありがとうございました。
大変助かりました。
ツイート | ![]() |