Excel 2016 Workbook.BeforeClose 事件每隔一段时间触发一次错误
Excel 2016 Workbook.BeforeClose event firing every other time bug
8/25/16 更新:我更新了 Office 2016(现在是 v 16.0.7167.2040),它似乎已经修复。我没有更改任何加载项或任何内容。也许微软确实在关注这些问题!希望遇到此问题的其他任何人都可以更新他们的版本并看到此错误已得到纠正。 (我从 OP 中删除了保管箱 link。)
4/9/16 更新:我更新了 Office(现在在 v 16.0.6729.1012 上)而不是 .beforeclose 事件只触发一次,现在事件每隔一次触发一次。这是一段显示奇怪行为的视频:screencast.com/t/BdkTd9ib
原文Post:
运行 今天遇到这个错误,其中 .beforeclose 事件仅在 Excel 2016 年触发一次。以下代码在 Excel 2007、2010 和 2013 年(所有 32 位Windows 10) 每次都会触发 .beforeclose 事件。它在 Excel 2016 年无法正常工作。
Workbook.BeforeClose 事件中的代码只触发一次。如果用户单击 "Cancel" 到自定义保存对话框并单击 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 事件不再触发。
有什么建议吗?
更新到最新版本的 Office,这应该不再是个问题。花了几个月,但它是固定的。
8/25/16 更新:我更新了 Office 2016(现在是 v 16.0.7167.2040),它似乎已经修复。我没有更改任何加载项或任何内容。也许微软确实在关注这些问题!希望遇到此问题的其他任何人都可以更新他们的版本并看到此错误已得到纠正。 (我从 OP 中删除了保管箱 link。)
4/9/16 更新:我更新了 Office(现在在 v 16.0.6729.1012 上)而不是 .beforeclose 事件只触发一次,现在事件每隔一次触发一次。这是一段显示奇怪行为的视频:screencast.com/t/BdkTd9ib
原文Post: 运行 今天遇到这个错误,其中 .beforeclose 事件仅在 Excel 2016 年触发一次。以下代码在 Excel 2007、2010 和 2013 年(所有 32 位Windows 10) 每次都会触发 .beforeclose 事件。它在 Excel 2016 年无法正常工作。
Workbook.BeforeClose 事件中的代码只触发一次。如果用户单击 "Cancel" 到自定义保存对话框并单击 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 事件不再触发。
有什么建议吗?
更新到最新版本的 Office,这应该不再是个问题。花了几个月,但它是固定的。