エクセルのマクロを条件付きで起動させるには?

解決


mimi  2004-02-25 23:55:23  No: 7355

かなり初歩的な事かもしれませんが、どうしても分からないので質問させて頂きます。

今回、Delphiにてエクセルのマクロ機能を実行させるコンソールプログラムを考えています。
マクロを有するエクセルファイル(A)と、マクロが無いエクセルファイル(B)を開き、
ファイル(B)の特定のシート(出来れば複数指定したい)にのみ
ファイル(A)の特定のマクロを実行させたいのですが、
現状では、ファイル(B)の先頭のシートにのみマクロが作用してしまっています。

以下は現在のソースです。修正点や実現方法など指摘していただければと思います。
よろしくお願いします。

var
  Excel: Variant;
  WorkBook: Variant;
  WorkSheet: Variant;

begin
  CoInitialize(Nil);          //Com利用開始
  Excel := CreateOleObject('Excel.Application');  //エクセル呼び出し!!!
  Excel.Visible:=True;          //Excelを表示させる

  //エクセルブックオープン(ファイルA:マクロ有り)
  WorkBook :=Excel.WorkBooks.Open(FileName :='C:\ … \Macrocheck.xls' , readOnly := true);
  //エクセルブックオープン(ファイルB:マクロ無し)
  WorkBook :=Excel.WorkBooks.Open(FileName :='C:\ … \work.xls' , readOnly := false);

  //対象エクセルシートセット
  WorkSheet := WorkBook.WorkSheets['対象シート'];

  //エクセル内のマクロコール
  //(ここで、ファイルBの'対象シート'にファイルAの'Make_Sheet'マクロを実行させたいのですが…)
  // (これではファイルBの先頭シートに実行してしまいます。)
  try
    Excel.Run('Macrocheck.xls!Make_Sheet');
  except
  end;

  WorkBook.close (SaveChanges:=true);  //変更を保存してブックファイルを閉じる
  WorkBook:=unAssigned;      //変数開放
  WorkSheet:=unAssigned;    //変数開放
  Excel.Quit;        //アプリケーション終了
  Excel:=unAssigned;      //変数開放
  CoUnInitialize();      //Com利用終了
end.


にしの  2004-02-26 02:49:21  No: 7356

AとBのファイルの開く順序を変えてもダメですか?
もし、順序を変えてうまくいくのであれば、ActiveWorkBookが違うファイルを指しているのだと思います。


mimi  2004-02-26 18:27:08  No: 7357

お返事ありがとうございます。
ファイルを開く順序を変えて試してみましたが、
先にBファイルを開くと、AファイルのマクロをAファイル自身に実行してしまいます。

//対象エクセルシートセット
WorkSheet := WorkBook.WorkSheets['対象シート'];

の部分で、Bファイルの特定シートのみ指定しているつもりなのですが、
これがうまくいってないみたいです。
マクロ実行対象シートの設定には上記コードは使えないのでしょうか?


にしの  2004-02-26 19:37:49  No: 7358

Delphiが見ているシートは、マクロが見ているシートとは無関係です。
なので、このコードは無意味ですね。

Delphiはマクロの起動のみにして、マクロ内でシートを特定してやればよいのでは?
無理なのであれば、WorkBookのActiveSheetを指定して、さらにActiveWorkBookもBファイルのほうにしてやれば動くかもしれません。
# 未確認です


mimi  2004-02-26 21:07:54  No: 7359

//対象エクセルシートセット
WorkSheet := WorkBook.WorkSheets['対象シート'];

ではなく、

Excel.WorkSheets['対象シート'].Activate;

にすることで、マクロ実行対象を指定することが出来ました。
複数のシート指定も、とりあえずその都度ActiveSheetを指定しなおして
マクロ実行を繰り返すことにしました。
こうすると、見かけ上は一度の処理で複数のシートにマクロを実行しているように
見えているので、今回はこれでOKです。

にしのさん、ありがとうございました。


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

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






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