恒指配资开户炒股 VBA高级应用30例应用4:打开工作簿时自动运行事件的代码修正_Set_sh_文件

发布日期:2025-08-13 20:30    点击次数:120

恒指配资开户炒股 VBA高级应用30例应用4:打开工作簿时自动运行事件的代码修正_Set_sh_文件

《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合恒指配资开户炒股,紧贴“实战”,并做“战术总结”,以便大家能很好的应用。教程的目的是要求大家在实际工作中分发VBA程序,写好的程序可以升级。本套教程共三册三十个专题,本讲的内容是:VBA高级应用30例应用4:打开工作簿时自动运行事件的代码修正

【分享成果,随喜正能量】228 内心的美,如空谷幽兰,洋溢阵阵芬芳,使人心情愉悦。学道的人,须重视内在的修持,不以华丽的衣着来装饰自己,而以高贵气质来涵育自己,以道德修养来庄严自己。

应用4 工作簿打开时阻止事件的自动运行

作为开发人员,需要经常打开包含VBA的文件,并运行代码。但并不总是这样,有时我们还想阻止某些代码的运行,最为典型的是工作簿打开事件中的某些特殊命令,如身份验证部分,我们在某些时候是希望阻止工作簿打开时自动运行的。这篇应用就是向大家展示如何实现这一点。为什么要这么做呢?通常,如果在自己的文件中使用了工作簿自动打开事件,而文件仍在开发中,自动运行Open事件可能需要一段时间才能运行代码,或者在开发文件的程序书写过程中,我们不希望在此时配置项目。

展开剩余88%

在实际应用中,我们要求用户在打开文件事件中处理某些任务时,一定要启动宏。如果没有设置启用宏,这些事件处理程序会保持禁用状态,这是我们不希望看到的。在这篇应用中,我会同时给大家展示如果用户禁用宏,将不能顺利处理工作簿的方法。但要注意,不信任的宏文件要小心处理。

5 打开工作簿时自动运行事件的代码修正

在以上第2,3,4部分我们讲解了阻止工作簿打开时自动运行事件的三种方案,这三种方案在实际应用时是非常方便的,但是,很多读者会说:老师,最方便的方案可以屏蔽宏代码运行。是的,如果我们在工作簿选项中选择禁用宏,就可以屏蔽掉所有的代码运行,设置如下:

但是,以上的设置却不是我们期望的,我们期望就是用户在打开工作薄时录入身份验证密码,那么如何实现用户打开工作薄就必须启用宏,否则文件不能顺利操作呢?为此我们要修正一下上面给出的各个文件。

1)文件“高级应用04_1.XLSM”的代码修正:

我先给出下面的代码修正:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

On Error GoTo Err_Handle

Dim sh As Worksheet

Set sh = Sheets("BLANK")

GoTo 100

Err_Handle:

Set sh = ActiveWorkbook.Sheets.Add(After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count))

sh.Name = "BLANK"

100:

Err.Clear

Sheets("BLANK").Visible = True

For Each sh In ThisWorkbook.Sheets

If sh.Name <> "BLANK" Then

sh.Visible = xlSheetVeryHidden

End If

Next

ActiveWorkbook.Save

End Sub

Private Sub Workbook_Open()

Dim sh As Worksheet

For Each sh In ThisWorkbook.Sheets

If sh.Name <> "BLANK" Then

sh.Visible = xlSheetVisible

End If

Next

Sheets("BLANK").Visible = xlSheetVeryHidden

Dim sheet As Worksheet

Set sheet = ActiveWorkbook.Sheets.Add(After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count))

sheet.Select

UU = InputBox("请输入您的权限密码", "文件打开确认")

If UU <> "1234" Then

ThisWorkbook.Close (False)

Else

Application.DisplayAlerts = False

sheet.Delete

Application.DisplayAlerts = True

End If

End Sub

代码的截图:

代码的讲解:上述代码利用了我的第一套教程《VBA代码解决方案》中的部分代码,并完善了一下功能,下面进行讲解。

1)Private Sub Workbook_BeforeClose(Cancel As Boolean)

表示事件是在工作簿关闭之前发生。

2)On Error GoTo Err_Handle

Dim sh As Worksheet

Set sh = Sheets("BLANK")

GoTo 100

Err_Handle:

Set sh = ActiveWorkbook.Sheets.Add(After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count))

sh.Name = "BLANK"

以上代码首先是一句错误处理程序,如果发生错误,代码将转到Err_Handle:处继续运行;然后赋值一个对象变量Set sh = Sheets("BLANK"),这是将工作表Sheets("BLANK")赋值给变量sh,如果没有这个工作表,将发生错误,代码会转到Err_Handle:处继续运行,如果没有发生错误就转到标签为100的代码处运行;此时没有Sheets("BLANK")工作表,会创建一个。

2)100:Err.Clear

Sheets("BLANK").Visible = True

以上代码会让Sheets("BLANK")工作表可见。

3)For Each sh In ThisWorkbook.Sheets

If sh.Name <> "BLANK" Then

sh.Visible = xlSheetVeryHidden

End If

Next

以上代码在所有工作表集合间建立一个遍历循环,如果不为Sheets("BLANK")工作表,就令这个工作表的可见属性修正为xlSheetVeryHidden,如下列表:

名称

说明

xlSheetHidden

0

隐藏工作表,用户可以通过菜单取消隐藏。

xlSheetVeryHidden

2

隐藏对象,使对象重新可见的唯一方法是将此属性设置为 True(用户无法使该对象可见)。

xlSheetVisible

-1

显示工作表。

我们看一下xlSheetVeryHidden这个属性:隐藏对象,使对象重新可见的唯一方法是将此属性设置为 True(用户无法使该对象可见),所以达到了深度隐藏。

4)For Each sh In ThisWorkbook.Sheets

If sh.Name <> "BLANK" Then

sh.Visible = xlSheetVisible

End If

Next

Sheets("BLANK").Visible = xlSheetVeryHidden

以上代码是工作薄打开事件中发生,也是在工作表集合中发生的遍历循环,是将Sheets ("BLANK")深度隐藏,其他工作表可见。

以上的操作令工作薄在关闭时有用的工作表深度隐藏,只留一个"BLANK"空白的工作表,打开工作薄时会让"BLANK"工作表深度隐藏,而有用的工作表会可见。如果用户没有启用宏,那么用户只能会看到一个"BLANK"空白的工作表。如下图:

而用户启用了宏之后,会正常运行,首先提示用户输入权限密码:

以上部分用到的程序文件:高级应用04_4.XLSM

我20多年的VBA实践经验,全部浓缩在下面的各个教程中:

发布于:河北省