如何用vba禁止触发对象的事件?

在vba中有很多对象都有内置响应的事件。

比如Workbook对象有Open、BeforeClose等事件。

如果编写了对象的事件响应代码,触发具体的事件将执行具体的代码。

有时候,我们需要禁止触发对象的事件,但是又不想将事件的响应代码删除,这时候可以使用

Application对象的EnableEvents属性进行设置,如果属性值为False,则禁止触发对象的事件,反之则允许触发对象的事件。

比如一个excel文件内置了vba代码,打开该文件会出现一个窗体需要输入密码,密码输入不正确则无法进入。

这是由于Workbook对象的Open事件中内置了弹出窗体的代码,如果想要绕过该代码,可以使用如下的代码先禁用Workbook对象的Open事件:

Sub QQ1722187970()
    Dim oWB  As Workbook
    Dim oWK As Worksheet
    '禁止被打开的工作簿运行事件
    Excel.Application.EnableEvents = False
    Set oWB = Excel.Workbooks.Open(GetFileName)
    With oWB
    '**************操作代码****************'
    End With
    '恢复事件
    Excel.Application.EnableEvents = True
End Sub
Function GetFileName() As String
    '声明一个FileDialog对象变量
    Dim oFD As FileDialog
    '创建一个选择文件对话框
    Set oFD = Application.FileDialog(msoFileDialogFilePicker)
    '声明一个变量用来存储选择的文件名
    Dim vrtSelectedItem As Variant
    With oFD
        '允许选择多个文件
        .AllowMultiSelect = True
        '使用Show方法显示对话框,如果单击了确定按钮则返回-1。
        If .Show = -1 Then
            '遍历所有选择的文件
            For Each vrtSelectedItem In .SelectedItems
                '获取所有选择的文件的完整路径,用于各种操作
                GetFileName = vrtSelectedItem
            Next
            '如果单击了取消按钮则返回0
        Else
        End If
    End With
    '释放对象变量
    Set oFD = Nothing
End Function
       

发表评论