プチIT化

VBAでDisplayAlertsを設定してもメッセージが出るのはなぜ?

こんにちは、わたあめです。VBAでファイルを開くと(Workbook.Open)、以下のエラーメッセージが出ました。

「このブックには、安全ではない可能性のある外部ソースへのリンクが 1 つ以上含まれています。」という警告メッセージです。処理中をメッセージを非表示にする"Application.DisplayAlerts = False"もマクロに入れていたのにも関わらずです。

わたあめ
わたあめ
マクロ処理中にこのメッセージが出て、処理が止まっちゃう!

折角マクロで自動化したのに、処理がストップしてしまうと、自動化の醍醐味がなくなってしまいますよね。ということで、今回はこの原因を深堀してみました。それでは、いってみましょう!

原因

Application.DisplayAlertsは、すべてのメッセージが非表示になるわけではないからです。重大なメッセージなどは非表示にならず、表示されるようです。今回のエラーは、Application.DisplayAlertsが効かない=非表示対象にならないメッセージのようでした。

Application.DisplayAlertsとは

そもそも、Application.DisplayAlertsとは何なのかですが、Excel操作中に出てくる確認メッセージを非表示にするというものです。わたあめがよく出会う確認メッセージは、以下です。

  • 保存していないExcelファイルを閉じようとすると「Book.xlsxへの変更を保存しますか?」と聞かれる(SaveAsメソッド)
  • シートを削除しようとすると「このシートは完全に削除されます。続けますか?」と聞かれる(Deleteメソッド)

マクロ処理中に上記のようなメッセージを表示させたくない時に(処理止まっちゃいますからね)、「Application.DisplayAlerts = False」と設定することで表示されなくなるというものです。

対処

対処方法としては、表示される確認・警告メッセージが出ないように、あらかじめVBA側でエラーを想定して処理を指定しておくことです。

わたあめ
わたあめ
どういうこと…?

分かりにくいと思うので、冒頭のエラーを例に具体的に説明していきたいと思います。

具体例

冒頭のエラーは、開こうとしているエクセルファイルの中に何かしらのリンクが設定してあって、「リンクあるけど開いても良いよね?リンクは更新して開く?それとも更新せずに開く?」という確認でした。ファイルを開くと、このメッセージが出ると想定できるので、あらかじめファイル内のリンクを更新して開くか、更新せずに開くかマクロの中で指定しておきます。

通常のファイルを開くマクロは以下です。

Workbooks.Open FileName:="C:\Book1.xls"

Openメソッドにはオプションを付けることができます。この基本のVBAの文に、更新するorしないの引数を付けておきます。

更新しない場合は以下の文になります。厳密に言うとUpdateLinksの値が0の場合は外部参照のリンクを更新しない、リモート参照のリンクを更新しないという設定です。

Workbooks.Open FileName:="C:\Book1.xls", UpdateLinks:=0

更新する場合は、以下の文になります。厳密に言うとUpdateLinksの値が3の場合は外部参照を更新する、リモート参照のリンクを更新するという設定です。

Workbooks.Open FileName:="C:\Book1.xls", UpdateLinks:=3

ちなみに、各値の設定値は調べれば出てきますが、設定値0~3によって、以下のような動作になります。

外部参照リモート参照
0リンク更新なしリンク更新なし
1リンク更新ありリンク更新なし
2リンク更新なしリンク更新あり
3リンク更新ありリンク更新あり

というように、あらかじめリンクを更新するか否かをマクロ側で指定しておくことによって、このメッセージは出なくなるという訳です。

調べ方

わたあめ
わたあめ
でも、どうやって調べればいいの?!

事前に想定してメッセージを出さないようにって言われても…と思ったりしますよね。わたあめは、マクロ処理中に表示されたくないメッセージが出てから、その対処をマクロ側に処理を加えてます。

調べ方としては、表示したくないメッセージが出てきたら、「メッセージ文+VBA+表示させない」というキーワードで検索します。

今回の例でいくと「このブックには、安全ではない可能性のある外部ソースへのリンクが 1 つ以上含まれています。 VBA 表示させない」みたいなキーワードでググるという事です。

わたあめ
わたあめ
そうすることで、実装したいメソッドの引数に辿り着けたりしますよ!

さいごに

いかがだったでしょうか。非表示にしたいメッセージがApplication.DisplayAlertsが効かずに表示されてしまう!という方のお役に少しでも立てれば幸いです。それでは、また!

flier(フライヤー)