🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の DisplayAlerts — 無人マクロの確認ダイアログを止める(そして危険な操作ほど勝手に承認してしまう理由)

|

Excel VBA の DisplayAlerts — 無人マクロの確認ダイアログを止める(そして危険な操作ほど勝手に承認してしまう理由)

TL;DRApplication.DisplayAlerts = False は、マクロの実行中は Excel に確認・警告 ダイアログを表示させないよう指示します。だからマクロは、人に「OK」をクリックしてもらうために 止まることなく、シートを削除したりファイルに上書き保存したりできます。落とし穴は、これが質問を 取り消すのではなく、Excel の既定の応答で答えてしまう点で、破壊的なプロンプトではその既定が 「実行する」だということです。危険な行が終わった瞬間に切り戻し、さらにエラーハンドラーの中で復元 して、クラッシュがアラートを切ったまま後続のプロンプトを勝手に答えさせないようにしましょう。

Sub DeleteSheetQuietly()
    Application.DisplayAlerts = False        ' Excel は確認ダイアログを出さなくなる
    On Error GoTo CleanExit                   ' エラーでもアラートを切ったまま放置しない
    ThisWorkbook.Worksheets("Temp").Delete    ' プロンプトなし - Excel はそのまま削除する
CleanExit:
    Application.DisplayAlerts = True          ' 警告をすぐに元へ戻す
End Sub

シートの削除、既存ファイルへの上書き保存、未保存の変更を残したままのクローズ — いくつかの危険な 操作の手前で、Excel は立ち止まってダイアログを出し、人間が本当にそれを意図したのかを確かめます。 それは、あちこちクリックしている人にとってはまさに正しい挙動で、そして最初から最後まで自力で走り 切るはずのマクロにとってはまさに間違った挙動です。DisplayAlerts = False はその割り込みを取り除き ます。本記事は 1 つの考えを軸にしています — DisplayAlerts は警告を黙らせるのではなく、Excel の 既定であなたの代わりに答えてしまう。そして破壊的なプロンプトでは、その既定は「はい」だ。 そう 捉えた瞬間、これがどこに属すのか(あなたが把握し理解している特定のプロンプト)、どこで暴発する拳銃 になるのか(監査していないマクロ全体を覆うこと)が分かります。

この記事で学べること

  • 考え方の軸 — Excel は危険な操作の前に訊く。このスイッチは既定で答える
  • 既定の答えが「はい、壊せ」になる場面 — 静かに危険へ変わるプロンプトたち
  • 最も大事なルール — 必要な一行だけに窓を狭め、そして戻す
  • DisplayAlerts = Falseエラー処理ではない理由 — 実行時エラーはやはりマクロを止める
  • ScreenUpdatingCalculationEnableEvents との違い
  • 本当にダイアログが欲しい場面 — そのときは代わりに MsgBox を使う

考え方の軸:Excel は訊き、このスイッチは既定で答える

Excel の一部の操作は「本当によろしいですか」という節目として扱われます。ワークシートを削除すれば、 Excel はそれが元に戻せないと警告します。すでに存在するファイル名へ SaveAs すれば、上書きの前に 訊いてきます。未保存の編集があるブックを閉じれば、保存を促してきます。これらはどれもモーダル ダイアログを出し、クリックを待ちます

Application.DisplayAlerts = False は、そのダイアログを飛ばして既定のボタン — ボックスが現れた ときにあらかじめ強調されているもの — で進むよう Excel に指示します。ボックスを隠して一時停止して いるのではなく、答えを選んで先へ進んでいるのです。この区別が本記事のすべてです。うるさい問いかけを ミュートしているのではなく、決定を事前承認しているのです — そして削除や上書きに対する Excel の 既定は「実行する」です。

Application.DisplayAlerts = False   ' Excel は訊くのをやめ、既定の答えを使う
' ... 危険な操作がダイアログなしで走る ...
Application.DisplayAlerts = True    ' 問いかけが再開する

既定の答えが「はい、壊せ」になる場面

ここは「警告メッセージを消す」チュートリアルが飛ばすところです。抑止された既定が実際に何をするのか を並べます。

