2016年8月4日木曜日

Excel VBA ブックを閉じる際のプロシージャが無視される

ブックを閉じる時の自動実行方法は次の2通り
  • Workbook_BeforeClose
  • Auo_Close
実行順序は、次の順
  1. Workbook_BeforeClose
  2. Auto_Close
【Workbook_BeforeClose】
  • 「ThisWorkbook」に記述する
  • ブックを閉じる前に発生
  • 変更されたブックの場合は、変更内容の保存を要求する前に発生
【Auo_Close】
  • 標準モジュールに記述する
【不具合内容】
BeforeClose を使用して処理を記述した際、処理を飛ばされて閉じてしまうことがある。省略される原因として考えられるのは、
  1. 変更が無い場合に Beforeclose は飛ばされてしまう?
  2. イベントの許可、不許可のせい?
【試してみた】
自動モードや、編集モードなど、ファイルを閉じるシーン別に試してみた。
  • Excel ファイルを開いた直後(初期化プロシージャ実行前)
    • イベント許可の状態
    • 保存のみだと:BeforeSave
    • ×印で閉じる:BeforeClose→Auto_Close
  • 初期化プロシージャ実行後、自動モードで表示中
    • イベント不許可の状態
    • ×印で閉じる(変更無し):Auto_Close→WindowsDialogue
    • ×印で閉じる(変更有り):Auto_Close→WindowsDialogue

  • 編集モード(シートの一部のセルを編集可)で表示中
    • イベント許可の状態
    • セルの入力イベントを検知(ドロップダウンリスト)があるため「許可」
    • ×印で閉じる(変更有):
      BeforeClose→Auto_Close→WindowsDialogue→BeforeSave
  • システム設定モード(シートの一部のセルを編集可)で表示中
    • イベント不許可の状態
    • セルへの入力は可、イベントを検知不要
    • ×印で閉じる(変更有り):Auto_Close→WindowsDialogue
WindowsDialogue: 変更を保存するかのポップアップ

【結論】
  • BeforeClose が実行されないのはイベント不許可になっているため
  • Auto_Closeはイベントの不許可でも実行される
OLEボタンはアプリケーションの「イベントでは無い」らしい。ボタンが効くのでイベント許可になっていると思い込んでいたため、組み合わせ毎に調べる羽目になった。