J'ai un classeur avec 20 tables pivotantes différentes. Y at-il un moyen facile de trouver tous les tableaux croisés dynamiques et les rafraîchir dans VBA?Comment puis-je actualiser toutes les tables pivotantes de mon classeur Excel avec une macro?
Répondre
Oui.
ThisWorkbook.RefreshAll
Ou, si votre version Excel est assez vieux,
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
Vous avez un PivotTables collection sur la VB objet feuille de calcul. Ainsi, une boucle rapide comme cela fonctionnera:
Sub RefreshPivotTables()
Dim pivotTable As PivotTable
For Each pivotTable In ActiveSheet.PivotTables
pivotTable.RefreshTable
Next
End Sub
Remarques des tranchées:
- Souvenez-vous de déprotéger les feuilles protégées avant la mise à jour du tableau croisé dynamique.
- Enregistrez souvent.
- Je pense de plus et mise à jour en temps voulu ... :)
Bonne chance!
Ce code VBA actualisera tous les tableaux croisés dynamiques dans le classeur.
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
Une autre option non-programatic est:
- Faites un clic droit sur chaque tableau croisé dynamique
- Sélectionnez Options du tableau
- Cochez la 'Actualisation à l'ouverture' option de.
- Cliquez sur le bouton OK
Réactualise le tableau croisé dynamique à chaque fois que le classeur est ouvert.
Il existe une option d'actualisation complète dans la barre d'outils Tableau croisé dynamique. C'est assez. Ne pas faire autre chose.
Appuyez sur Ctrl + Alt + F5
Je ne suis pas d'accord. Que se passe-t-il si Lipis veut automatiser le processus d'actualisation par exemple, chaque fois qu'une cellule est modifiée? – StockB
Dans certaines circonstances, vous voudrez peut-être faire la différence entre un tableau croisé dynamique et son PivotCache. Le cache a sa propre méthode d'actualisation et ses propres collections. Nous aurions donc pu rafraîchir tous les PivotCaches au lieu des PivotTables.
La différence? Lorsque vous créez un nouveau tableau croisé dynamique, il vous est demandé si vous le souhaitez en fonction d'un tableau précédent. Si vous dites non, ce tableau croisé dynamique obtient son propre cache et double la taille des données source. Si vous dites oui, vous gardez votre WorkBook petit, mais vous ajoutez à une collection de tableaux croisés dynamiques qui partagent un seul cache. La collection entière est actualisée lorsque vous actualisez un seul tableau croisé dynamique dans cette collection. Vous pouvez donc imaginer la différence entre l'actualisation de chaque cache du WorkBook et l'actualisation de chaque Table de Pivot dans le WorkBook.
Si vous utilisez MS Excel 2003, accédez à Affichage-> Barre d'outils-> Tableau croisé dynamique Dans cette barre d'outils, nous pouvons effectuer une actualisation en cliquant sur!ce symbole.
J'ai utilisé la commande ci-dessous dans un passé récent et cela semble fonctionner correctement.
ActiveWorkbook.RefreshAll
Espérons que ça aide.
Ca aide beaucoup ... mais tu n'as pas vu que c'est en fait écrit dessus? Comme il y a 4 ans ?! (http://stackoverflow.com/a/70976/8418) – Lipis
ActiveWorkbook.RefreshAll
rafraîchit tout, pas seulement les tables pivotantes mais aussi les requêtes ODBC. J'ai quelques requêtes VBA qui font référence à des connexions de données et à l'aide des accidents d'options que la commande exécute les connexions de données sans les détails fournis à partir de la VBA
Je recommande l'option si vous ne souhaitez que les pivots rafraîchis
Sub RefreshPivotTables()
Dim pivotTable As PivotTable
For Each pivotTable In ActiveSheet.PivotTables
pivotTable.RefreshTable
Next
End Sub
vérifier la réponse la plus votée .. la deuxième approche est en fait ce que vous avez essayé ici .. mais pour l'ensemble du boom .. non seulement pour la feuille active .. soit cas ça dépend vraiment .. et je n'ai pas le toucher depuis .. – Lipis
Le 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
fonctionne très bien.
Le code est utilisé dans le module de feuille d'activation, ainsi il affiche un scintillement/pépin lorsque la feuille est activée.
Même nous pouvons rafraîchir la connexion particulière et à son tour, il rafraîchira tous les pivots qui lui sont liés.
Pour ce code, je l'ai créé trancheuse de table présente dans 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
Ooh, un downvote. Après plus de cinq ans, c'est un changement rafraîchissant;) – GSerg
En effet .. c'est rafraîchissant .. quelqu'un essaie même de fermer cette question hors-sujet ... Ce n'est pas comme si je demandais de le faire seulement en utilisant la souris ou quoi que ce soit : D – Lipis
Fantastique, j'ai dû l'utiliser car je voulais rafraîchir les pivots APRÈS avoir obtenu de nouvelles données externes, alors ThisWorkbook.RefreshAll ne fonctionnait pas pour moi. – Yasskier