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是从BeforeSaveBeforeClose事件处理程序中调用的。 所以这两个处理程序隐藏表单。 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