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;
結果は…
- Excel2010 32bit
いずれもDsiplayAlerts=Falseによってダイアログが抑制された。
- Excel2013 32bit
いずれもDsiplayAlerts=Falseによってダイアログが抑制された。
- Excel2016 32bit
シートの削除についてはDsiplayAlerts=Falseによってダイアログが抑制されたが、
ファイルの上書きについてはダイアログが表示された。
Excel2010からExcel2013でMDIからSDIへの変更が行われ、それに合わせて
内部仕様がかなり変わった感じがあったので、それが原因かと思っていましたが、
違ったようです。
2013から2016でDDEコマンドの仕様が変わっている可能性が高いので、
DDEを使っているSASプログラムについては注意が必要そうです。
(そもそも環境を固定したいのにOffice365とかいう勝手にバージョンを上げていく
ものを導入するのはど (フガフガ))