分享

Excel VBA解读(92):Workbook对象的Open事件和BeforeClose事件

 L罗乐 2018-04-23


本文详细讲解Workbook对象常用的两个事件:Open事件和BeforeClose事件。

 

Workbook_Open事件

当打开工作簿时发生Workbook_Open事件。

 

ThisWorkbook代码模块中输入下面的代码,使工作簿打开时弹出一个消息框:

Private Sub Workbook_Open()

   MsgBox '欢迎来到[完美Excel]微信公从号!'

End Sub

在打开工作簿时,弹出如图1所示的消息框。


1

 

Workbook_BeforeClose事件

在关闭工作簿之前发生该事件。如果修改了工作簿但没有保存修改,那么该事件发生在询问用户保存修改之前。

 

其语法为:

Workbook_BeforeClose(Cancel As Boolean)

 

说明:

  • 参数Cancel为布尔值,必需。事件发生时为False;如果事件过程将此参数设置为True,则停止关闭工作簿并且工作簿保持打开状态。

 

下面的代码在关闭工作簿时总是会保存对该工作簿的修改,而不会弹出询问是否保存修改的消息框。

Private SubWorkbook_BeforeClose(Cancel As Boolean)

   If Me.Saved = False Then Me.Save

End Sub

 

Workbook_Open事件可用于在打开工作簿时初始化工作簿,设置计算模式、设置屏幕、添加自定义菜单、为工作表中的组合框或列表框添加数据。Workbook_BeforeClose事件可用于恢复工作簿的初始设置、阻止用户关闭工作簿,等等。

 

示例1:设定特定用户才能操作工作表

下面的代码在打开工作簿时检查用户名是否为“完美Excel”,如果不是,则保护工作表,防止其他用户对其进行修改。

Private Sub Workbook_Open()

   Dim wks As Worksheet

   If Application.UserName <> '完美Excel' Then

        For Each wks In Worksheets

            wks.Protect UserInterfaceOnly:=True

        Next wks

   End If

End Sub

 

示例2:要求用户输入指定值

只有当工作簿中的工作表Sheet1的单元格A1中的值为“完美Excel”时,才能关闭该工作簿。代码如下:

Private Sub Workbook_BeforeClose(CancelAs Boolean)

   If Worksheets('Sheet1').Range('A1') <> '完美Excel' Then

        MsgBox '请在工作表Sheet1的单元格中输入''完美Excel'''

        Cancel = True

   End If

End Sub

 

关闭工作簿时,如果工作表Sheet1的单元格A1中的值不是“完美Excel”,则会弹出如下图2所示的提示消息。


2

 

示例3:添加/删除自定义快捷菜单

当仅需要在特定的工作簿中添加自定义快捷菜单时,我们可以在Workbook_Open事件中添加自定义快捷菜单,在Workbook_BeforeClose事件中删除该菜单。这是经常使用的一种技术。

 

下面的代码在打开工作簿时,在单元格右键菜单中添加一个名为“完美Excel”的按钮,关闭工作簿时将其删除。

Private Sub Workbook_Open()

   Dim cmb As CommandBarControl

   On Error Resume Next

   Application.CommandBars('Cell').Controls('完美Excel').Delete

   Set cmb = Application.CommandBars('Cell').Controls.Add _

                    (Type:=msoControlButton,Temporary:=True)

   cmb.Caption = '完美Excel'

   cmb.OnAction = 'excelperfect'

End Sub

 

Private SubWorkbook_BeforeClose(Cancel As Boolean)

   Dim strMsg As String

   Dim Response

   

   If Not ThisWorkbook.Saved Then

        strMsg = '是否想要保存所做的修改?'

        Response = MsgBox(strMsg, vbQuestion vbYesNoCancel)

        Select Case Response

           Case vbYes

                ThisWorkbook.Save

            Case vbNo

                ThisWorkbook.Saved = True

            Case vbCancel

                Cancel = True

                Exit Sub

        End Select

   End If

   On Error Resume Next

   Application.CommandBars('Cell').Controls('完美Excel').Delete

End Sub

 

代码中,语句:

ThisWorkbook.Save

保存工作簿的修改而不会出现提示。

 

语句:

ThisWorkbook.Saved = True

放弃对工作簿所作的修改而不出现提示。

 

打开该工作簿时的右键菜单如图3所示。


3

 

BeforeClose事件中,我们创建了自已的“保存”对话框。之所以这样做,是因为如果在修改了工作簿而没有保存时,Excel会弹出是否保存修改对话框,这个对话框发生在BeforeClose事件之后,此时,如果用户选择“取消”而回到工作簿,那么菜单中的自定义按钮已被删除。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多