为了防止宏病毒对用户的文档产生危害,Microsoft为Office应用程序创建了一个安全模型,能够使用户选择禁用宏,以作为一个防护措施。虽然这能够在一定程度上防止宏病毒,但同时也带来了副作用,因为有很多文档中的许多功能依赖于用户已经实现的宏,如果禁用宏,那么这些功能就不可用。
这个问题也一直困扰着许多VBA开发人员,因为他们开发的功能发送给用户时,如果用户禁用宏或者将宏安全级别设置为高以上,就意味着用户无法使用他们的功能,特别是那些对宏一无所知的用户。因此,很多人问:有没有办法能够去掉打开带有宏的文档时出现的警告消息而直接启用宏。
下面是一个技巧,看了之后觉得很有意思,特辑录于此。这个技巧并不能够去掉是否关于宏的安全警告消息,但能够提示用户,如果不启用宏,那么就不能够使用该工作簿。这个提示信息是通过事先在工作簿中创建的一个默认工作表(即名为“启用宏”的工作表)来实现的。
AskUserEnableMacros1.png
上面这个就是在Excel中强制用户启用宏,打开VBA开发的Excel表格所显示的界面,具体实在的代码如下:
- 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
- '保存工作簿
- 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
- Sub auto_open()
- '当工作簿打开时运行AskUserEnabledMacros过程
- AskUserEnabledMacros
- End Sub
- Sub auto_close()
- '隐藏除<启用宏>工作表之外的所有工作表
- RunOnClose
- End Sub
复制代码
打开该工作簿时,如果禁用宏,那么就只出现“启用宏”工作表,提示用户只有启用宏才能够使用该工作簿。如果启用宏,那么就会出现具体的工作表。 |