为了防止在奇怪的环境中意外覆盖文件,我劫持了 excel 文件中的保存。
Workbook_BeforeSave 和 Workbook_BeforeClose 事件可以独立运行。不幸的是,根据当前代码的结构方式,我需要从 BeforeClose 事件中调用 BeforeSave 事件。
在最基本的形式中,以下代码不会如我所愿。在以下示例中,如果从 BeforeClose 事件中调用保存,wksHiddenWorksheet.Visible = True 将不会使 wksHiddenWorksheet 可见。
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Save
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
wksHiddenWorksheet.Visible = True
End Sub
有什么办法解决这个问题吗?以我尝试的方式从另一个事件内部调用一个事件是不是不好的做法(甚至根本不正确)?
更新:
我在工作簿中尝试过 Application.EnableEvents,但我确保它在错误处理中始终恢复为 True。
我打开了一个全新的工作簿并输入了以下代码
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Debug.Print Application.EnableEvents 'Prints TRUE
ThisWorkbook.Save
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'The workbook consists of two sheets. Sheet1 and Sheet2
Sheet1.Visible = xlSheetHidden
Debug.Print Sheet1.Visible 'Prints -1 (xlSheetVisible)
End Sub
可见工作表不会隐藏,但如果我逐行查看代码会触发该行。如果我在同一空间输入代码,例如 MsgBox,MsgBox 将正常打开。
更新 2:
要回答大家的问题并准确显示发生了什么,请看下面的代码:
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'The workbook consists of two sheets. Sheet1 and Sheet2
Debug.Print Application.EnableEvents 'Prints TRUE
Debug.Print Sheet1.Visible 'Prints -1 (xlSheetVisible)
Sheet1.Visible = xlSheetHidden
Sheet1.Visible = False 'Same thing
Debug.Print Sheet1.Visible 'Prints 0 (xlSheetHidden)
Sheet1.Visible = xlSheetVisible
Sheet1.Visible = True 'Same thing
Debug.Print Sheet1.Visible 'Prints -1 (xlSheetVisible)
ThisWorkbook.Save
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Debug.Print Sheet1.Visible 'Prints -1 (xlSheetVisible)
Sheet1.Visible = xlSheetHidden
Sheet1.Visible = False 'Same thing
'Sheet1 should now be hidden, but it's not
Debug.Print Sheet1.Visible 'Prints -1 (xlSheetVisible)
End Sub
隐藏和取消隐藏工作表在第一个事件中完美运行,但一旦触发第二个事件,工作表可见性就不会改变。
更新 3:
还有一点。如果我直接(通过保存)输入 Workbook_BeforeSave() 事件,而不是从 Workbook_BeforeClose() 事件输入它,那么一切都会按预期进行。
稍后更新:
虽然我不久前将这个问题标记为已解决,但我看到了一篇有助于解释该行为的文章。可以在以下位置找到解释: http://www.cpearson.com/excel/events.aspx
最佳答案
在所有澄清之后
编辑
下面的代码对我有用
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Workbook_BeforeSave False, True
ThisWorkbook.Save
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Cancel Then Sheet1.Visible = xlSheetHidden
End Sub
虽然很难说出为什么...
关于excel - VBA - 事件内部事件(BeforeClose -> BeforeSave)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39166997/