Code à exécuter lorsque ActiveWorkbook.Connections(« x »).Refresh est terminé
-
12-11-2019 - |
Question
sélectionner des données à partir d'une source externe
J'ai une connexion de données qui récupère les données à l'aide d'un select
requête du serveur SQL dans une feuille Excel en utilisant un code vba comme celui-ci :
With ActiveWorkbook.Connections("x"). _
OLEDBConnection
.BackgroundQuery = True
.CommandText = Array( _
"SELECT ... FROM ...
...
ActiveWorkbook.Connections("x").Refresh
le tableau croisé dynamique lié aux données importées doit également être actualisé
Cependant, autant que je sache ActiveWorkbook.Connections("x").Refresh
fonctionne de manière asynchrone et je souhaite exécuter du code qui s'exécute une fois l'actualisation terminée, afin de pouvoir exécuter ce code :
Private Sub UpdatePivot()
Dim PV As PivotItem
For Each PV In ActiveSheet.PivotTables("PT1").PivotFields("PN").PivotItems
If PV.Name <> "(blank)" Then
PV.Visible = True
Else
PV.Visible = False
End If
Next
End Sub
mais seulement lorsque les données sont lues
Comment puis-je savoir quand l’actualisation est terminée pour récupérer toutes les données ?
Que dois-je faire pour exécuter uniquement le UpdatePivot
sub une fois l'actualisation terminée sans recourir à sleep
des hacks.
P.S.Parfois, la requête est rapide (<1 seconde), parfois lente (> 30 secondes) selon les données exactes que je sélectionne, qui sont dynamiques.
La solution
Ce n'est pas une solution brillante, mais vous pourriez faire ActiveWorkbook.Connections("x").Refresh
exécuter de manière synchrone en définissant
.BackgroundQuery = False
Une autre solution plus complexe serait d'interroger l'état de la connexion en vérifiant le .Refreshing
propriété à l’intérieur d’une construction de boucle.
Autres conseils
.BackgroundQuery = False
ne garantira PAS une exécution synchrone après l’actualisation des données.
Essayez-le vous-même en créant une requête simple et dans le sous-programme Worksheet_Change, ajoutez du code pour sélectionner quelques cellules.Je peux souvent lancer 2 commandes avant que le cercle d'attente/délai d'attente n'apparaisse.
Je ne peux donc pas déterminer si la requête a renvoyé les bonnes données.J'ai essayé de définir une cellule de référence sur la valeur d'une colonne de requête intermédiaire et j'ai vérifié que les deux sont égales - malheureusement, le Worksheet_Change
l'événement SE DÉCLENCHE DEUX FOIS APRÈS L'ACTUALISATION DES DONNÉES !
Ça me rend fou.J'ai juste besoin d'imprimer un graphique après une actualisation réussie de la requête.