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 With

On 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 Sub

ou encore pour garantir l'ordre d'actualisation si Tableau2 dépend de Tableau1

Sub MàJ()
    Actualise ("Tableau1")
    Actualise ("Tableau2")
    Actualise ("Tableau3")
End Sub

je ne connaissais pas Application.CalculateUntilAsyncQueriesDone

Stéphane

Rechercher des sujets similaires à "probleme rafraichissement querry vba"