前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VBA代码库10:强制用户启用宏

VBA代码库10:强制用户启用宏

作者头像
fanjy
发布2021-05-07 10:42:13
2.4K0
发布2021-05-07 10:42:13
举报
文章被收录于专栏:完美Excel

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档