4

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

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

原始帖子:今天遇到了这个错误,其中 .beforeclose 事件在 Excel 2016 中仅触发一次。以下代码在 .beforeclose 事件触发的 Excel 2007、2010 和 2013(在 Windows 10 上均为 32 位)中按预期工作每次。它在 Excel 2016 中无法按预期工作。

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

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

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

有什么建议么?

4

1 回答 1

0

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

于 2016-08-25T20:21:45.297 回答