工作簿事件示例——强制用户必须启用宏
有时候,我们使用VBA为工作簿编写了一些功能,但是如果用户在打开工作簿时不启用宏设置或者彻底禁用宏,那么这些功能就无法使用。例如,我使用VBA为工作簿添加了自定义菜单,但是如果用户禁用宏,那么自定义菜单就无法使用。
如何强制用户在使用工作簿时启用宏呢?
使用VBA代码来实现。在打开工作簿时,Excel提示用户必须启用宏,否则工作簿中数据工作表均不可见。
首先,在工作簿中新建一个如下图1所示的工作表,并命名为<启用宏>,作为用户禁用宏时的特别提示。
接着,打开VBE编辑器,在标准模块中输入下面的代码:
Sub AskUserEnabledMacros()
Dim wksInfoSheet As Worksheet
Dim objSheet As Object
On Error Resume Next
'引用<启用宏>工作表并判断其是否存在
Set wksInfoSheet =ThisWorkbook.Worksheets('启用宏')
If wksInfoSheet Is Nothing Then
MsgBox '不能够找到<启用宏>工作表',vbCritical
Exit Sub
End If
'关闭屏幕更新
Application.ScreenUpdating = False
'遍历工作簿中的所有工作表并设置所有工作表可见
For Each objSheet In ThisWorkbook.Sheets
objSheet.Visible = xlSheetVisible
Next objSheet
'隐藏<启用宏>工作表
wksInfoSheet.Visible = xlSheetVeryHidden
'隐藏想要隐藏的工作表,例如<sheet3>工作表
ThisWorkbook.Worksheets('Sheet3').Visible = xlSheetVeryHidden
'保存工作簿
ThisWorkbook.Saved = True
'恢复屏幕更新
Application.ScreenUpdating = True
End Sub
'隐藏除<启用宏>工作表之外的所有工作表
Sub RunOnClose()
Dim wksInfoSheet As Worksheet
Dim objSheet As Object
On Error Resume Next
'引用<启用宏>工作表并判断其是否存在
Set wksInfoSheet =ThisWorkbook.Worksheets('启用宏')
If wksInfoSheet Is Nothing Then
MsgBox '不能够找到<启用宏>工作表',vbCritical
Exit Sub
End If
'关闭屏幕更新
Application.ScreenUpdating = False
'显示<启用宏>工作表
wksInfoSheet.Visible = xlSheetVisible
'隐藏其他工作表
For Each objSheet In ThisWorkbook.Sheets
If Not objSheet Is wksInfoSheet Then
objSheet.Visible = xlSheetVeryHidden
End If
Next objSheet
'保存工作簿
ThisWorkbook.Save
End Sub
在ThisWorkbook对象模块中,输入下面的代码:
Private Sub Workbook_Open()
'当工作簿打开时运行AskUserEnabledMacros过程
AskUserEnabledMacros
End Sub
Private SubWorkbook_BeforeClose(Cancel As Boolean)
'隐藏除<启用宏>工作表之外的所有工作表
RunOnClose
End Sub
当打开工作簿时,如果用户禁用了宏,那么将只显示<启用宏>工作表,提示用户要启用宏才能运用工作簿的所有功能,而其他工作表都被隐藏。并且,Excel会在上方显示“安全警告:宏已被禁用”,如图1所示。如果单击其右侧的“选项”并启用宏,那么会隐藏<启用宏>工作表并使其他工作表可见。
如果用户启用了宏,那么在打开工作簿时,触发Workbook_Open事件,执行其中的代码,即调用AskUserEnabledMacros过程,隐藏<启用宏>工作表及用户不想让他人看到的工作表,其他工作表可见。在关闭工作簿时,触发Workbook_BeforeClose事件,执行其中的代码,即调用RunOnClose过程,隐藏除<启用宏>工作表之外的其他所有工作表。这样,再次打开该工作簿时,如果用户禁用宏,那么工作簿中就会只出现这个工作表。