ciliのブログ

差し障りない範囲で思い出の形作りのために既知の脆弱性とか、脆弱性じゃないと強く信じられているものについて語ります。脆弱性と分かってると問題ですからね!

VBAのExcelでDDEの罠

はじめに

前回はExcelでDDEの罠を紹介しましたが、その応用編です。あんまり書くことないのでショートです。

Excel VBAの世界でGO

Excel VBAって書いてますけど、Visual Basicで書いたアプリケーションでも同様です。

警告ダイアログってウザいよね?

Excel VBAを使っていると、警告ダイアログが表示さえるのがウザかったり、選択で「はい」「いいえ」「キャンセル」を選ばれたくない場合があります。

  • Excelで編集したファイルを(表示なしに)上書き保存したい場合
  • Excelでファイルオープン時にマクロ実行を操作させたくない場合

どっちの場合も、Application.DisplayAlertsプロパティをFalseにすると

保存処理の場合

こんな感じですね。これは(多分)安全です。

Application.DisplayAlerts = False

' 保存処理

Application.DisplayAlerts = True

保存処理が終わったらDisplayAlertsをTrueに戻すのはお作法です。

ファイルオープン時の警告抑止

こんなコード、それってマナー違反です!?

Application.DisplayAlerts = False

Workbooks.Open("hoge.xls")

Application.DisplayAlerts = True 

 Workbooks.Openはわりと柔軟で、xlsじゃなくてもCSVやTXTも読み込めます(多分)。参考までにファイルオープンの機能はいくつかあります。

  • Workbooks.Open
  • Workbooks.OpenText
  • QueryTables.Add

サーセン、それぞれの動作までは調べてません。

なんかヤバいの?

ExcelでDDEの罠で紹介した仕様を組み合わせると、怖い動きをします。多分、仕様です。試した感じだと、警告ダイアログをOFFにしてマクロ有効で開きます。マクロ有効?DDEで頓死ですね。Excel側設定でOFFにすることも可能なので、マクロ自動実行されるのは利便性のための仕様です。

なお、Application.DisplayAlertsプロパティは警告メッセージを抑止する機能なので、警告がでないのは仕様通りと思われます。

docs.microsoft.com

どうすればいいんでしょうか?

OpenのときはApplication.DisplayAlerts = Trueにしましょう。SaveAsなんかで真に必要な場合はApplication.DisplayAlerts = Falseして処理してTrueに戻しましょう。

あるいは試してないけど、OpenTextだと大丈夫かもしれません。

魔法の呪文

大人の事情により、詠唱破棄!