Delphi2010 から Excel操作について

解決


ピーチ  2011-02-26 04:51:53  No: 40100

Delphi2010でCreateOleObject('Excel.Application')を使ってエクセル操作
しているのですが、
ExcelSheet.Cells[1, 1]
この命令は通るのですが、
ExcelSheet.Cells[z, i].Value  
すると『未定義の識別子』となります。プログラムは実行できるのですが
警告が出ないようにするにはどうしたらよろしいでしょうか?

あともう一つ質問です。
おそらく最初に質問した内容とかぶるかもしれないですが、
下記の記述でも同じく『未定義の識別子』というエラー
になり、こちらは実行することすらできません。
どなたか分かる方、アドバイス願います。
                          ↓            ↓        ↓
A:=ExcelSheet.Cells.Find(what := 'AB', LookIn:=xlValues).Row;


igy  2011-02-27 05:18:13  No: 40101

>ExcelSheet.Cells[z, i].Value  
>すると『未定義の識別子』となります。プログラムは実行できるのですが

Delphi5、Excel2000で
ws.Cells[y, x].Value := 'foo2';
のようなコードを試したところ、正しく動作しましたが、

ExcelSheetの値は、正しく設定されていますか?


ピーチ  2011-02-28 17:44:14  No: 40102

ExcelSheet.Cells[1, 1]
この記述で値は取得できていますので
ExcelSheetは正しく設定しています。


上海ケルベロス  2011-02-28 22:03:54  No: 40103

ネストの深さが深いことで起こります。
昔のDelphiではそのような症状は出ませんでしたが、Delphi2010では確実に出ますw

ネストの深さを限定することで回避できたと思います。

var
  ACell: Variant;

  ACell := ExcelSheet.Cells[z, i];
  ACell.Value := 'TEST';

とすればエラー出ないと思います。
読みにくくなってしまいますが、エラーを防ぐためには仕方がないと思います。

Find メソッドに関しても、未定義の識別子エラーが出ているのであれば、
同じ理由かもしれませんね。
上記内容は、未検証です。


ピーチ  2011-02-28 23:14:17  No: 40104

ExcelSheet.Cells[z, i].Value  の方は上海ケルベロス さんのアドバイス
通りに、ネストが深すぎたのが原因でした。

Find メソッドに関しては、関係なさそうです・・・。


GABIN  2011-03-01 02:12:13  No: 40105

FindでエラーになるのはxlValuesがdelphi上で定義されていない
定数だからじゃないの?

ExcelVBAで同じような命令文書いてからその行にブレークポイント設定
してから実行して止まったところでxlValuesにカーソルを合わせれば
たぶんxlValuesの数値が見えるだろうからxlValuesをその数値に書き換え
ればいいんじゃないかと。

あるいはuses節にExcel2000を書き加えればいいかもしれない。

まったく試してないけどね。


上海ケルベロス  2011-03-01 02:38:01  No: 40106

GABINさん
ピーチさん
俺もやってみましたが、定数定義の問題だけではないですね。

Excel2000 or ExcelXP を uses に入れてみましたが、
Delphi 2010では無理でした。
定数を const で定義してみましたがそれも無理です。

コンパイルはできるのですけどねw

TExcelWorksheet に Find メソッドがあるので、それを使用するか?
ですかね。
ごめんなさい。俺がお手伝いできるのはここまでのようです。ノシノシ


TS  2011-03-01 03:22:34  No: 40107

ピーチ さんはMr.XRAYさんの下記のページをみて作られたのでしょうが
http://mrxray.on.coocan.jp/Delphi/plSamples/400_Excel_CreateObject.htm

//  文字列の検索
//  現在アクティブなシート内の'AB'を最初だけ検索

私の環境のDelphi2010 Excel2000では問題無く動作します、Excelのバージョンは何ですか。


GABIN  2011-03-01 03:32:45  No: 40108

あれ、定義の問題じゃないのか?と思って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;


上海ケルベロス  2011-03-01 04:25:59  No: 40109

おっ!マジすか?
GABINさんのコードコピペしてみましたけど、
私の環境ではアクセス違反おきますね・・・orz
ピーチさんも同じ状態なんだと思いますが・・・
ちなみに Delphi 2010 + Excel 2010 ではダメなのかな。


GABIN  2011-03-01 05:59:05  No: 40110

Excelは2007からマクロが大きく変わったらしいから
それ以前のExcel用に作られたプログラムは動かない
可能性は高いですね。

しかしこんな単純な処理でもエラーになるほど変わって
いるのだろうか・・・・


ピーチ  2011-03-01 06:36:01  No: 40111

ちなみにエクセルのバージョンはExcel2007です。

みなさんのおっしゃる通り、Excelは2007以降は
Findを動作させることは無理なんでしょうかね。


HOta  2011-03-01 06:41:20  No: 40112

2007以降と2003以前では、かなり変わっていますので調査してください。
MSもこんなに変えないで貰いたい。


ピーチ  2011-03-01 06:49:24  No: 40113

現状、調査が必要ですのでいったんクローズします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加