Delphi2010でExcel.Applicationを使ってプログラムを
組んでいるのですが
下記のところで(EntireColumn.Insert)
『未定義の識別子』とエラーになってしまいます
exeは作成でき、列の挿入も問題無く動作するのですが、
このエラーを何とか消したいのですが
どなたかわかる方、アドバイス願います。
(uses句の宣言を追加すると思うのですが・・・)
↓↓↓↓↓↓↓
ExcelSheet.Cells[5, 1].EntireColumn.Insert;
↑↑↑↑↑↑↑
もう気づいているようですが、usesにExcel2000かExcelXPが必要です。
編集 削除usesは関係ありません。
ExcelSheet.Cells[5, 1]が返すのはOleVariantですので、
EntireColumnというのが未定義であることには間違いありません。
しかしCOMにはレイトバインドといって名前でメソッド等を呼び出す機能があり、
コンパイル時には未定義でも、実行時に解決され動作します。
これをコンパイル前に何とかするにはアーリーバインドを使います。
具体的にはExcelSheet.Cells[5, 1]をEntireColumnを持つ適切な型にキャストします。
余談ですが、エラーインサイトは本来エラーではない部分もエラーとして扱うことが多く、
コンパイラの進化に伴っていない古い状態のまま放置されている面があるため、
エラーインサイトの情報はあまり鵜呑みにしないほうがいいと思います。
失礼しました。usesにExcelXPがなくても問題無いようです。
エクスプローラオプションに、"未定義の識別子"エラーを消す設定は、無さげですね。
ちなみに、Janさんの言うとおり、キャスト(下記)で未定義エラーは消えました。
コードの見やすさをとるか、未定義エラーを無視するか...
OleVariant(WorkSheet.Cells[2, 2]).EntireColumn.Insert;
こんにちは.
>Delphi2010でExcel.Applicationを使ってプログラムを
ということですが.
ExcelSheet.Cells[5, 1].EntireColumn.Insert;
の,ExcelSheet.Cells[5, 1]が返すのはOleVariant型とは限りません.
Delphi付属のExcel関係のコンポーネントで扱う場合は,Rangeオブジェクトとしても
扱えます.
質問された方のコードだけでは,これを,OleVariant型で扱っているのか,Rangeオブジェクト
として扱っているのかは判断できないと思いますが.どうでしょう.
ちなみに,EntireColumn.Insertメソッドは,ExcelXXX.pas で定義されています.
XXXの部分は,TExcelApplictationのバージョンによって違います.
これも,質問文からは判断できません.
また,Rangeオブジェクトの型も,エクセルのバージョンによって異なります.
つまり,質問された方のコードには省略された部分があるのではないかと言うことです.
(十分省略されていますが...)
もし,質問された方がOleVariant型での処理を希望していているのであれば,既にある
レスが参考になると思います.
個人的には,Excel.Application を使用するのであれば,
Range オブジェクトで扱うのがいいのではないかと思っています.
あくまでも,個人的な考えです.あしからず.
>Novさん
私の言ったキャストとは適切な型にキャストするということです。
この場合はExcelRangeにキャストすれば入力補間も効くようになりますし、
アーリーバインドになるため実行速度も速くなります。
ちなみにOleVariant型を任意のCOMインターフェース型に直接キャストはできず、
IUnknown(OleVariant型の変数) as COMインターフェース型
という形を取る必要があります。(公式ヘルプに載っている方法です)
>Mr.XRAYさん
Rangeオブジェクトとして扱った上で未定義というエラーが出る場合、
そもそもコンパイルが通らないと思います。
エラーの箇所も行単位ではなく一部分を指していることから
エラーインサイトによるエラーだということが推測できますし、
今回の場合は未定義エラーが出てもコンパイルと実行は可能ということから、
OleVariantであると判断できると思いますがいかがでしょうか。
質問者を差し置いてなんですが、勉強になりました。
編集 削除こんにちは.
>今回の場合は未定義エラーが出てもコンパイルと実行は可能ということから、
>OleVariantであると判断できると思いますがいかがでしょうか。
御意 !!
私も書き込みしてから気づきました.