私の最後の投稿で 最初の実行時にExcelのピボットテーブルデータを自動更新する 、私は最初の実行でqueryfromExternal data sourceが更新され、実行に約1分かかります。 2回目の実行では、ピボットテーブルが更新されます。
タイムスケジュール内で外部データソースとピボットテーブルの両方を一緒に更新するソリューション(VBAコード)はありますか(タイマーを設定した場合) command button
?
接続プロパティで、[バックグラウンド更新を有効にする]のチェックを外します。これにより、他のプロセスが発生したときのバックグラウンドではなく、指示されたときに接続が更新されます。
バックグラウンド更新を無効にすると、VBAプロシージャは外部データが更新されるのを待ってから次のコード行に移動します。
次に、次のコードを変更します。
ActiveWorkbook.Connections("CONNECTION_NAME").Refresh
Sheets("SHEET_NAME").PivotTables("PIVOT_TABLE_NAME").PivotCache.Refresh
VBAでバックグラウンド更新をオフにすることもできます。
ActiveWorkbook.Connections("CONNECTION_NAME").ODBCConnection.BackgroundQuery = False
上記の回答を使用しましたが、RefreshAllメソッドを使用しました。また、名前を指定せずに複数の接続を許可するように変更しました。次に、これをスプレッドシートのボタンにリンクしました。
Sub Refresh()
Dim conn As Variant
For Each conn In ActiveWorkbook.Connections
conn.ODBCConnection.BackgroundQuery = False
Next conn
ActiveWorkbook.RefreshAll
End Sub
Background QueryプロパティをFalseに設定することなく、更新が完了するまでExcelを待機させる簡単な方法があると思います。なぜ人々の好みを混乱させるのですか?
Excel 2010(およびそれ以降)には、CalculateUntilAsyncQueriesDoneと呼ばれるこのメソッドがあり、RefreshAllメソッドを呼び出した後、このメソッドを呼び出す必要があります。 Excelは計算が完了するまで待機します。
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
モデルを他の人に送信する前に、通常、これらのことを組み合わせて、マスターの計算を中断することなく実行します。このようなもの:
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
Application.CalculateFullRebuild
Application.CalculateUntilAsyncQueriesDone
自動更新たとえば5秒ごとのワークブック。 モジュールに適用
Public Sub Refresh()
'refresh
ActiveWorkbook.RefreshAll
alertTime = Now + TimeValue("00:00:05") 'hh:mm:ss
Application.OnTime alertTime, "Refresh"
End Sub
開いているワークブックに適用
Private Sub Workbook_Open()
alertTime = Now + TimeValue("00:00:05") 'hh:mm:ss
Application.OnTime alertTime, "Refresh"
End Sub
:)
私はこのソリューションをオンラインで見つけましたが、これはかなりうまく対処しました。私の唯一の懸念は、すべてのピボットをループすることであり、クエリが多くあるとクエリに時間がかかる可能性があります。
Sub RefreshTables()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim objList As ListObject
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
For Each objList In ws.ListObjects
If objList.SourceType = 3 Then
With objList.QueryTable
.BackgroundQuery = False
.Refresh
End With
End If
Next objList
Next ws
Call UpdateAllPivots
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Sub UpdateAllPivots()
Dim pt As PivotTable
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
For Each pt In ws.PivotTables
pt.RefreshTable
Next pt
Next ws
End Sub