强制用户启用宏
有时,必须确保用户在打开工作簿时启用宏,否则就不能实现工作簿的效果。由于无法使用宏去打开宏,因此需要一种确保用户启用宏的技术。下面讲解的方法隐藏除“欢迎”工作表(告诉用户启用宏)之外的所有工作表,并在每次保存工作簿时强制执行该工作表。如果用户在启用了宏的情况下打开工作簿,则宏将不会隐藏所有工作表。还可以使用Excel的 VeryHidden属性来实现工作表的隐藏,这意味着不能使用Excel的菜单来取消隐藏工作表。但是,这只会影响该工作簿,因此用户可以使用另一个工作簿中的宏取消隐藏所有工作表。但是,如果用户非常熟练,他们总是可以始终进入你的文件中。注意:为防止某些事件循环问题,此代码需要覆盖Excel内置的Save事件,并且还需要复制Excel的“工作簿已更改,您要保存”提示和操作,代码负责所有这些工作。但是,在关闭文件时确实会产生一个非常小的问题。如果用户尝试退出该应用程序,它将关闭工作簿,而不是Excel。再次退出将完全关闭Excel。
下面是代码:
Const WelcomePage = "欢迎"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'关闭事件以阻止不必要的循环
Application.EnableEvents = False
'评估是否保存工作簿并模拟默认的提示信息
With ThisWorkbook
If Not .Saved Then
Select Case MsgBox("你想保存对 '" &.Name & "' 工作簿所做的变化吗?", _
vbYesNoCancel + vbExclamation)
Case Is = vbYes
'调用自定义的保存程序
Call CustomSave
Case Is = vbNo
'不保存
Case Is = vbCancel
'设置过程来取消关闭
Cancel = True
End Select
End If
'如果单击取消, 重新打开事件并取消关闭,
'否则不保存改变而关闭工作簿.
If Not Cancel = True Then
.Saved = True
Application.EnableEvents = True
.Close savechanges:=False
Else
Application.EnableEvents = True
End If
End With
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'关闭事件以阻止不必要的循环
Application.EnableEvents = False
'调用自定义的保存程序并设置工作簿的saved属性为true
'(取消常规的保存)
Call CustomSave(SaveAsUI)
Cancel = True
'重新打开事件并设置saved属性为true
Application.EnableEvents = True
ThisWorkbook.Saved = True
End Sub
Private Sub Workbook_Open()
'取消隐藏所有工作表
Application.ScreenUpdating = False
Call ShowAllSheets
Application.ScreenUpdating = True
End Sub
Private Sub CustomSave(Optional SaveAs As Boolean)
Dim ws As Worksheet, aWs As Worksheet,newFname As String
'关闭屏幕更新
Application.ScreenUpdating = False
'设置为活动工作表
Set aWs = ActiveSheet
'隐藏所有工作表
Call HideAllSheets
'直接保存工作簿或提示另存为文件名
If SaveAs = True Then
newFname =Application.GetSaveAsFilename( _
fileFilter:="Excel Files (*.xls*),*.xls*")
If Not newFname = "False"Then ThisWorkbook.SaveAs newFname
Else
ThisWorkbook.Save
End If
'恢复文件还原到用户所在的位置
Call ShowAllSheets
aWs.Activate
'恢复屏幕更新
Application.ScreenUpdating = True
End Sub
Private Sub HideAllSheets()
'隐藏除"欢迎"外的所有工作表
Dim ws As Worksheet
Worksheets(WelcomePage).Visible =xlSheetVisible
For Each ws In ThisWorkbook.Worksheets
If Not ws.Name = WelcomePage Thenws.Visible = xlSheetVeryHidden
Next ws
Worksheets(WelcomePage).Activate
End Sub
Private Sub ShowAllSheets()
'显示除"欢迎"外的所有工作表
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If Not ws.Name = WelcomePage Thenws.Visible = xlSheetVisible
Next ws
Worksheets(WelcomePage).Visible =xlSheetVeryHidden
End Sub
说明:
1. 代码放置在ThisWorkbook代码模块中。
2. 工作簿中应该有一个名为“欢迎”的工作表,否则你要将代码前面的常量WelcomePage设置为用户没有启用宏时的提示工作表名称。
在《VBA一段代码库10 :强制用户可视宏》中,讲解了用户在打开工作簿时必须可视化宏才能使用工作簿功能的代码。本文给出了一段同样可以强制用户使用宏的代码。
如果用户没有启用宏,那么当打开工作簿时,一个特定的工作表将提示用户可以宏,而工作簿中的其他工作表则被隐藏。
代码如下:
私有子工作簿_Open()
有申请
'禁用ESC键
.EnableCancelKey = xlDisabled
.ScreenUpdating = 假
调用取消隐藏表格
.ScreenUpdating = 真
'重新启用ESC键
.EnableCancelKey = xlInterrupt
结束于
结束子
私有子 UnhideSheets()
变暗表作为对象
对于 Sheets 中的每个 Sheet
If Not Sheet.Name = "提示" Then
Sheet.Visible = xlSheetVisible
万一
下一个
Sheets("提示").Visible = xlSheetVeryHidden
'Application.Goto Worksheets(1).[A1], True '<任选的
设置表 = 无
ActiveWorkbook.Saved = True
结束子
Private Sub Workbook_BeforeClose(Cancel As Boolean)
有申请
.EnableCancelKey = xlDisabled
.ScreenUpdating = 假
调用隐藏表
.ScreenUpdating = 真
.EnableCancelKey = xlInterrupt
结束于
结束子
私人子隐藏表()
Dim Sheet As Object '<包括工作表和图表工作表
With Sheets("提示")
'工作表的隐藏构成了一种变化,这种变化产生了
'自动的“保存?”提示,所以如果工作簿已经
'在此之前被保存,然后下一行和前几行
“与下面的[A100]有关,绕过'保存? ’对话...
If ThisWorkbook.Saved = True Then.[A100] = "Saved"
.Visible = xlSheetVisible
对于 Sheets 中的每个 Sheet
If Not Sheet.Name = "提示" Then
Sheet.Visible =xlSheetVeryHidden
万一
下一个
如果 .[A100] = "已保存" 那么
.[A100].清除内容
此工作簿.保存
万一
设置表 = 无
结束于
结束子