Delphi2010でCreateOleObject('Excel.Application')を使ってエクセル操作
しているのですが、
ExcelSheet.Cells[1, 1]
この命令は通るのですが、
ExcelSheet.Cells[z, i].Value
すると『未定義の識別子』となります。プログラムは実行できるのですが
警告が出ないようにするにはどうしたらよろしいでしょうか?
あともう一つ質問です。
おそらく最初に質問した内容とかぶるかもしれないですが、
下記の記述でも同じく『未定義の識別子』というエラー
になり、こちらは実行することすらできません。
どなたか分かる方、アドバイス願います。
↓ ↓ ↓
A:=ExcelSheet.Cells.Find(what := 'AB', LookIn:=xlValues).Row;
>ExcelSheet.Cells[z, i].Value
>すると『未定義の識別子』となります。プログラムは実行できるのですが
Delphi5、Excel2000で
ws.Cells[y, x].Value := 'foo2';
のようなコードを試したところ、正しく動作しましたが、
ExcelSheetの値は、正しく設定されていますか?
ExcelSheet.Cells[1, 1]
この記述で値は取得できていますので
ExcelSheetは正しく設定しています。
ネストの深さが深いことで起こります。
昔のDelphiではそのような症状は出ませんでしたが、Delphi2010では確実に出ますw
ネストの深さを限定することで回避できたと思います。
var
ACell: Variant;
ACell := ExcelSheet.Cells[z, i];
ACell.Value := 'TEST';
とすればエラー出ないと思います。
読みにくくなってしまいますが、エラーを防ぐためには仕方がないと思います。
Find メソッドに関しても、未定義の識別子エラーが出ているのであれば、
同じ理由かもしれませんね。
上記内容は、未検証です。
ExcelSheet.Cells[z, i].Value の方は上海ケルベロス さんのアドバイス
通りに、ネストが深すぎたのが原因でした。
Find メソッドに関しては、関係なさそうです・・・。
FindでエラーになるのはxlValuesがdelphi上で定義されていない
定数だからじゃないの?
ExcelVBAで同じような命令文書いてからその行にブレークポイント設定
してから実行して止まったところでxlValuesにカーソルを合わせれば
たぶんxlValuesの数値が見えるだろうからxlValuesをその数値に書き換え
ればいいんじゃないかと。
あるいはuses節にExcel2000を書き加えればいいかもしれない。
まったく試してないけどね。
GABINさん
ピーチさん
俺もやってみましたが、定数定義の問題だけではないですね。
Excel2000 or ExcelXP を uses に入れてみましたが、
Delphi 2010では無理でした。
定数を const で定義してみましたがそれも無理です。
コンパイルはできるのですけどねw
TExcelWorksheet に Find メソッドがあるので、それを使用するか?
ですかね。
ごめんなさい。俺がお手伝いできるのはここまでのようです。ノシノシ
ピーチ さんはMr.XRAYさんの下記のページをみて作られたのでしょうが
http://mrxray.on.coocan.jp/Delphi/plSamples/400_Excel_CreateObject.htm
// 文字列の検索
// 現在アクティブなシート内の'AB'を最初だけ検索
私の環境のDelphi2010 Excel2000では問題無く動作します、Excelのバージョンは何ですか。
あれ、定義の問題じゃないのか?と思ってDelphi2009+Excel2000の環境で
手抜きプログラムを作って試してみたけど正常に動いたよ。
uses Variants, ComObj;
procedure TForm1.Button1Click(Sender: TObject);
const
xlValues = -4163;
var
Excel : Variant;
Sheet : Variant;
Row : integer;
begin
try
try
//起動中のExcelを探してそいつのアクティブシートにアクセス
Excel := GetActiveOleObject('Excel.Application');
Sheet := Excel.ActiveWorkbook.ActiveSheet;
except
exit;
end;
Row := Sheet.Cells.Find( what:='AB', LookIn:=xlValues ).Row;
Caption := IntToStr(Row);
finally
Sheet := unAssigned;
Excel := unAssigned;
end;
end;
おっ!マジすか?
GABINさんのコードコピペしてみましたけど、
私の環境ではアクセス違反おきますね・・・orz
ピーチさんも同じ状態なんだと思いますが・・・
ちなみに Delphi 2010 + Excel 2010 ではダメなのかな。
Excelは2007からマクロが大きく変わったらしいから
それ以前のExcel用に作られたプログラムは動かない
可能性は高いですね。
しかしこんな単純な処理でもエラーになるほど変わって
いるのだろうか・・・・
ちなみにエクセルのバージョンはExcel2007です。
みなさんのおっしゃる通り、Excelは2007以降は
Findを動作させることは無理なんでしょうかね。
2007以降と2003以前では、かなり変わっていますので調査してください。
MSもこんなに変えないで貰いたい。
現状、調査が必要ですのでいったんクローズします。
ツイート | ![]() |