20種類のピボットテーブルを含むワークブックがあります。すべてのピボットテーブルを見つけてVBAで更新する簡単な方法はありますか?
回答:
はい。
ThisWorkbook.RefreshAll
または、Excelのバージョンが十分に古い場合は、
Dim Sheet as WorkSheet, Pivot as PivotTable
For Each Sheet in ThisWorkbook.WorkSheets
For Each Pivot in Sheet.PivotTables
Pivot.RefreshTable
Pivot.Update
Next
Next
ThisWorkbook.RefreshAll場合、何らかの理由でこの方法は機能しませんApplication.Calculation = xlCalculationManual。Application.Calculation = xlCalculationAutomaticコードを使用する前に、計算プロパティをに設定します。
このVBAコードは、ブック内のすべてのピボットテーブル/グラフを更新します。
Sub RefreshAllPivotTables()
Dim PT As PivotTable
Dim WS As Worksheet
For Each WS In ThisWorkbook.Worksheets
For Each PT In WS.PivotTables
PT.RefreshTable
Next PT
Next WS
End Sub
別の非プログラムオプションは次のとおりです。
これにより、ワークブックが開かれるたびにピボットテーブルが更新されます。
ActiveWorkbook.RefreshAllピボットテーブルだけでなく、ODBCクエリもすべて更新します。データ接続を参照するVBAクエリがいくつかあり、コマンドがVBAから提供された詳細なしでデータ接続を実行すると、このオプションを使用するとクラッシュします
ピボットのみを更新する場合は、このオプションをお勧めします
Sub RefreshPivotTables()
Dim pivotTable As PivotTable
For Each pivotTable In ActiveSheet.PivotTables
pivotTable.RefreshTable
Next
End Sub
特定の状況では、ピボットテーブルとそのピボットキャッシュを区別したい場合があります。キャッシュには、独自の更新メソッドと独自のコレクションがあります。したがって、ピボットテーブルの代わりにすべてのピボットキャッシュを更新することもできます。
違い?新しいピボットテーブルを作成すると、前のテーブルに基づいてピボットテーブルを作成するかどうかを尋ねられます。いいえと答えた場合、このピボットテーブルは独自のキャッシュを取得し、ソースデータのサイズを2倍にします。「はい」と答えた場合は、ブックを小さく保ちますが、単一のキャッシュを共有するピボットテーブルのコレクションに追加します。コレクション内の単一のピボットテーブルを更新すると、コレクション全体が更新されます。したがって、ワークブック内のすべてのピボットテーブルを更新する場合と、ワークブック内のすべてのキャッシュを更新する場合の違いは想像できます。
ピボットテーブルツールバーには、[すべて更新]オプションがあります。それは十分です。他に何もする必要はありません。
Ctrl + Alt + F5を押します
あなたは持っているピボットテーブルのVBにコレクションをワークシートオブジェクト。したがって、次のようなクイックループが機能します。
Sub RefreshPivotTables()
Dim pivotTable As PivotTable
For Each pivotTable In ActiveSheet.PivotTables
pivotTable.RefreshTable
Next
End Sub
塹壕からのメモ:
幸運を!
コード
Private Sub Worksheet_Activate()
Dim PvtTbl As PivotTable
Cells.EntireColumn.AutoFit
For Each PvtTbl In Worksheets("Sales Details").PivotTables
PvtTbl.RefreshTable
Next
End Sub
正常に動作します。
コードはシートのアクティブ化モジュールで使用されるため、シートがアクティブ化されるとちらつき/グリッチが表示されます。
特定の接続を更新することもでき、その接続にリンクされているすべてのピボットが更新されます。
このコードでは、Excelにあるテーブルからスライサーを作成しました。
Sub UpdateConnection()
Dim ServerName As String
Dim ServerNameRaw As String
Dim CubeName As String
Dim CubeNameRaw As String
Dim ConnectionString As String
ServerNameRaw = ActiveWorkbook.SlicerCaches("Slicer_ServerName").VisibleSlicerItemsList(1)
ServerName = Replace(Split(ServerNameRaw, "[")(3), "]", "")
CubeNameRaw = ActiveWorkbook.SlicerCaches("Slicer_CubeName").VisibleSlicerItemsList(1)
CubeName = Replace(Split(CubeNameRaw, "[")(3), "]", "")
If CubeName = "All" Or ServerName = "All" Then
MsgBox "Please Select One Cube and Server Name", vbOKOnly, "Slicer Info"
Else
ConnectionString = GetConnectionString(ServerName, CubeName)
UpdateAllQueryTableConnections ConnectionString, CubeName
End If
End Sub
Function GetConnectionString(ServerName As String, CubeName As String)
Dim result As String
result = "OLEDB;Provider=MSOLAP.5;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error;Update Isolation Level=2"
'"OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False"
GetConnectionString = result
End Function
Function GetConnectionString(ServerName As String, CubeName As String)
Dim result As String
result = "OLEDB;Provider=MSOLAP.5;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error;Update Isolation Level=2"
GetConnectionString = result
End Function
Sub UpdateAllQueryTableConnections(ConnectionString As String, CubeName As String)
Dim cn As WorkbookConnection
Dim oledbCn As OLEDBConnection
Dim Count As Integer, i As Integer
Dim DBName As String
DBName = "Initial Catalog=" + CubeName
Count = 0
For Each cn In ThisWorkbook.Connections
If cn.Name = "ThisWorkbookDataModel" Then
Exit For
End If
oTmp = Split(cn.OLEDBConnection.Connection, ";")
For i = 0 To UBound(oTmp) - 1
If InStr(1, oTmp(i), DBName, vbTextCompare) = 1 Then
Set oledbCn = cn.OLEDBConnection
oledbCn.SavePassword = True
oledbCn.Connection = ConnectionString
oledbCn.Refresh
Count = Count + 1
End If
Next
Next
If Count = 0 Then
MsgBox "Nothing to update", vbOKOnly, "Update Connection"
ElseIf Count > 0 Then
MsgBox "Update & Refresh Connection Successfully", vbOKOnly, "Update Connection"
End If
End Sub
最近、以下のコマンドを使用しましたが、正常に動作しているようです。
ActiveWorkbook.RefreshAll
お役に立てば幸いです。