excel - VBA - 事件内部事件(BeforeClose -> BeforeSave)不起作用

标签 excel vba events

为了防止在奇怪的环境中意外覆盖文件,我劫持了 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/

相关文章:

java - 使用java无法在Excel中找到合并单元格

Excel VLOOKUP 和 FIND 组合

ms-access - Access VBA 随机更改大写和小写

excel - 使用 VBA 中的 Replace 方法将数字存储为字符串

javascript - 如何使用 JavaScript 计算鼠标的特定移动

excel - 为什么当我们这样写时范围对象不会自动生成 worksheets(1).range ("A1")

vba - 工作表名称是一个数字,我如何在vba中调用它?

c# - 如何在 vb.net 中使用 BackgroundWorker 将代码包装在 lambda 表达式中?

Oracle Apex : load an application variable each time the application is loaded

vba - 计算过滤数据的模式