我輩はブロガーではない。ネタもまだない

SASとかDelphiあたりの人様の役に立たないネタを提供します

SASからExcelにDDEコマンドを投げる(2)

さて、前回の記事で書いた通り、SASからExcelのDisplayAlertsによる制御が効かなくなっている件について調べてみました。

おさらいですが、稼働環境は以下の通りです。

  • Windows10 Pro 64bit
  • Excel2016 64bit
  • SAS9.4 TS1M5 64b

1番怪しいのはExcelですね。SASのTechnical Supportに問い合わせたところ、Excel2007では上記の上書き時のダイアログが
きちんと制御され、無条件で上書きできるようです。今更2007ってところはおいといて。
(サンプルコードは下部に記載)

なので、Excelバージョンに絞って進めます。運良く過去バージョンがありました。
もしかしたら64bit版というのが問題かもしれないので2016については32bit版も調べます。
(残念ながら過去バージョンについては32bit版しかありませんでした。)

検証に使用したプログラムは以下の通りです。



  • こちらはシートを削除するプログラム
options noxwait noxsync;
%sysexec "C:\temp\test1.xlsm";
data _null_;
  rc=sleep(5);
run;
filename cmds dde 'excel|system';
filename xls dde "excel|[C:\temp\test1.xlsm]Sheet1!R1C1:R1C1" notab;

data _null_;
  file cmds;
  put '[select("R1C1:R1C1")]';
  put '[error(false)]';
  put '[workbook.insert(1)]';
  put '[workbook.delete("Sheet2")]';
  put '[error(true)]';
  put '[close(false)]';
  put '[quit()]';
run;
  • こちらはファイルを既存ファイルに上書きするプログラム
filename xcpy "c:\temp\test1.xlsm";
filename xdel "c:\temp\test2.xlsm";
data _null_;
  rc=fdelete('xdel');
run;
data _null_;
  rc=fcopy('xcpy','xdel');
run;

options noxwait noxsync;
%sysexec "C:\temp\test1.xlsm";
data _null_;
  rc=sleep(10);
run;
filename cmds dde 'excel|system';
filename xls dde "excel|[C:\temp\test1.xlsm]Sheet1!R1C1:R1C1" notab;

data _null_;
  file cmds;
  put '[select("R1C1:R1C1")]';
  put '[error(false)]';
  put '[Save.as("C:\temp\test2.xlsm")]';
  put '[error(true)]';
  put '[quit()]';
run;

結果は…

  1. Excel2010 32bit

いずれもDsiplayAlerts=Falseによってダイアログが抑制された。

  1. Excel2013 32bit

いずれもDsiplayAlerts=Falseによってダイアログが抑制された。

  1. Excel2016 32bit

シートの削除についてはDsiplayAlerts=Falseによってダイアログが抑制されたが、
ファイルの上書きについてはダイアログが表示された。

Excel2010からExcel2013でMDIからSDIへの変更が行われ、それに合わせて
内部仕様がかなり変わった感じがあったので、それが原因かと思っていましたが、
違ったようです。

2013から2016でDDEコマンドの仕様が変わっている可能性が高いので、
DDEを使っているSASプログラムについては注意が必要そうです。
(そもそも環境を固定したいのにOffice365とかいう勝手にバージョンを上げていく
ものを導入するのはど (フガフガ))