web-dev-qa-db-ja.com

タイムスケジュール内で外部データソースとピボットテーブルの両方を一緒に更新する

私の最後の投稿で 最初の実行時にExcelのピボットテーブルデータを自動更新する 、私は最初の実行でqueryfromExternal data sourceが更新され、実行に約1分かかります。 2回目の実行では、ピボットテーブルが更新されます。

タイムスケジュール内で外部データソースとピボットテーブルの両方を一緒に更新するソリューション(VBAコード)はありますか(タイマーを設定した場合) command button

10
user42995

接続プロパティで、[バックグラウンド更新を有効にする]のチェックを外します。これにより、他のプロセスが発生したときのバックグラウンドではなく、指示されたときに接続が更新されます。

バックグラウンド更新を無効にすると、VBAプロシージャは外部データが更新されるのを待ってから次のコード行に移動します。

次に、次のコードを変更します。

ActiveWorkbook.Connections("CONNECTION_NAME").Refresh
Sheets("SHEET_NAME").PivotTables("PIVOT_TABLE_NAME").PivotCache.Refresh

VBAでバックグラウンド更新をオフにすることもできます。

ActiveWorkbook.Connections("CONNECTION_NAME").ODBCConnection.BackgroundQuery = False
23
Alex

上記の回答を使用しましたが、RefreshAllメソッドを使用しました。また、名前を指定せずに複数の接続を許可するように変更しました。次に、これをスプレッドシートのボタンにリンクしました。

Sub Refresh()

    Dim conn As Variant

    For Each conn In ActiveWorkbook.Connections
        conn.ODBCConnection.BackgroundQuery = False
    Next conn

    ActiveWorkbook.RefreshAll
End Sub
11
jpuck1054700

Background QueryプロパティをFalseに設定することなく、更新が完了するまでExcelを待機させる簡単な方法があると思います。なぜ人々の好みを混乱させるのですか?

Excel 2010(およびそれ以降)には、CalculateUntilAsyncQueriesDoneと呼ばれるこのメソッドがあり、RefreshAllメソッドを呼び出した後、このメソッドを呼び出す必要があります。 Excelは計算が完了するまで待機します。

ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone

モデルを他の人に送信する前に、通常、これらのことを組み合わせて、マスターの計算を中断することなく実行します。このようなもの:

ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
Application.CalculateFullRebuild
Application.CalculateUntilAsyncQueriesDone
4
Ejaz Ahmed

自動更新たとえば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

:)

0
FABZ

私はこのソリューションをオンラインで見つけましたが、これはかなりうまく対処しました。私の唯一の懸念は、すべてのピボットをループすることであり、クエリが多くあるとクエリに時間がかかる可能性があります。

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
0
Mark S.