Attente la fin de l'actualisation pour continuer

Bonjour,

Grâce à PowerQuery (et Chris du forum ;) ), j'ai la possibilité de "charger" automatiquement des données dans mon fichier excel.

Je clique sur le bouton "Actualiser".

Et une fois que c'est fait, je lance une macro VBA.

En bref, deux actions (Actualiser + lancer macro).

Ca fonctionne bien, mais je me demandais si il ne serait pas possible de ne déclencher la macro VBA qu'une fois que l'actualisation est terminée.

Ainsi, il y aurait une seule action (lancement de la macro au départ).

J'ai tenté le code ci-dessous, mais l'actualisation n'a malheureusement pas le temps de finir.

Auriez-vous svp une astuce?

'**** Déclarations variables
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim qtb As Excel.QueryTable

Set O = Worksheets("3- Location")

For Each qtb In O.QueryTables
qtb.BackgroundQuery = False 'ne pas exécuter l'actualisation en tache de fond
qtb.Refresh

Next qtb

Set O = Worksheets("4- Department")

For Each qtb In O.QueryTables
qtb.BackgroundQuery = False 'idem
qtb.Refresh

Next qtb

Application.ScreenUpdating = True 'remettre l'actualisation de l'écran

Merci à tous !

Bonsoir

en testant la valeur de .Refreshing qui doit être à True si "en cours" avec une boucle DoEvents :

For Each qtb In O.QueryTables
    qtb.BackgroundQuery = False 'ne pas exécuter l'actualisation en tache de fond
    qtb.Refresh
    Do
        DoEvents
    Loop While qtb.Refreshing = True
Next qtb

Enfin c'est une idée après un petit surf sur le net... L'idée : on boucle "infini" tant que la table est en cours de rafraichissement, sinon on sort, de c efait on passe à la table suivante etc... puis à la feuille suivante... Ce pourrait fonctionner, non ?

@ bientôt

LouReeD

Bonjour,

Merci pour votre réponse.

