如何在vba中使用QueryTable对象的刷新事件?

vba中的QueryTable对象具有两个事件,分别是AfterRefresh(刷新后)、BeforeRefresh(刷新前)两个事件。

它们的语法分别如下:

Private Sub oQT_AfterRefresh(ByVal Success As Boolean) 
End Sub
Private Sub oQT_BeforeRefresh(Cancel As Boolean)
End Sub

其中AfterRefresh事件可以在刷新完成后触发,BeforeRefresh事件在刷新前触发。

Success参数表示刷新是否成功,Cancel参数设置是否取消刷新。

如果要在vba中使用QueryTable对象的事件,需要按照以下步骤:

  1. 插入一个类模块,这里将类模块重命名为”clsQueryTable”,复制粘贴以下代码:
    Public WithEvents oQT As QueryTable
    Private Sub oQT_AfterRefresh(ByVal Success As Boolean)
        If Success Then
            '开始写刷新成功后的代码
            MsgBox "这是个示例"
        Else
            '刷新未完成的代码
        End If
    End Sub
    Private Sub oQT_BeforeRefresh(Cancel As Boolean)
        '开始写刷新前的代码
    End Sub
    
  2. 插入一个标准模块,复制粘贴以下代码:
    '这里要特别注意*********,一定要声明为全局的变量,才能使用类模块的事件*********
    Dim objCls As New clsQueryTable
    Sub QQ1722187970()
        Dim oQB As QueryTable
        Dim oWK As Worksheet
        Set oWK = Excel.ActiveSheet
        Dim sUrl As String
        sUrl = "URL;http://www.mca.gov.cn/article/sj/tjbz/a/2018/201803131439.html"
        With oWK
            '如果没有查询表,则新建一个
            If .QueryTables.Count = 0 Then
                Set oQB = oWK.QueryTables.Add(sUrl, oWK.Range("a1"))
            Else
                '如果有,则把第一个查询表改为网页查询
                Set oQB = oWK.QueryTables(1)
                With oQB
                    .Connection = "URL;http://www.mca.gov.cn/article/sj/tjbz/a/2018/201803131439.html"
                End With
            End If
        End With
        '*********关联类模块中的具有事件的oQT变量,这里是关键*********
         Set objCls.oQT = oQB
        With oQB
            '指定只导入指定的表格
            .WebSelectionType = xlSpecifiedTables
            '要导入的表格序号
            .WebTables = 1
            '设置刷新的频率,以分钟为单位,如果设置为0,表示不定时更新
            .RefreshPeriod = 1
            '开始刷新
            .Refresh
        End With
    End Sub

    经过以上两个步骤既可以使用QueryTable对象的AfterRefresh事件和BeforeRefresh事件。

 

       

发表评论