VBA – 事件内部事件(BeforeClose – > BeforeSave)不起作用
为了防止在奇怪的环境中意外地覆盖文件,我已经劫持了保存在excel文件中。
Workbook_BeforeSave和Workbook_BeforeClose事件可以独立工作。 不幸的是,当前代码的结构方式,我需要从BeforeClose事件中调用BeforeSave事件。
在最基本的forms,下面的代码将不会按我的意愿。 在以下示例中,如果从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,但是我已经确定它总是在error handling中恢复为True。
我已经打开了一个全新的工作簿,并input了下面的代码
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
“可见”工作表不会隐藏起来,但是如果我按照代码一行一行地触发该行,则该行将被触发。 如果我在相同的空间input代码,如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:
还有一点。 如果我直接(通过保存)inputWorkbook_BeforeSave()事件,而不是从Workbook_BeforeClose()事件input它,那么一切都按预期工作。
更新:
尽pipe我刚刚解决了这个问题,但我遇到了一篇文章,有助于解释这种行为。 可以在http://www.cpearson.com/excel/events.aspx上find解释
所有澄清后编辑
下面的代码为我工作
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
很难说为什么虽然…
在这个示例过程中, HideSheet
是从BeforeSave
和BeforeClose
事件处理程序中调用的。 所以这两个处理程序隐藏表单。 HTH
Private Sub Workbook_BeforeClose(Cancel As Boolean) HideSheet Sheet1 ThisWorkbook.Save End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) HideSheet Sheet1 End Sub Private Sub HideSheet(wks As Worksheet) wks.Visible = xlSheetHidden End Sub