操作 抑止したダイアログ DisplayAlerts = False の挙動
Worksheets("X").Delete 「このシートは完全に削除されます」 確認なしで削除する
既存ファイルへの SaveAs 「ファイルは既に存在します。置き換えますか」 古いファイルを上書きする
未保存の変更がある Close 「変更を保存しますか」 既定を使う(編集を破棄しうる)
空でないセルへの貼り付け 「内容を上書きしますか」 上書きする

どれも、警告があなたを守るために存在していた場面です。そしてそれを切っても操作が安全になるわけでは なく — ただ静かになるだけです。人間ならボックスを読み、「いいえ」と言う機会がありました。あなたの マクロはそのすべてに、即座に、記録も残さず「はい」と答えます。

最も大事なルール:窓を狭め、そして戻す

あなたは Excel の既定を事前承認しているので、危険度はアラートが切れている時間の長さと、その 窓の間にどれだけの処理が走るかに比例します。この規律は、マクロ全体を包む性能スイッチとは正反対 です。DisplayAlerts では、それを必要とするたった一つの操作だけを包みます。

' 良い例 - 窓は一行分の幅
Application.DisplayAlerts = False
ThisWorkbook.Worksheets("Temp").Delete
Application.DisplayAlerts = True
' ... マクロの残りは警告が戻った状態で走る ...
' 危うい例 - マクロ全体でアラートが切れている
Application.DisplayAlerts = False
' ... 200 行、そのどれかが上書きや削除のプロンプトに当たるかもしれない ...
Application.DisplayAlerts = True

危うい例では、そのブロック内のどれか一行が、あなたが想定していなかった「このファイルに上書き しますか」「この範囲を消しますか」というプロンプトを出したら、それはあなたが気づく前に「はい」と 答えられてしまいます。窓を狭く保ち、そのうえで On Error GoTo CleanExit で守って、危険な行そのもの がエラーになったときにアラートを切ったまま残し、マクロ内の次のプロンプトが勝手に承認される、 ということが起きないようにしましょう。復元は、このクラスター全体が共有するのと同じ CleanExit ラベルの心得に属します — VBA On Error を参照してください。

自動で戻る — けれどそれに寄りかからない

CalculationEnableEvents が、あなたか 再起動が戻すまで切れたままなのとは違い、DisplayAlertsマクロが終わって制御が Excel に戻った ときに、自動で True にリセットされます。 それなら復元の行は省いてもよさそうに聞こえます。そう ではありません。理由は 2 つです。

  1. 損害はもう起きている。 自動リセットはマクロが終わったあとに起こります。40 行目でシートが 静かに削除されていたら、200 行目でアラートを戻しても元には戻りません。
  2. 肝心なのは窓であって、終わりではない。 「切る」から「制御が Excel に戻る」までの間、あらゆる プロンプトが自動で答えられます。マクロ途中のエラーがあなたの復元を飛ばせば、その呼び出しで次に 走るものに対してアラートは切れたままです。明示的に復元すれば、窓はあなたが意図したとおりの幅に 保たれます。

ですから自動リセットは、セッションのための安全網として扱い、その行を省く理由にはしないでください。 それを切る必要があった操作の直後に、自分で戻しましょう。

これがエラー処理ではない理由

よくある取り違え:DisplayAlerts = False を設定して、まるであらゆる割り込みを抑止したかのように、 マクロが実行時エラーを押し切って進むことを期待する人がいます。そうはなりません。これが抑止する のは Excel の確認・警告ダイアログです。本物の実行時エラー(不正な範囲による 1004、型の不一致、 ファイルが見つからない)は依然として発生し、依然としてあなたのマクロを冷たく止めます。

Application.DisplayAlerts = False
Workbooks.Open "C:\does-not-exist.xlsx"   ' やはり実行時エラー 1004 - アラート抑止では防げない

マクロにエラーを生き延びてほしいなら、それは On Error の仕事であって、 こちらの仕事ではありません。DisplayAlerts は Excel が訊くかどうかを決め、On Error は何かが 壊れたときに何が起こるかを決めます。別々の問題、別々の道具です。

DisplayAlerts と、よく隣に並べられるスイッチ

