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?
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
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
J'ai résolu le problème en ajoutant un simple 'Calculer' au code.
Calculate
ActiveWorkbook.RefreshAll