2016 年 8 月 25 日更新: Office 2016 (現在 v 16.0.7167.2040) を更新したところ、修正されたようです。アドインなどは一切変更していません。たぶん、マイクロソフトはこれらの問題を検討しています! 願わくば、この問題を抱えている他の人がバージョンを更新して、このバグが修正されたことを確認してください。(OPからドロップボックスリンクを削除しました。)
2016 年 4 月 9 日更新: Office を更新しました (現在 v 16.0.6729.1012) .beforeclose イベントが 1 回だけ発生するのではなく、1 回おきにイベントが発生するようになりました。奇妙な動作を示すビデオは次のとおりです: screencast.com/t/BdkTd9ib
元の投稿: 今日、Excel 2016 で .beforeclose イベントが 1 回しか発生しないこのバグに遭遇しました。次のコードは、.beforeclose イベントが発生する Excel 2007、2010、および 2013 (Windows 10 ではすべて 32 ビット) で期待どおりに動作します。毎回。Excel 2016 では期待どおりに動作しません。
Workbook.BeforeClose イベントのコードは 1 回だけ発生します。ユーザーがカスタム保存ダイアログ ボックスで [キャンセル] をクリックし、Cancel=True にしてワークブックを閉じず、ユーザーが再度ワークブックを閉じようとすると、.BeforeClose は起動しません。代わりに、既定の Excel の閉じるダイアログが表示されます。
手動で再現する手順: 新しい .xlsm ワークブックを作成します。「isDirty」という名前の範囲を作成します。sheet1 モジュールに次のように記述します。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target(1) = [isDirty] Then Exit Sub
Application.EnableEvents = False
[isDirty] = True
Application.EnableEvents = True
End Sub
これを ThisWorkook モジュールに入力します。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
With Application
.EnableEvents = False
.DisplayAlerts = False
.Calculation = xlCalculationManual
End With
With Me
If [isDirty] = True Then
Select Case MsgBox("Do you want to save the changes you made to '" & .Name & "'?", _
vbYesNoCancel + vbExclamation, "CUSTOM CLOSE BOX")
Case Is = vbYes
Call CustomSave
Case Is = vbNo
Me.Saved = True
Case Is = vbCancel
Cancel = True
GoTo Cleanup
End Select
End If
End With
With Application
.EnableEvents = True
.StatusBar = False
.ScreenUpdating = True
.DisplayAlerts = True
End With
Me.Saved = True
Exit Sub
Cleanup: 'user hit cancel to custom save dialog box
With Application
.DisplayAlerts = True
.CalculateBeforeSave = False
.Calculation = xlCalculationManual
.EnableEvents = True
.ScreenUpdating = True
.StatusBar = False
End With
Me.Saved = False
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
[isDirty] = False
End Sub
カスタム モジュールを挿入し、次のコードを挿入します。
Sub CustomSave()
[isDirty] = False
ThisWorkbook.Save
ThisWorkbook.Saved = True
End Sub
ユーザーがシート 1 に変更を加えると、isDirty フラグが True に設定されます。ユーザーが X をクリックしてワークブックを閉じると、.beforeclose イベントが発生し、カスタムの閉じる確認ダイアログ ボックスが開きます。ユーザーはキャンセルを押します。
ユーザーがもう一度 X を押すと、通常の Excel ワークブックを閉じるダイアログが開き、変更を保存するかどうかを尋ねられます。.beforeclose イベントは再び発生しません。
助言がありますか?