4

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 イベントは再び発生しません。

助言がありますか?

4

1 に答える 1

0

最新バージョンの Office に更新すると、これはもはや問題ではありません。数ヶ月かかりましたが治りました。

于 2016-08-25T20:21:45.297 に答える