Excel宏中如何临时禁用Worksheet_Deactivate事件直至工作簿保存关闭?
解决工作表Deactivate事件临时禁用问题
步骤1:在工作簿模块添加控制变量与属性
打开VBA编辑器,双击ThisWorkbook模块,添加以下代码:
' 模块级变量,控制是否禁用Deactivate事件 Private DisableDeactivateEvents As Boolean ' 设置禁用状态的属性 Property Let SetDisableDeactivate(state As Boolean) DisableDeactivateEvents = state End Property ' 获取当前禁用状态的属性 Property Get GetDisableDeactivate() As Boolean GetDisableDeactivate = DisableDeactivateEvents End Property ' 工作簿关闭前自动恢复事件并保存 Private Sub Workbook_BeforeClose(Cancel As Boolean) Me.Save DisableDeactivateEvents = False End Sub
步骤2:修改所有工作表的Deactivate事件
打开每个工作表的代码模块,修改原有的Worksheet_Deactivate事件,加入判断逻辑:
Private Sub Worksheet_Deactivate() ' 仅当未临时禁用时,执行隐藏操作 If Not ThisWorkbook.GetDisableDeactivate Then Me.Visible = xlSheetHidden End If End Sub
步骤3:修复并更新NouvelleFiche宏
修改原宏,添加临时禁用事件的代码,同时修正原代码中的变量错误:
Sub NouvelleFiche() Dim shtName As String Dim wks As Worksheet ' 开启临时禁用Deactivate事件状态 ThisWorkbook.SetDisableDeactivate = True Sheets("blank").Visible = True Worksheets("Blank").Copy after:=Sheets(Worksheets.Count) Set wks = ActiveSheet ' 修正变量名错误:原代码误用sName,统一为shtName Do While shtName <> wks.Name shtName = Application.InputBox(Prompt:="Enter new worksheet name") On Error Resume Next wks.Name = shtName On Error GoTo 0 Loop Set wks = Nothing End Sub
原理说明
- 调用
NouvelleFiche宏时,会将工作簿的DisableDeactivateEvents变量设为True,此时所有工作表的Deactivate事件会跳过隐藏操作,你可以自由切换到Index工作表为新表设置超链接。 - 当关闭工作簿时,
Workbook_BeforeClose事件会自动保存工作簿,并将变量重置为False,下次打开工作簿时,所有工作表的Deactivate事件恢复正常功能。 - 仅在调用
NouvelleFiche宏时才会触发临时禁用,其他场景下事件不受影响。
内容的提问来源于stack exchange,提问作者Yan Vigneault
相关产品推荐
相关产品推荐

