2008-09-16 21 views

Répondre

138

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 
+13

Ooh, un downvote. Après plus de cinq ans, c'est un changement rafraîchissant;) – GSerg

+1

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

+3

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

1

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:

  1. Souvenez-vous de déprotéger les feuilles protégées avant la mise à jour du tableau croisé dynamique.
  2. Enregistrez souvent.
  3. Je pense de plus et mise à jour en temps voulu ... :)

Bonne chance!

20

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.

5

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

+3

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

8

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.

-2

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.

-1

J'ai utilisé la commande ci-dessous dans un passé récent et cela semble fonctionner correctement.

ActiveWorkbook.RefreshAll 

Espérons que ça aide.

+5

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

12

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 
+1

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

0

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.

0

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