2

次のようなvbaコードを使用し
て、クエリを使用してSQLサーバーからExcelシートにデータを取得するデータ接続があります。select

With ActiveWorkbook.Connections("x"). _
    OLEDBConnection
    .BackgroundQuery = True
    .CommandText = Array( _
    "SELECT ... FROM ...
...
ActiveWorkbook.Connections("x").Refresh

インポートされたデータにリンクされたピボット テーブルも更新する必要があります。
ただし、実行が非同期であることがわかる限りActiveWorkbook.Connections("x").Refresh、更新が完了した後に実行されるコードを実行して、このコードを実行できるようにしたいと考えています。

Private Sub UpdatePivot()
Dim PV As PivotItem

  For Each PV In ActiveSheet.PivotTables("PT1").PivotFields("PN").PivotItems
    If PV.Name <> "(blank)" Then
      PV.Visible = True
    Else
      PV.Visible = False
    End If
  Next
End Sub

ただし、データが読み込まれたときのみ、
すべてのデータを取得して更新が完了したことをどのように知ることができますか? ハックに頼らずに更新が完了した後
にのみサブを実行するにはどうすればよいですか。UpdatePivotsleep

PS 動的な選択している正確なデータに応じて、クエリが高速 (1 秒未満) になることもあれば、低速 (30 秒超) になることもあります。

4

3 に答える 3

2

これは素晴らしい解決策ではありませんが、ActiveWorkbook.Connections("x").Refresh設定することで同期的に実行できます

.BackgroundQuery = False

別のより複雑な解決策は.Refreshing、ループ構造内のプロパティをチェックして接続のステータスをポーリングすることです。

于 2011-05-12T11:49:58.317 に答える
1

.BackgroundQuery = Falseデータ更新後の同期実行は保証されません。

簡単なクエリを作成し、Worksheet_Change サブルーチンにいくつかのセルを選択するコードを追加して、自分で試してみてください。待機/タイムアウトの円が表示される前に、2 つのコマンドを実行することがよくあります。

したがって、クエリが正しいデータを返したかどうかを判断できません。参照セルを中間クエリ列の値に設定しようとしましたが、2つが等しいことを確認しました-残念ながら、Worksheet_Changeイベントはデータ更新時に2回発生します!

これは私を夢中にさせています。クエリの更新が成功した後、グラフを印刷するだけです。

于 2012-07-16T16:00:49.357 に答える
0

これは私のために働いた:

Sheets("Sheet1").ListObjects(1).QueryTable.Refresh BackgroundQuery:=False
于 2021-04-28T17:01:44.403 に答える