サンプル。指定シートの更新を行ってから待つ
クラス CQtEvents
Option Explicit
Private WithEvents mQryTble As QueryTable
Private mRefreshed As Boolean
Private mCallback As String
Public Property Set QryTble(ByVal QryTable As QueryTable): Set mQryTble = QryTable: End Property
Public Property Get QryTble() As QueryTable: Set QryTble = mQryTble: End Property
Public Property Let Refreshed(ByVal paramRefreshed As Boolean): mRefreshed = paramRefreshed: End Property
Public Property Get Refreshed() As Boolean: Refreshed = mRefreshed: End Property
Public Property Let Callback(ByVal SpecifiedProcName): mCallback = SpecifiedProcName: End Property
Private Sub Class_Initialize()
mRefreshed = False
End Sub
Private Sub mQryTble_BeforeRefresh(Cancel As Boolean)
mRefreshed = False
Debug.Print "*** mQryTble_BeforeRefresh(): Refreshed=" & Refreshed
End Sub
Private Sub mQryTble_AfterRefresh(ByVal Success As Boolean)
mRefreshed = True
Debug.Print "*** mQryTble_AfterRefresh(): Refreshed=" & Refreshed, "Success=" & Success
If mCallback <> "" Then Application.Run mCallback, Success
End Subメインコード
Dim TargetTable As ListObject: Set TargetTable = Sheets("hogehoge").ListObjects(1)
TargetTable.DataBodyRange.Rows.Delete ' いったんテーブルのデータを全てクリア
Dim TargetQueryTable As QueryTable: Set TargetQueryTable = TargetTable.QueryTable
Dim classQtEvents As CQtEvents: Set classQtEvents = New CQtEvents
Set classQtEvents.QryTble = TargetQueryTable
Dim BeforeTime: BeforeTime = Timer
Debug.Print "[Before] TargetQueryTable.Refreshing:" & TargetQueryTable.Refreshing, "Rows.Count: " & TargetTable.Range.Rows.Count
classQtEvents.QryTble.Refresh BackgroundQuery:=False ' クエリ更新を待つ
'Debug.Print "[After] TargetQueryTable.Refreshing:" & TargetQueryTable.Refreshing, "Rows.Count: " & TargetTable.Range.Rows.Count
'Debug.Print "[Completed] " & Format(Timer - BeforeTime, "00:00:00.000")