如果Roy在打开工作簿时按住Shift键,则Excel将绕过正常运行的所有“自动”宏的运行,包括Workbook_Open事件。他想知道在关闭工作簿时是否有同样简单的方法可以使Excel绕过Workbook_BeforeClose事件。

没有同样简单的方法。这并不意味着不能完成,而是“同样容易”通常意味着“内置的东西;需要按下或设置的某些按键”。 Excel中并未内置用于绕过BeforeClose事件的此类键和设置。

您可以做的是调整对BeforeClose事件进行编程的方式,以便如果满足特定条件,那么将绕过事件处理程序中的代码。一种简单的方法是,如果选择了特定的工作表单元格,则以这种方式简单地绕过代码:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

If ActiveCell.Address = "$Z$27" Then Exit Sub     '     ' Your normal code here...

' End Sub

在这种情况下,如果活动单元格(触发BeforeClose事件时选择的单元格)正好是单元格Z27,则将跳过事件处理程序中的常规代码。如果选择了其他任何单元格,则不会跳过它。 (我特意选择了单元格Z27,因为它既深奥又晦涩。您当然可以更改代码以反映您想要的任何其他单元格。)

如果您不愿检查Shift键是否被按下,可以使用Windows API来完成。这涉及向模块的声明区域添加一些代码。这可以是常规模块;它不必在ThisWorkbook代码窗口中。在声明任何过程之前,您只需要确保它在声明区域中即可。

#If VBA7 Then     Declare PtrSafe Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer #Else     Declare Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer #End If

请注意,使用#If VBA7条件指令,以便在使用Excel 2010或更高版本时,将使用正确的声明语法,因此该程序的32位或64位版本均没有错误。

现在,在BeforeClose事件处理程序中,您可以执行以下操作:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Const VSHIFT = &H10     Const SHIFTED = &H80

If GetKeyState(VSHIFT) And SHIFTED Then Exit Sub     '     ' Your normal code here...

' End Sub

如果在触发BeforeClose事件时按住Shift键,则将跳过BeforeClose代码。您应该注意,可能很难弄清何时按住Shift键或按住的时间足够长。出于这个原因,我倾向于更好地选择“检查ActiveCell”方法,因为您可以简单地选择单元格,关闭工作簿并忽略它。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(2628)适用于Microsoft Excel 2007、2010、2013和2016。