Excel VBA - 数据导入后

时间:2016-03-31 19:11:19

标签: excel-vba excel-2010 vba excel

我需要创建一个事件,以便在刷新数据连接(文本文件)后应用某些代码。如何控制数据刷新的时间。

2 个答案:

答案 0 :(得分:1)

在执行任何其他操作之前,请关闭连接上的后台刷新。然后使用ActiveWorkbook.RefreshAll,只要所有连接的后台刷新都关闭,所有放在刷新后的代码都不会执行。

ActiveWorkbook.RefreshAll
other vba code here

答案 1 :(得分:0)

  

如何控制数据刷新的时间。

打开“连接”菜单,然后选择连接,并查看/编辑其属性:

enter image description here

  

我需要创建一个事件,以便在刷新数据连接(文本文件)后应用某些代码。

我从字面上解释了这一点,因为你需要一个事件。幸运的是,它可以做到这一点。它不是像Worksheet_Change这样的内置事件,但它仍然可以通过VBA完成。

如果您创建了一个类对象,那么可以配置一个QueryTable对象 WithEvents,并且您可以捕获两个事件:AfterRefreshBeforeRefresh 。听起来你需要AfterRefresh事件。

如何为QueryTable添加事件处理程序

创建一个名为clsEvents_QueryTable的类模块(或者您可以将其命名为其他内容,只需在其余代码中保持一致)。放下这段代码,这将允许您为QueryTable对象建立事件处理程序,以及两个事件的过程。

Option Explicit
Public WithEvents cQT As Excel.QueryTable

Private Sub Class_Initialize()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets(1)   '## Modify as needed

    Set cQT = ws.QueryTables.Item(1)  '## Modify as needed
End Sub

Private Sub cQT_AfterRefresh(ByVal Success As Boolean)
    '###
    '   Code placed in, or called *from* this procedrure will run AFTER refresh
    MsgBox Me.cQT.Name & " After refreshing..."
End Sub

Private Sub cQT_BeforeRefresh(Cancel As Boolean)
    '###
    '   Code placed in, or called *from* this procedrure will run BEFORE refresh
    MsgBox Me.cQT.Name & " Before refreshing..."
End Sub

将它放在标准模块的顶部:

Public QT As clsEvents_QueryTable

ThisWorkbook模块中,执行以下操作:

Option Explicit

Private Sub Workbook_Open()
    If QT Is Nothing Then
        Set QT = New clsEvents_QueryTable
    End If
End Sub

(你可以在其他模块中做到这一点,但这只是一个例子)。

现在该表有两个事件处理程序,每次刷新QueryTable时,它都会自动调用从事件处理程序中包含或调用的代码。

您可以对此进行扩展以处理多个QueryTable并进行一些修改(使用对象集合等)。