Ca ne semble pas fonctionner (ça n'attend pas la fin du refresh)

Set O = Worksheets("3- Location")

For Each qtb In O.QueryTables
qtb.BackgroundQuery = False 'ne pas exécuter l'actualisation en tache de fond
qtb.Refresh
    Do
        DoEvents
    Loop While qtb.Refreshing = True

Next qtb

Il y a sinon la solution de mettre en pause la macro mais c'est pas optimal.

Application.Wait Time + TimeSerial(0, 0, 15)

Bonjour,

avez vous essayé de connaitre la valeur renvoyée par qtb.Refreshing ? Perso je n'ai pas fait de test.

Le problème avec Application.Wait c'est que cela fiche l'application et c'est précis à la seconde près.
Avec une petite boucle Do Loop While et un Timer, vous avez la possibilité de régler la tempo au millième de seconde près et de laisser l'utilisateur avoir la main sur l'application :

Tempo = Timer
Do
    DoEvents
Loop While Tempo + 0.001 > Timer

On prend le Timer en début de boucle, on lance la boucle avec DoEvents afin de rendre la main à l'utilisateur, la boucle tourne tant que Tempo + un délais en en seconde est supérieur au Timer. ici la seconde accepte jusqu'à la milliseconde comme dans le code.

@ bientôt

LouReeD

Merci. Ca ne semble pas fonctionner, ou alors je n'ai pas exactement compris ce qu'il faut faire.

Je vais travailler sur un template simplifié et anonymisé pour nous faciliter la tâche.

Un grand merci pour vos réponses, je relancerai le "topic" sous peu.

Bonjour

Dans les paramètres de la requête l'actualisation en arrière plan est bien décochée pour toutes les requêtes ?

Bonjour Chris.

'**** Déclarations variables
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim qtb As Excel.QueryTable

Set O = Worksheets("3- Location")

For Each qtb In O.QueryTables
qtb.BackgroundQuery = False 'ne pas exécuter l'actualisation en tache de fond
qtb.Refresh

Next qtb

Set O = Worksheets("4- Department")

For Each qtb In O.QueryTables
qtb.BackgroundQuery = False 'idem
qtb.Refresh

Next qtb

Set O = Worksheets("5- Cost Center (Optionnel)")

For Each qtb In O.QueryTables
qtb.BackgroundQuery = False 'idem
qtb.Refresh

Next qtb

Set O = Worksheets("7- Positions")

For Each qtb In O.QueryTables
qtb.BackgroundQuery = False 'idem
qtb.Refresh

Next qtb

Set O = Worksheets("7 bis - Position Histo")

For Each qtb In O.QueryTables
qtb.BackgroundQuery = False 'idem
qtb.Refresh

Next qtb

Set O = Worksheets("8- Employés")

For Each qtb In O.QueryTables
qtb.BackgroundQuery = False 'idem
qtb.Refresh

Next qtb

    Tempo = Timer
Do
    DoEvents
Loop While Tempo + 0.001 > Timer

Application.ScreenUpdating = True 'remettre l'actualisation de l'écran

Comme cela?

Voici un exemple, si cela peut aider à une meilleure compréhension de mes propos.

Vous pouvez, si vous le voulez bien, mettre les csv dans un répertoire (chemin du répertoire qui doit être renseigné dans le premier onglet du .xlsm) puis cliquer sur le bouton qui déclenche la macro.

La macro est un TCD "bidon" fait sur un coin de table.

L'idée c'est juste de dire que le TCD se déclenche avant la fin de l'actualisation.

(Je n'ai pas mis les loop car ça ne fonctionnait pas. J'ai préféré faire au plus simple).

692csv-mois-pq-4.xlsm (55.18 Ko)

Bonjour,
Pas de souci apparent après avoir modifié les propriétés des requêtes.
Cdlt.

1092csv-mois-pq-4.xlsm (59.80 Ko)

RE

J'ai modifié les propriétés des requêtes, corrigé l'erreur de casse (employee et non Employee) et je ne constate rien d'anormal

A noter qu'on conseille de créer les TCD manuellement et non pas VBA mais si j'ai bien compris c'est juste pour l'exemple

Le code que tu postes, qui n'est pas celui du classeur, ne peut fonctionner car QueryTables dans le cas de PowerQuery s'applique au tables (listobjects) et non aux feuilles

Dim O As ListObject 'déclare la variable O (Tableau)

    Application.ScreenUpdating = True 'interrompre l'actualisation de l'écran

    Worksheets("4- Department").ListObjects(1).QueryTable.Refresh (False)

    Worksheets("5- Cost Center (Optionnel)").ListObjects(1).QueryTable.Refresh (False)

    Worksheets("7- Positions").ListObjects(1).QueryTable.Refresh (False)

    Worksheets("7 bis - Position Histo").QueryTable.Refresh (False)

    Worksheets("8- Employés").ListObjects(1).QueryTable.Refresh (False)

    Call TCD1

Edit : bonjour Jean-ERic : j'ai voulu tester l'autre code en même temps que je répondais et tu es passé entre temps...

Re,
Bonsoir 78chris,
J'ai l'impression qu'on ne parle pas du même classeur.
Sinon, un TCD en VBA peut être "utile" dans certains cas.
Mais la procédure pique les yeux.
Bonne soirée.

RE

J'ai l'impression qu'on ne parle pas du même classeur.

Si mais il y avait d'une part un classeur joint avec un code VBA dedans et d'autre part un autre code posté là

https://forum.excel-pratique.com/excel/attente-la-fin-de-l-actualisation-pour-continuer-166805#p1032...

et je répondais aux 2 options... En reprenant le fil je vois que c'est LouReed qui est partie sur cette fausse piste...

Bonsoir,

C'est pas la première fois que je dis des conneries et je rassure tout le monde ce n'est pas la dernière non plus !

Je n'ai fait que rapporter le résultat d'un surf, mais je ne suis pas sportif aquatique alors c'es "coulé"!

Pour dire je n'ai même pas pris le trmps de créer un fichier pour faire les tests...

@ bientôt "les grands" du forum

LouReeD

RE

Pas de souci LouReed.

C'était juste pour comprendre d'où venait ce code qui marche pour les requêtes autres que PowerQuery...

Mais pas de soucis de mon côté, je plaisante, j'ai tellement à apprendre à côté de vous tous !

@ bientôt

LouReeD

Un grand merci à tous.

Je constate que ça fonctionne, c'est super.

Du coup, quelles propriétés avez vous changé dans les requêtes?

Car j'aimerais le faire dans mon "vrai" template.

EDIT : avec le code de Chris dans le VBA, ça fonctionne très bien dans mon "vrai template". Un grand merci.

Bonjour

Du coup, quelles propriétés avez vous changé dans les requêtes?
Depuis le volet listant les requêtes dans Excel : clic droit sur chaque requête, propriétés et décocher actualisation en arrière plan

Merci.

C'est ici?

Car je ne trouve pas l'option

image

RE

Depuis le volet listant les requêtes dans Excel

Je suis navré.

Je vois bien que j'ai du mal à trouver quelque chose d'évident.

Mais quand je cherche sur google "volet requête excel" on ne me dirige pas vers excel mais bien sur powerquery...

https://docs.microsoft.com/fr-fr/power-query/queries-pane

Rechercher des sujets similaires à "attente fin actualisation continuer"