Excel 2016 Workbook.BeforeClose事件每隔一次触发bug

时间:2016-02-24 16:40:39

标签: excel vba excel-vba excel-2016

8/25/16更新:我​​更新了Office 2016(现在发布于16.0.7167.2040),似乎已经修复。我没有更改任何加载项或任何东西。也许微软确实关注这些问题!希望有此问题的其他任何人都可以更新他们的版本并看到此错误已得到纠正。 (我从OP中删除了Dropbox链接。)

2016年4月9日更新:我更新了Office(现在发布于16.0.6729.1012)而不是仅触发一次的.beforeclose事件,现在事件每隔一次触发一次。这是一段显示奇怪行为的视频:screencast.com/t/BdkTd9ib

原帖: 今天遇到这个bug,.beforeclose事件只在Excel 2016中触发一次。下面的代码在Excel 2007,2010和2013(Windows 10上的所有32位)中按预期工作,每次都会触发.beforeclose事件。它在Excel 2016中无法正常工作。

Workbook.BeforeClose事件中的代码仅触发一次。如果用户单击“取消”到自定义保存对话框并且取消= 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

如果用户在Sheet1上进行了更改,则isDirty标志设置为True。 用户单击X以关闭工作簿并触发.beforeclose事件触发,并打开自定义确认关闭对话框。 用户点击取消。

用户再次点击X,现在打开正常的Excel工作簿关闭对话框,询问用户是否要保存更改。 .beforeclose事件不再发生。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

更新到最新版本的Office,这不再是一个问题。花了几个月但它已经修好了。