Dans mon dernier message Actualisation automatique des données des tableaux croisés dynamiques dans Excel lors de la première exécution , j’ai constaté que lors de mon première exécution, la requête de la source de données External est actualisée et prend environ 1 min pour exécuter. et dans ma deuxième manche, les tableaux croisés dynamiques sont mis à jour.
Existe-t-il une solution (code VBA) pour actualiser la source de données externe et les tableaux croisés dynamiques dans un calendrier (si nous définissons une minuterie) en cliquant sur command button
?
Sous les propriétés de connexion, décochez "Activer l'actualisation de l'arrière-plan". Cela actualisera la connexion quand on le lui demandera, et non en arrière-plan, car d'autres processus se produisent.
Avec l'actualisation en arrière-plan désactivée, votre procédure VBA attendra l'actualisation de vos données externes avant de passer à la ligne de code suivante.
Ensuite, il vous suffit de modifier le code suivant:
ActiveWorkbook.Connections("CONNECTION_NAME").Refresh
Sheets("SHEET_NAME").PivotTables("PIVOT_TABLE_NAME").PivotCache.Refresh
Vous pouvez également désactiver l'actualisation en arrière-plan dans VBA:
ActiveWorkbook.Connections("CONNECTION_NAME").ODBCConnection.BackgroundQuery = False
J'ai utilisé la réponse ci-dessus, mais j'ai utilisé la méthode RefreshAll. Je l'ai également modifié pour permettre plusieurs connexions sans avoir à spécifier les noms. J'ai ensuite lié cela à un bouton de ma feuille de calcul.
Sub Refresh()
Dim conn As Variant
For Each conn In ActiveWorkbook.Connections
conn.ODBCConnection.BackgroundQuery = False
Next conn
ActiveWorkbook.RefreshAll
End Sub
Je pense qu'il existe un moyen plus simple d'obliger Excel à attendre l'actualisation sans avoir à définir la propriété Background Query sur False. Pourquoi déconner avec les préférences des gens non?
Excel 2010 (et versions ultérieures) utilise cette méthode appelée CalculateUntilAsyncQueriesDone. Tout ce que vous avez à faire est appelée après l'appel de la méthode RefreshAll. Excel attendra que le calcul soit terminé.
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
Je mets généralement ces choses ensemble pour faire un calcul complet complet sans interruption, avant d’envoyer mes modèles à d’autres. Quelque chose comme ça:
ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
Application.CalculateFullRebuild
Application.CalculateUntilAsyncQueriesDone
Actualisation automatique Classeur par exemple toutes les 5 secondes . Appliquer au module
Public Sub Refresh()
'refresh
ActiveWorkbook.RefreshAll
alertTime = Now + TimeValue("00:00:05") 'hh:mm:ss
Application.OnTime alertTime, "Refresh"
End Sub
Appliquer à Workbook on Open
Private Sub Workbook_Open()
alertTime = Now + TimeValue("00:00:05") 'hh:mm:ss
Application.OnTime alertTime, "Refresh"
End Sub
:)