DisplayAlerts = False は、マクロの冒頭で ScreenUpdatingCalculation の隣に置かれているのを 見かけます。そしてそれらをまとめて「速くするために設定する定型句」に分類してしまいがちです。これらは 同じ種類のものではありません。

  • ScreenUpdating見た目の話 — 最悪でも、再起動で直るフリーズ したように見えるウィンドウどまりです。
  • Calculation数字の正しさの話 — 切ったまま残すと古い値が 表示されます。
  • EnableEventsイベントの正しさの話 — 切ったまま残すと、ブックの ハンドラーが発火しなくなります。
  • DisplayAlerts決定の話 — Excel に、訊かずに破壊的な操作を実行させます。

そしてこれは、たいてい自己修正されるのに、窓の内側で取り返しのつかない損害を起こしうる唯一の スイッチです。他のものは派手に失敗する(フリーズした画面)か、静かに、しかし回復可能な形で失敗します (再計算で古い数字は直る)。アラートを切って削除されたシートは、ただ消えたきりです。

ExcelMaster の活用

DisplayAlerts は一行ですが、うまく使うということは、窓をそれを必要とするたった一つの操作にまで 絞り、エラーハンドラーの中で戻し、そしてエラー処理やマクロ全体を黙らせるスイッチと決して混同しない ことを意味します。多くの人がマクロの冒頭に貼り付けるプロパティにしては、ずいぶんな判断量です。

ExcelMaster は、既定で 慎重なほうを書きます。「確認ポップアップなしで一時シートを削除して」と頼めば、まさにその削除の周り だけアラートを切り、CleanExit ハンドラーの中で戻し、マクロの残りは警告を効かせたままにします — だから Excel が出したはずのあらゆるプロンプトを静かに事前承認することなく、無人での実行が手に 入ります。

よくある質問

VBA の Application.DisplayAlerts = False は何をしますか?

マクロの実行中、Excel に確認・警告ダイアログを表示させず、代わりに各ダイアログの既定の答えで 進むよう指示します。通常なら訊いてくる操作 — シートの削除、SaveAs でのファイル上書き、未保存の ままのクローズ — が、プロンプトなしで起こります。実行時エラーを隠すわけではなく、隠すのは Excel 組み込みのアラートだけです。

DisplayAlerts を True に戻す必要はありますか?

Excel はマクロが終わると自動で True にリセットするので、セッションをまたいで切ったまま残ることは ありません。それでも、それを切る必要があった操作の直後に、明示的に戻すべきです。切れている間に 出るあらゆるプロンプトは自動で答えられてしまうからです。復元はエラーハンドラー (On Error GoTo CleanExit)の中に置き、マクロ途中のクラッシュがアラートを切ったまま次の処理に 持ち越さないようにしましょう。

DisplayAlerts = False にすればマクロがエラーで落ちなくなりますか?

いいえ。抑止するのは Excel の確認・警告ダイアログであって、VBA の実行時エラーではありません。不正な ファイルパス、無効な範囲、型の不一致は依然としてエラーを発生させ、マクロを止めます。エラーを扱うに は On Error を使いましょう — これは DisplayAlerts とは別の仕組みです。

警告もなくシートが削除されたりファイルが上書きされたりしたのはなぜですか?

DisplayAlerts = False が効いていたため、Excel が「本当によろしいですか」のプロンプトに既定の答え を使ったからです — そしてシートの削除やファイルの上書きでは、その既定は「実行する」です。窓を狭め、 あなたが意図した一つの操作の周りだけアラートを切り、直後に元へ戻しましょう。

DisplayAlerts、ScreenUpdating、Calculation の違いは何ですか?

制御するものが違います。DisplayAlerts は Excel が危険な操作の前に訊くかどうかを決めます。 ScreenUpdating は画面の再描画を止めます(見た目の話)。 Calculation は数式の再計算を止めます(切ったまま残すと古い数字が 表示される)。よくまとめて設定されますが、それぞれを忘れたときの代償はまるで違います。

検証環境

検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-08-18。

関連ガイド: VBA StatusBar · VBA DoEvents · VBA ScreenUpdating · VBA On Error · VBA MsgBox