我需要创建一个事件,以便在刷新数据连接(文本文件)后应用某些代码。如何控制数据刷新的时间。
答案 0 :(得分:1)
在执行任何其他操作之前,请关闭连接上的后台刷新。然后使用ActiveWorkbook.RefreshAll,只要所有连接的后台刷新都关闭,所有放在刷新后的代码都不会执行。
ActiveWorkbook.RefreshAll
other vba code here
答案 1 :(得分:0)
如何控制数据刷新的时间。
打开“连接”菜单,然后选择连接,并查看/编辑其属性:
我需要创建一个事件,以便在刷新数据连接(文本文件)后应用某些代码。
我从字面上解释了这一点,因为你需要一个事件。幸运的是,它可以做到这一点。它不是像Worksheet_Change
这样的内置事件,但它仍然可以通过VBA完成。
如果您创建了一个类对象,那么可以配置一个QueryTable对象 WithEvents
,并且您可以捕获两个事件:AfterRefresh
和BeforeRefresh
。听起来你需要AfterRefresh
事件。
创建一个名为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并进行一些修改(使用对象集合等)。