Antworten:
Ja.
ThisWorkbook.RefreshAll
Oder wenn Ihre Excel-Version alt genug ist,
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
Methode funktioniert aus irgendeinem Grund nicht, wenn Application.Calculation = xlCalculationManual
. Setzen Sie die Berechnungseigenschaft auf, Application.Calculation = xlCalculationAutomatic
bevor Sie den Code verwenden.
Update
nachdem das RefreshTable
? Was ist der Unterschied zwischen den beiden?
Dieser VBA-Code aktualisiert alle Pivot-Tabellen / Diagramme in der Arbeitsmappe.
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
Eine andere nicht programmatische Option ist:
Dadurch wird die Pivot-Tabelle jedes Mal aktualisiert, wenn die Arbeitsmappe geöffnet wird.
ActiveWorkbook.RefreshAll
aktualisiert alles, nicht nur die Pivot-Tabellen, sondern auch die ODBC-Abfragen. Ich habe einige VBA-Abfragen, die sich auf Datenverbindungen beziehen, und die Verwendung dieser Option stürzt ab, wenn der Befehl die Datenverbindungen ohne die vom VBA bereitgestellten Details ausführt
Ich empfehle die Option, wenn Sie nur die Drehpunkte aktualisieren möchten
Sub RefreshPivotTables()
Dim pivotTable As PivotTable
For Each pivotTable In ActiveSheet.PivotTables
pivotTable.RefreshTable
Next
End Sub
Unter bestimmten Umständen möchten Sie möglicherweise zwischen einer PivotTable und ihrem PivotCache unterscheiden. Der Cache verfügt über eine eigene Aktualisierungsmethode und eigene Sammlungen. Wir hätten also alle PivotCaches anstelle der PivotTables aktualisieren können.
Der Unterschied? Wenn Sie eine neue Pivot-Tabelle erstellen, werden Sie gefragt, ob Sie sie basierend auf einer vorherigen Tabelle möchten. Wenn Sie Nein sagen, erhält diese Pivot-Tabelle einen eigenen Cache und verdoppelt die Größe der Quelldaten. Wenn Sie "Ja" sagen, halten Sie Ihr WorkBook klein, fügen jedoch eine Sammlung von Pivot-Tabellen hinzu, die einen einzelnen Cache gemeinsam nutzen. Die gesamte Sammlung wird aktualisiert, wenn Sie eine einzelne Pivot-Tabelle in dieser Sammlung aktualisieren. Sie können sich daher vorstellen, was der Unterschied zwischen dem Aktualisieren jedes Caches im WorkBook und dem Aktualisieren jeder Pivot-Tabelle im WorkBook sein könnte.
In der Symbolleiste der Pivot-Tabelle gibt es die Option Alle aktualisieren. Das genügt. Ich muss nichts anderes tun.
Drücken Sie Strg + Alt + F5
Sie haben eine PivotTables- Auflistung für ein VB- Arbeitsblattobjekt . Eine schnelle Schleife wie diese funktioniert also:
Sub RefreshPivotTables()
Dim pivotTable As PivotTable
For Each pivotTable In ActiveSheet.PivotTables
pivotTable.RefreshTable
Next
End Sub
Notizen aus den Gräben:
Viel Glück!
Der Code
Private Sub Worksheet_Activate()
Dim PvtTbl As PivotTable
Cells.EntireColumn.AutoFit
For Each PvtTbl In Worksheets("Sales Details").PivotTables
PvtTbl.RefreshTable
Next
End Sub
funktioniert gut.
Der Code wird im Aktivierungsblattmodul verwendet und zeigt daher ein Flimmern / einen Fehler an, wenn das Blatt aktiviert wird.
Sogar wir können eine bestimmte Verbindung aktualisieren und im Gegenzug werden alle damit verbundenen Pivots aktualisiert.
Für diesen Code habe ich einen Slicer aus einer in Excel vorhandenen Tabelle erstellt :
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
Ich habe den unten aufgeführten Befehl in der jüngeren Vergangenheit verwendet und er scheint gut zu funktionieren.
ActiveWorkbook.RefreshAll
Hoffentlich hilft das.