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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top