有时,必须确保用户在打开工作簿时启用宏,否则就不能实现工作簿的效果。由于无法使用宏去打开宏,因此需要一种确保用户启用宏的技术。下面讲解的方法隐藏除“欢迎”工作表(告诉用户启用宏)之外的所有工作表,并在每次保存工作簿时强制执行该工作表。如果用户在启用了宏的情况下打开工作簿,则宏将不会隐藏所有工作表。还可以使用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设置为用户没有启用宏时的提示工作表名称。
注:本文的代码整理自vbaexpress.com。