かなり初歩的な事かもしれませんが、どうしても分からないので質問させて頂きます。
今回、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.
AとBのファイルの開く順序を変えてもダメですか?
もし、順序を変えてうまくいくのであれば、ActiveWorkBookが違うファイルを指しているのだと思います。
お返事ありがとうございます。
ファイルを開く順序を変えて試してみましたが、
先にBファイルを開くと、AファイルのマクロをAファイル自身に実行してしまいます。
//対象エクセルシートセット
WorkSheet := WorkBook.WorkSheets['対象シート'];
の部分で、Bファイルの特定シートのみ指定しているつもりなのですが、
これがうまくいってないみたいです。
マクロ実行対象シートの設定には上記コードは使えないのでしょうか?
Delphiが見ているシートは、マクロが見ているシートとは無関係です。
なので、このコードは無意味ですね。
Delphiはマクロの起動のみにして、マクロ内でシートを特定してやればよいのでは?
無理なのであれば、WorkBookのActiveSheetを指定して、さらにActiveWorkBookもBファイルのほうにしてやれば動くかもしれません。
# 未確認です
//対象エクセルシートセット
WorkSheet := WorkBook.WorkSheets['対象シート'];
ではなく、
Excel.WorkSheets['対象シート'].Activate;
にすることで、マクロ実行対象を指定することが出来ました。
複数のシート指定も、とりあえずその都度ActiveSheetを指定しなおして
マクロ実行を繰り返すことにしました。
こうすると、見かけ上は一度の処理で複数のシートにマクロを実行しているように
見えているので、今回はこれでOKです。
にしのさん、ありがとうございました。
ツイート | ![]() |