2017-04-21 51 views
0

成功したかどうかを確認する方法を、私はこのようないくつかのクエリをリフレッシュしています:接続リフレッシュエクセル2016 VBAで

MyWorkbook.Connections(MyConnectionName).Refresh 

コードが実行されると、エラーが発生しなかっされた後、私は、砂時計のアイコンことがわかりほとんどのクエリは数秒間回転しています。

すべてのリフレッシュが完了した後で、成功を確認できますか?私のコードは、コードが終了した後でも、クエリが更新される前にエラーが発生したかどうかを知ることはできないと懸念しています。

私はRefreshAllを実行したくありません。一部のクエリは他のクエリに依存しているため(ソースとして使用するため)、RefreshAllは実行しません。依存するクエリが依存するクエリの後に更新されるように、それらを特定のシーケンスで更新します。

UPDATE:

は、私は、Connectionオブジェクトは、このチェックを行うために使用することができように一見見えた読み取り専用RefreshDate性質を持っていることを参照してください。

MyWorkbook.Connections(MyConnectionName).OLEDBConnection.RefreshDate 

しかし、それはdoesnのやっているようだ。私はそれをチェックしようとするエラーを取得します。 Variant変数をそのRefreshDateプロパティに設定すると、変数は "Empty"として表示されます。ソースはSQLサーバーデータベースです。

答えて

4

QueryTableオブジェクトは、2つのイベント:BeforeRefreshAfterRefreshを公開します。

パラダイムを手続き型/命令型からイベントドリブンに変更する必要があります。

は、あなたが(WithEventsはクラスだけでできるため、標準の手続き型のコードモジュールでは動作しません)ThisWorkbookにこのコードを持って言う:

Option Explicit 
Private WithEvents table As Excel.QueryTable 
Private currentIndex As Long 
Private tables As Variant 

Private Sub table_AfterRefresh(ByVal Success As Boolean) 
    Debug.Print table.WorkbookConnection.Name & " refreshed. (success: " & Success & ")" 
    currentIndex = currentIndex + 1 
    If Success And currentIndex <= UBound(tables) Then 
     Set table = tables(currentIndex) 
     table.Refresh 
    End If 
End Sub 

Public Sub Test() 
    tables = Array(Sheet1.ListObjects(1).QueryTable, Sheet2.ListObjects(1).QueryTable) 
    currentIndex = 0 
    Set table = tables(currentIndex) 
    table.Refresh 
End Sub 

tables変数がQueryTableオブジェクトの配列が含まれています、あなたがそれらをリフレッシュすることを望む順序で注文される;変数currentIndexは、配列内のインデックスを指しています(QueryTable)。

ときTest実行するので、我々は彼らをリフレッシュしたいために、我々はリフレッシュしたいQueryTableオブジェクトとtables配列、を初期化します。 table.Refreshが呼び出されたとき

暗黙の、イベント駆動型のループが始まるとQueryTableはそのAfterRefreshイベントを発生させます。そして、我々は成功を報告し、リフレッシュのみがあれば(配列内の次のQueryTableとイベントプロバイダtableオブジェクト参照を更新します成功した)、Refreshメソッドを呼び出すと、配列全体がトラバースされているか1つが更新に失敗するまでAfterRefreshを再度起動します。

+1

ありがとう、それは素晴らしい作品です。私は1つのクエリが接続のみだったので、テーブルにロードしてListObjectとクエリテーブルを持つようにしなければなりませんでした。ファイルサイズが少し増えましたが、これを稼働させるにはわずかな代償しかかかりませんでした。 –

関連する問題