Delphi2010 エクセル uses句について


ピーチ  2012-01-11 14:42:40  No: 41440  IP: 192.*.*.*

Delphi2010でExcel.Applicationを使ってプログラムを
組んでいるのですが
下記のところで(EntireColumn.Insert)
『未定義の識別子』とエラーになってしまいます
exeは作成でき、列の挿入も問題無く動作するのですが、
このエラーを何とか消したいのですが
どなたかわかる方、アドバイス願います。
(uses句の宣言を追加すると思うのですが・・・)

                          ↓↓↓↓↓↓↓
ExcelSheet.Cells[5, 1].EntireColumn.Insert;
                          ↑↑↑↑↑↑↑

編集 削除
Nov  2012-01-11 16:51:09  No: 41441  IP: 192.*.*.*

もう気づいているようですが、usesにExcel2000かExcelXPが必要です。

編集 削除
Jan  2012-01-11 17:04:49  No: 41442  IP: 192.*.*.*

usesは関係ありません。
ExcelSheet.Cells[5, 1]が返すのはOleVariantですので、
EntireColumnというのが未定義であることには間違いありません。
しかしCOMにはレイトバインドといって名前でメソッド等を呼び出す機能があり、
コンパイル時には未定義でも、実行時に解決され動作します。
これをコンパイル前に何とかするにはアーリーバインドを使います。
具体的にはExcelSheet.Cells[5, 1]をEntireColumnを持つ適切な型にキャストします。

余談ですが、エラーインサイトは本来エラーではない部分もエラーとして扱うことが多く、
コンパイラの進化に伴っていない古い状態のまま放置されている面があるため、
エラーインサイトの情報はあまり鵜呑みにしないほうがいいと思います。

編集 削除
Nov  2012-01-11 17:37:34  No: 41443  IP: 192.*.*.*

失礼しました。usesにExcelXPがなくても問題無いようです。
エクスプローラオプションに、"未定義の識別子"エラーを消す設定は、無さげですね。

編集 削除
Nov  2012-01-11 17:46:27  No: 41444  IP: 192.*.*.*

ちなみに、Janさんの言うとおり、キャスト(下記)で未定義エラーは消えました。
コードの見やすさをとるか、未定義エラーを無視するか...

OleVariant(WorkSheet.Cells[2, 2]).EntireColumn.Insert;

編集 削除
Mr.XRAY  2012-01-12 13:58:10  No: 41445  IP: 192.*.*.*

こんにちは.

>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型での処理を希望していているのであれば,既にある
レスが参考になると思います.

編集 削除
Mr.XRAY  2012-01-12 14:04:44  No: 41446  IP: 192.*.*.*

個人的には,Excel.Application を使用するのであれば,
Range オブジェクトで扱うのがいいのではないかと思っています.

あくまでも,個人的な考えです.あしからず.

編集 削除
Jan  2012-01-12 15:25:49  No: 41447  IP: 192.*.*.*

>Novさん
私の言ったキャストとは適切な型にキャストするということです。
この場合はExcelRangeにキャストすれば入力補間も効くようになりますし、
アーリーバインドになるため実行速度も速くなります。
ちなみにOleVariant型を任意のCOMインターフェース型に直接キャストはできず、
IUnknown(OleVariant型の変数) as COMインターフェース型
という形を取る必要があります。(公式ヘルプに載っている方法です)

>Mr.XRAYさん
Rangeオブジェクトとして扱った上で未定義というエラーが出る場合、
そもそもコンパイルが通らないと思います。
エラーの箇所も行単位ではなく一部分を指していることから
エラーインサイトによるエラーだということが推測できますし、
今回の場合は未定義エラーが出てもコンパイルと実行は可能ということから、
OleVariantであると判断できると思いますがいかがでしょうか。

編集 削除
Nov  2012-01-12 15:57:53  No: 41448  IP: 192.*.*.*

質問者を差し置いてなんですが、勉強になりました。

編集 削除
Mr.XRAY  2012-01-12 16:09:02  No: 41449  IP: 192.*.*.*

こんにちは.

>今回の場合は未定義エラーが出てもコンパイルと実行は可能ということから、
>OleVariantであると判断できると思いますがいかがでしょうか。

御意 !!
私も書き込みしてから気づきました.

編集 削除