web-dev-qa-db-fra.com

Excel VBA - RefreshAll ne met pas à jour les tableaux croisés dynamiques

J'ai un classeur de modèle, qui a plusieurs tables de données connectées à des connexions SQL, ainsi que des tableaux croisés dynamiques dont les sources sont les données apportées.

J'avais l'impression que ActiveWorkbook.RefreshAll mettrait à jour toutes les connexions, puis mettrait à jour les pivots. C’est ce qui se produit lorsque j’exécute l’actualisation manuellement. Cependant, lorsque je lance VBA (qui est en fait dans Access, mais est correctement référencé, etc.), il met à jour les connexions, mais PAS les tableaux croisés dynamiques? 

J'ai essayé DoEvents après le RefreshAll qui n'a eu aucun effet.

Ma seule option est-elle maintenant d'exécuter un For each dans toutes les feuilles de calcul, les sources de données, les caches pivotants et de les actualiser de cette manière?

6
GavinP

J'ai résolu le problème en utilisant ce qui suit

    For Each sht In .Sheets
        For Each qt In sht.QueryTables
            qt.Refresh
        Next qt
        For Each lo In sht.ListObjects
            lo.QueryTable.Refresh BackgroundQuery:=False
        Next lo
        For Each pvt In sht.PivotTables
            pvt.PivotCache.Refresh
        Next pvt
    Next sht
2
GavinP

ActiveWorkbook.RefreshAll fait comme dans les faits RefreshAll connexions et pivots. Toutefois, dans votre scénario, les pivots sont probablement basés sur les données que vous devez actualiser en premier. Le pivot s'actualise tant que les données ne sont pas encore chargées, d'où le comportement inattendu.

Il y a plusieurs solutions pour cela:

  • Soit que les données renvoyées via la connexion sous forme de pivotcache, le tableau croisé dynamique s'actualise automatiquement lorsque les données sont renvoyées. De cette façon, les données elles-mêmes ne seront pas non plus stockées dans une feuille séparée de votre classeur.

  • Définissez la propriété "Actualiser en arrière-plan" sur false pour toutes les connexions, dans le code ou via l'interface utilisateur, puis exécutez-la normalement. Deux fois . La deuxième fois, les pivots auront les données mises à jour et seront donc actualisés comme prévu. - Edit: Je ne le recommande pas, car vous allez ouvrir la connexion à la base de données deux fois, charger les données deux fois, etc. Très inefficace!

  • Définissez la propriété "Refresh in Background" - sur false, comme indiqué ci-dessus. Après l'actualisation à l'aide de l'option Actualiser tout, parcourez la collection pivotante de vos feuilles de travail pour l'actualiser manuellement après le chargement des données, comme indiqué ci-dessous.

Code:

Sub test()

Dim ws as Worksheet
Dim pt as PivotTable

ActiveWorkbook.RefreshAll 'make sure the refresh in bg property is false for all connections

For each ws in ActiveWorkbook.Worksheets
    For each pt in ws.pivottables
        pt.RefreshTable
    Next pt
Next ws

End Sub

Ou simplement actualiser uniquement les pivots pivot (plus efficace, surtout si plusieurs tables utilisent le même cache):

Sub test()
Dim pc as PivotCache

ActiveWorkbook.RefreshAll 'make sure the refresh in bg property is false for all connections

For each pc in ActiveWorkbook.PivotCaches
    pc.Refresh
Next pc

End Sub
9
Rik Sportel

J'ai résolu le problème en ajoutant un simple 'Calculer' au code.

Calculate
ActiveWorkbook.RefreshAll
0
BuckTurgidson