Problème de rafraichissement des querry dans VBA dans Excel
Bonjour !
Je suis nouveau sur le forum et je dois vous dire que je suis vraiment content de vous avoir trouvés ! Personnellement, je suis encore un néophyte en VBA, mais je commence à m'améliorer. J’ai un problème dans un fichier d’inventaire que je dois créer pour nos clients EDI. Je veux l’automatiser pour pouvoir l’envoyer pendant les week-ends, mais il comprend plusieurs requêtes Power Query : les listes de clients américains et canadiens, la liste d’inventaire, la liste des numéros de référence des clients pour nos produits, les attributs des produits, etc.
Bref, je peux lancer le rafraîchissement des données des requêtes, mais VBA passe à la suivante sans attendre que la précédente soit complétée… Or, il faut vraiment que les requêtes se fassent dans l’ordre pour que le fichier fonctionne ! À un moment, Power Query semble se perdre dans les requêtes et finit par geler. Si j’exécute mes requêtes individuellement, tout fonctionne bien.
J’ai bien essayé de régler cela avec Copilot, sans succès :
______________________________________________________
Dim cn As WorkbookConnection
'Rafraîchir QueryInventoryMelanie
Set cn = ThisWorkbook.Connections("Query - QueryInventoryMelanie")
cn.Refresh
Application.CalculateUntilAsyncQueriesDone ' je pensais que cette ligne dirait a VBA que la requête se termine
PauseTimer ' une routine pour mettre un délais supplémentaire (SVP, voir plus bas)
_________________________________________________________________
Sub PauseTimer(Optional Secondes As Double = 10) ' pour attendre 10 secondes par défaut
Dim t As Double
t = Timer ' timer est le nombre de secondes depuis minuit
Do While Timer < t + Secondes
DoEvents ' garde Excel actif pendant le délais
Loop
End Sub
Auriez-vous des suggestions, SVP? C'est le dernier bub qui me reste a régler pour finir mon projet!
SIgné: un gars pas mal désespéré...
Bonjour
Soit manuellement désactiver une fois pour toute dans les propriétés des requêtes l'actualisation en arrière plan,
Soit le faire par VBA
With ActiveWorkbook
For lCnt = 1 To .Connections.Count
'Excludes PowerPivot and other connections
If .Connections(lCnt).Type = xlConnectionTypeOLEDB Then
.Connections(lCnt).OLEDBConnection.BackgroundQuery = False
End If
Next lCnt
End WithOn peut aussi
utiliser
Range("TableauRésultats").ListObject.QueryTable.Refresh (False)évite aussi le travail en arrière plan mais je pas sûr que cela fonctionne sur un enchaînement de requêtes conduisant à celle qu'on actualise
Bonsoir,
c'est bien de mettre Application.CalculateUntilAsyncQueriesDone après chaque Refresh mais il faut veiller aussi à décocher "Activer l'actualisation en arrière-plan" dans données, connexions existantes, et vous le faites pour chaque connexion.
Pour la pause, vous pouvez mettre ceci (pause de 2 secondes) après chaque Application.CalculateUntilAsyncQueriesDone mais ce ne sera peut-être pas utile ;
Application.Wait (Now + TimeValue("0:00:02"))Bonjour
pour répondre à @78chris
je pas sûr que cela fonctionne sur un enchaînement de requêtes conduisant à celle qu'on actualise
Dans de nombreux projets j'enchaîne les actualisations successives de requêtes sans problème
par exemple pour mettre à jour l'ensemble des tableaux d'un onglet les uns après les autres
Sub Actualise(Nom)
Range(Nom).ListObject.QueryTable.Refresh(False)
End Sub
Sub MàJ_Param()
'ordre d'actualisation non garanti
For Each Tableau In Sheets("XXXX").ListObjects
Actualise (Tableau.Name)
Next Tableau
End Subou encore pour garantir l'ordre d'actualisation si Tableau2 dépend de Tableau1
Sub MàJ()
Actualise ("Tableau1")
Actualise ("Tableau2")
Actualise ("Tableau3")
End Subje ne connaissais pas Application.CalculateUntilAsyncQueriesDone
Stéphane