Tengo un libro de trabajo con 20 tablas dinámicas diferentes. ¿Hay alguna manera fácil de encontrar todas las tablas dinámicas y actualizarlas en VBA?
84
Si.
ThisWorkbook.RefreshAll
O, si su versión de Excel es lo suficientemente antigua,
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
método por alguna razón no funciona, siApplication.Calculation = xlCalculationManual
. Establezca la propiedad de cálculo enApplication.Calculation = xlCalculationAutomatic
antes de usar el código.Update
después delRefreshTable
? ¿Cuál es la diferencia entre los dos?Este código VBA actualizará todas las tablas / gráficos dinámicos en el libro de trabajo.
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
Otra opción no programática es:
Esto actualizará la tabla dinámica cada vez que se abra el libro.
fuente
ActiveWorkbook.RefreshAll
actualiza todo, no solo las tablas dinámicas sino también las consultas ODBC. Tengo un par de consultas de VBA que se refieren a conexiones de datos y el uso de esta opción se bloquea cuando el comando ejecuta las conexiones de datos sin el detalle proporcionado por el VBARecomiendo la opción si solo desea que se actualicen los pivotes
Sub RefreshPivotTables() Dim pivotTable As PivotTable For Each pivotTable In ActiveSheet.PivotTables pivotTable.RefreshTable Next End Sub
fuente
En determinadas circunstancias, es posible que desee diferenciar entre una tabla dinámica y su PivotCache. La caché tiene su propio método de actualización y sus propias colecciones. Así que podríamos haber actualizado todos los PivotCaches en lugar de las PivotTables.
¿La diferencia? Cuando crea una nueva tabla dinámica, se le pregunta si la desea basándose en una tabla anterior. Si dice que no, esta tabla dinámica obtiene su propia caché y duplica el tamaño de los datos de origen. Si dice que sí, mantiene su WorkBook pequeño, pero lo agrega a una colección de tablas dinámicas que comparten una única caché. La colección completa se actualiza cuando actualiza cualquier tabla dinámica en esa colección. Por lo tanto, puede imaginar cuál podría ser la diferencia entre actualizar cada caché en el WorkBook, en comparación con actualizar cada tabla dinámica en el WorkBook.
fuente
Hay una opción para actualizar todo en la barra de herramientas de la tabla dinámica. Es suficiente. No tienes que hacer nada más.
Presione ctrl + alt + F5
fuente
Tiene una colección de tablas dinámicas en un objeto VB Worksheet . Entonces, un ciclo rápido como este funcionará:
Sub RefreshPivotTables() Dim pivotTable As PivotTable For Each pivotTable In ActiveSheet.PivotTables pivotTable.RefreshTable Next End Sub
Notas de las trincheras:
¡Buena suerte!
fuente
El código
Private Sub Worksheet_Activate() Dim PvtTbl As PivotTable Cells.EntireColumn.AutoFit For Each PvtTbl In Worksheets("Sales Details").PivotTables PvtTbl.RefreshTable Next End Sub
funciona bien.
El código se usa en el módulo de hoja de activación, por lo que muestra un parpadeo / falla cuando se activa la hoja.
fuente
Incluso podemos actualizar una conexión en particular y, a su vez, actualizará todos los pivotes vinculados a ella.
Para este código, he creado una cortadora de datos a partir de la tabla presente en 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
fuente
He usado el comando que se enumera a continuación en el pasado reciente y parece funcionar bien.
Espero que ayude.
fuente
Si está utilizando MS Excel 2003, vaya a Ver-> Barra de herramientas-> Tabla dinámica Desde esta barra de herramientas, podemos actualizar haciendo clic este símbolo.
fuente