XL 2016 [RESOLU] Séquençage des rafraichissement de plusieurs tables (Power Query)

Nicocotte125

XLDnaute Nouveau
Bonjour

Encore une fois je vous sollicite, car malgré pas mal de recherches et une certaine dose de remue-méninge je n'arrive pas à résoudre mon pb....
En mode pas à pas (F8) la macro ci-dessous fonctionne à merveille (même en mode F8 mitraillette). A noter que :
  • Les tables mettent entre 1 seconde et 3-4 secondes selon leur taille à se rafraichir
  • Je travaille avec des fichiers en local sur mon poste pour m'éviter toutes déconvenues tragiques du à des pb de réseaux

Mais en mode automatique la macro s'exécute bien plus vite que ne se rafraichissent les requêtes, et les requêtes en viennent à se rafraichir simultanément (ref. pièce jointe). Sachant que J'ai déjà pensé à :
  • Préciser .QueryTable.Refresh BackgroundQuery:=False (même si j'ai lu à droite à gauche que ca n'avait pas forcément un intérêt)
  • Mettre un Timer dans la macro après chaque ligne de code "...Refresh..." mais cela à pour effet de geler l'actualisation de la table, et ne résout en rien le fait que la table suivante veut se synchroniser bien avant que son heure soit arrivée. -> donc aucun intérêt
  • Vérifier que l'actualisation de mes connexions en arrière plan est bien désactivée pour mes quatre tables ! (réf. pièce jointe)
  • Vérifier que chaque ligne de code "...Refresh..." ne commande bien qu'à une seule table

-> Mais rien n'y fait à l'exécution de la Macro ca devient l'anarchie et l'ensemble fini par buguer ! Pas moyen que les choses se fassent dans le bon ordre. Donc si quelqu'un à l'astuce qui m'irait bien je suis preneur.

Pleins de merci en avance !
__________________________________________________
VB:
Sub MAJ_Extraction_X3()


Dim Derniere_Ligne_Article As Variant: Derniere_Ligne_Article = 0
Dim Derniere_Ligne_Commande As Variant: Derniere_Ligne_Commande = 0
Dim Derniere_Ligne_Decor As Variant: Derniere_Ligne_Decor = 0
Dim Derniere_Ligne_Nomenclature As Variant: Derniere_Ligne_Nomenclature = 0
Dim Derniere_Ligne_Stock As Variant: Derniere_Ligne_Stock = 0

Application.CutCopyMode = False
Application.ScreenUpdating = True
Application.Calculation = xlManual
Inhibition_Fonction_Personnalisee = 1
Application.DisplayStatusBar = True
Application.StatusBar = "Initialisation des imports depuis extractions X3"
Application.CommandBars("Workbook Queries").Visible = True


' Mise à jour requête "BdD_yinfdec"--------------------------------------------------------------------------------
    Application.StatusBar = "Import version & B.A.T. étiquette depuis extraction X3"
        If Sheets("BdD yinfdec").FilterMode = True Then
        Sheets("BdD yinfdec").ShowAllData
        Else
        End If
Sheets("BdD yinfdec").ListObjects("BdD_yinfdec").QueryTable.Refresh BackgroundQuery:=False

    Sheets("BdD yinfdec").Calculate
    Derniere_Ligne_Decor = Range(Worksheets("BdD yinfdec").ListObjects("BdD_yinfdec")).Rows.Count + 1
    Sheets("BdD yinfdec").Range("U2").FormulaR1C1 = "=IF(MAX(BdD_Yinfdec[@[Acceptation BAT]],BdD_Yinfdec[@[Envoi BAT]]+Delai_Recep,BdD_Yinfdec[@[Réception réelle BAT]]+Delai_Recep,BdD_Yinfdec[@[Récep prév BAT]]+Delai_Recep)>0,MAX(BdD_Yinfdec[@[Acceptation BAT]],BdD_Yinfdec[@[Envoi BAT]]+Delai_Recep,BdD_Yinfdec[@[Réception réelle BAT]]+Delai_Recep,BdD_Yinfdec[@[Récep prév BAT]]+Delai_Recep),73050)"
    Sheets("BdD yinfdec").Activate
    Sheets("BdD yinfdec").Range("U2").AutoFill Destination:=Range("U2:U" & Derniere_Ligne_Decor)
    Sheets("BdD yinfdec").Calculate
 
    Sheets("BdD yinfdec").Range("U:U").Copy
    Sheets("BdD yinfdec").Range("U:U").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False



' Mise à jour requête "BdD_ystoext"--------------------------------------------------------------------------------
    Application.StatusBar = "Import stock physique et sécurité depuis extraction X3"
        If Sheets("BdD ystoext").FilterMode = True Then
        Sheets("BdD ystoext").ShowAllData
        Else
        End If
Sheets("BdD ystoext").ListObjects("BdD_ystoext").QueryTable.Refresh BackgroundQuery:=False
 
    Sheets("BdD ystoext").Calculate
    Derniere_Ligne_Stock = Range(Worksheets("BdD ystoext").ListObjects("BdD_ystoext")).Rows.Count + 1
    Sheets("BdD ystoext").Range("A2").FormulaR1C1 = "=COUNTIF(Mouvements!C[6],RC[2])"
    Sheets("BdD ystoext").Range("A2").AutoFill Destination:=Range("A2:A" & Derniere_Ligne_Stock)
    Sheets("BdD ystoext").Calculate



' Mise à jour requête "BdD_ycdecrs"--------------------------------------------------------------------------------
    Application.StatusBar = "Import des commandes clients depuis extraction X3"
        If Sheets("BdD ycdecrs").FilterMode = True Then
        Sheets("BdD ycdecrs").ShowAllData
        Else
        End If
Sheets("BdD ycdecrs").ListObjects("BdD_ycdecrs").QueryTable.Refresh BackgroundQuery:=False
 
    Sheets("BdD ycdecrs").Calculate
    Derniere_Ligne_Commande = Range(Worksheets("BdD ycdecrs").ListObjects("BdD_ycdecrs")).Rows.Count + 2
    Sheets("BdD ycdecrs").Range("A3").FormulaR1C1 = "=IF(COUNTIF(Mouvements!C,'BdD ycdecrs'!RC[1])<>0,"""",""X"")"
    Sheets("BdD ycdecrs").Range("B3").FormulaR1C1 = "=""["" &RC[2]&"" #""&RC[4]&""]"""
    Sheets("BdD ycdecrs").Range("A3:B3").AutoFill Destination:=Range("A3:B" & Derniere_Ligne_Commande)
    Sheets("BdD ycdecrs").Calculate
 
    Sheets("BdD ycdecrs").Range("B:B").Copy
    Sheets("BdD ycdecrs").Columns("B:B").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False



' Mise à jour requête "BdD_ycondpal"------------------------------------------------------------------------------
    Sheets("BdD ycondpal").Activate
    Application.StatusBar = "Import des nomenclatures depuis extraction X3"
        If Sheets("BdD ycondpal").FilterMode = True Then
        Sheets("BdD ycondpal").ShowAllData
        Else
        End If
Sheets("BdD ycondpal").ListObjects("BdD_ycondpal").QueryTable.Refresh BackgroundQuery:=False
 
    Derniere_Ligne_Nomenclature = Range(Worksheets("BdD ycondpal").ListObjects("BdD_ycondpal")).Rows.Count + 1
    Sheets("BdD ycondpal").Calculate
    Sheets("BdD ycondpal").Range("A2:A" & Derniere_Ligne_Nomenclature).Font.Name = "Wingdings"
    Sheets("BdD ycondpal").Range("A1").Value = "Arborescence"
    Sheets("BdD ycondpal").Range("B1").Value = "Version"
    Sheets("BdD ycondpal").Range("C1").Value = "Sous-Version"
    Sheets("BdD ycondpal").Range("D1").Value = "BAT"
    Sheets("BdD ycondpal").Range("A2").FormulaR1C1 = "=IF(SUMIF(C[5],RC[7],C[12])<>0,""ý"",""ð"")"
    Sheets("BdD ycondpal").Range("B2").FormulaR1C1 = "=IFERROR(VLOOKUP(RC[6],'BdD yinfdec'!C[-1]:C[2],4,FALSE),"""")"
    Sheets("BdD ycondpal").Range("C2").FormulaR1C1 = "=IFERROR(VLOOKUP(RC[5],'BdD yinfdec'!C[-2]:C[2],5,FALSE),"""")"
    Sheets("BdD ycondpal").Range("D2").FormulaR1C1 = "=SUMIF('BdD yinfdec'!C[-3],BdD_ycondpal[@Composant],'BdD yinfdec'!C[17])"
    Sheets("BdD ycondpal").Range("A2:D2").AutoFill Destination:=Range("A2:D" & Derniere_Ligne_Nomenclature)
    Sheets("BdD ycondpal").Calculate
     
    Sheets("BdD ycondpal").Range("A:D").Copy
    Sheets("BdD ycondpal").Columns("A:D").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False



' Sortie de macro-----------------------------------------------------------------------------------------------------
    Application.StatusBar = "Recalculs"
    Application.Calculation = xlAutomatic
    Inhibition_Fonction_Personnalisee = 0
    Application.CommandBars("Workbook Queries").Visible = False
    Sheets("Planification").Activate
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
         Sheets("Planification").Range("B3").Select
    Application.StatusBar = "Import des extractions : OK"
 
End Sub
 

Pièces jointes

  • Capture.PNG
    Capture.PNG
    21.3 KB · Affichages: 14
  • Capture2.PNG
    Capture2.PNG
    8.3 KB · Affichages: 5
Dernière édition:

Hasco

XLDnaute Barbatruc
Bonjour,

Dans le fichier joint j'ai créé un exemple de ce qu'il est possible de faire.

A partir d'une liste de mots j'ai fait deux Requêtes bateaux dans deux feuilles différentes
Dans le module de code de chacune des feuilles je déclare une variable nommée QT qui gère les évènement Refresh de la QueryTable.

Dans le module Module1:

deux macros l'une qui sera lancée automatiquement après le rafraîchissement de la QueryTable 1 et une autre pour la QueryTable 2 (Sachant qu'une seule et même macro pour les deux pourrait-être appelée)

Et une macro (MiseAJour) qui initialise les variables objet QT de chacune des feuilles et lance leur rafraîchissement.

Bien entendu le contenu des deux macros appelées par les querytable_refresh pourrait être fait dans le module de code de chaque feuille , dans l'évènement refresh lui-même. Mais pour une meilleur lecture, je préfère cette structure.

On peut éventuellement s'arranger également pour que ces macro soient appelées lorsque l'utilisateur clique sur le bouton rafraîchir tout ou l'option 'Actualiser' du menu contextuel des tableaux.

Si vous suivez ce modèle, il vous faudra éventuellement scinder votre code.

Cordialement
 

Pièces jointes

  • Lexique mots français.xlsm
    779.9 KB · Affichages: 3
Dernière édition:

Nicocotte125

XLDnaute Nouveau
Super, merci pour ta réponse.👍

Donc j'en conclu qu'il faut bien forcer la main à Visual Basic pour qu'il n'aille pas plus vite que la musique, en allant chercher l'état d'avancement des "Refresh" au travers des évènements propre à chaque feuille.

Bizarrement, mes recherches sur le WEB ne m'ont jamais guidée vers cette solution.
Je vais tacher de taguer ce post, pour qu'il soit le mieux référencer possible.
 

Hasco

XLDnaute Barbatruc
bonjour,

Merci de ce retour.

Eh oui, il faut laisser le temps au temps. Le temps du rafraîchissement des requêtes n'étant pas le même que celui de l'exécution des macros, il faut prévoir des stratégies différentes pour chacun.

Il y aurait peut-être la possibilité de tester l'état de la propriété .Ready de l'application dans une boucle. Mais cette solution (je ne l'ai pas testée pour des requêtes) risquerait d'entraîner d'autres ralentissements et une lourdeur non désirée.

Les évènements Before_Refresh et After_Refresh des querytable existent, profitons en d'une façon ou d'une autre.

Cordialement
 

Nicocotte125

XLDnaute Nouveau
J'ai testé le séquençage des Query... Mais en réalité le problème n'a pas l'air d'être uniquement un problème de séquençage (peut-être même pas du tout en fait).

L'exécution pas à pas (F8) de ta solution (Merci Roblochon) fonctionne et suis le déroulé prévu, en switchant tantôt sur la page de code du module, tantôt sur les pages de code associées à chaque Feuille concernée (sachant qu'en mode à pas je n'avais également pas de problème non plus),

Mais à nouveau les choses se gâtent en exécution automatique. Bizarrement alors même que la variable "Success" associé à l'évenèment "After_Refresh" est "true" le panneau de requêtes du classeur m'indique que la mise à jour est toujours en cours (molette qui tourne)... Si bien que finalement les mises à jour de données se télescopent et j'ai un nouveau bug qui apparait : "Exception de HRESULT : 0x8000A03EC". A nouveau j'ai tenté de suivre le déroulé avec des MsgBox qui retournent unanimement "tout va bien madame la marquise" ce à quoi me le panneau de requêtes du classeur me répond "Non, non et non, je n'ai pas fini :))

D'après le net l'erreur "Exception de HRESULT : 0x8000A03EC" correspondrait à une incompatibilité d'humeur entre les fichiers Excel version [2010 & - (*.xls)] VS les fichiers Excel [2013 & + (*.xlsx)].

Une fois que cette erreur apparait, plus aucun Query ne veut s'exécuter, même manuellement (Clic droit / Actualiser) depuis la fenêtre de requêtes de classeur, sauf au bout d'un moment OU PARFOIS à force d'inciser à coups de clic droit tout rentre dans l'ordre !

Effectivement l'ERP (Adonis X3 v138) qui me génère les extractions, le fait sur la base de l'ancien format d'Excel (*.xls). Il s'agit d'un ERP qui existait déjà en 2000 à priori :) (à l'époque on se posait la question Netscape ou Internet Explorer) avant que ca ne soit racheter par le bien plus renommé SAGE.

Je vais prendre le temps de (re)macroter Excel pour qu'il ouvre mes bases de données brut au format *.xls en premier lieu, puis qu'il les enregistre au format *.xlsx. En ensuite j'irai orienter les Query vers les chemins des fichiers *.xlsx

Et sinon je ferai autant de bouton adossés à une macro que de Bases de Données à mettre à jour, pour ne pas rester bloquer 107 ans sur ce bug (ce sera tout juste un peu moins ergonomique pour les utilisateurs).

Encore merci
 

Pièces jointes

  • Capture3.PNG
    Capture3.PNG
    5.4 KB · Affichages: 1
Dernière édition:

Nicocotte125

XLDnaute Nouveau
L'enquête se poursuit..

Le format *.xls / *.xlsx n'a rien à voir dans le bug.
Le seul moyen que j'ai trouvé pour faire tourner la macro, c'est de supprimer l'essentiel des instructions qui n'ont rien à voir avec le rafraichissement des Query (l'ensemble des formules / copier / coller que je fais à proximité des tables).

Lorsque que je schunte toutes ses instructions, les mises à jour de Query se déroulent sans heurt. Par contre tant que la macro n'a pas achevé son éxécution le panneau de "requêtes de classeur" me certifie que les Query sont toujours en cours d'actualisation (montant donc à 4 requêtes simultanément en cours d'actualisation dans mon exemple)... D'ailleurs la commande "Actualiser Tout" à le même comportement quand je la lance depuis le menu Excel.

Une fois l'exécution de la macro terminée (et donc quelques secondes après, le panneau de contrôle des "requêtes de classeur" en état de stase), Excel se met à switcher visuellement entre les 4 feuilles comptant des bases de données comme si j'avais codé un "Sheets("xxxxx").Activate" pour chacune des 4 feuilles ! Comme si Excel avait besoin de me montrer qu'il avait bien fait son job (comme ca chef ? :) ) !

J'ai également tenté :
  • De faire appeler la macro par une autre macro...
  • D'insérer un ThisWorkbook.Save (j'ai trouvé cette suggestion qui aurait fonctionner pour certains sur un autre forum)
Mais rien n'y fait tant que du code VBA est en cours d'exécution, le panneau de "requêtes de classeur" me certifie que les Query sont toujours en cours d'actualisation ! Bref il y a quelque chose qui brouille l'esprit à Excel qui ne semble pas pouvoir gérer l'avancement des Refresh et le code VBA simultanément

Si quelque chose vous vient à l'esprit, je suis preneur pour tester, mais pour le moment j'en viens à me dire que je dois d'abord rafraichir les tables (limites à me contenter d'un "Actualiser tout" // ThisWorkBook.RefreshAll) et ensuite je ferai mes manip de formules dans un second temps en passant par un second bouton qui appelle une seconde Macro ....

PS : dans mes recherches, j'ai vu pas mal de gens "galérer" sur des problèmes similaires. J'ai même vu un anglo-saxon finir par écrire du code qui créé son lien query, puis le détruire aussi sec pour récupérer contoruner le problèmes et pouvoir traiter les données dans la suite son code VBA !

Extrait :

VB:
.ListObject.DisplayName = "DummyQueryForKludgeWait"
.Refresh BackgroundQuery:=False
End With
' Now delete link to query, I wish I understood better!
Columns("A:A").Select
Selection.ListObject.QueryTable.Delete
Selection.ClearContents

La bonne nouvelle dans tout ca, c'est que je viens de découvrir que si un Query interroge une fichier *.xls alors il faut souvent reparamétré les formats [DATE] et [NOMBRE DECIMAUX] qui par défaut son sur le modèle anglosaxon et le non le modèle Français. Alors que le simple fait d'enregistrer la base de données brut au format *.xlsx permet à PowerQuery de reconnaitre les formats nativement sans paramétrages de conversion supplémentaires dans PowerQuery.

Au plaisir
 
Dernière édition:

Hasco

XLDnaute Barbatruc
Bonjour,

Merci de ce retour.

Je ne sais pas si excel 2016 possède cette possibilité mais avez vous essayé de requêter au moyen des 'assistants hérités' (dont MS Query) plutôt qu'avec PowerQuery ? Sur 2019 c'est un choix possible à partir de l'onglet 'Données' :
1620012250463.png


Avez-vous testé sur un nouveau classeur, tout beau, tout propre ?

La seule chose que je puisse faire pour vous, c'est vous souhaiter bon courage.

Tenez-nous au courant.

bonne journée
 

Nicocotte125

XLDnaute Nouveau
Non sur Excel 2016, "Assistants hérités" n'existe pas... :-/

Don't worry (c'est déjà super de m'avoir consacré tout ce temps). Dans mon cas après le rafraichissement des Query de toutes façons j'ai un tas d'autres macro à faire exécuter par l'utilisateur. Si bien que j'exécuterai les manip de formule/copier/coller au début de la macro suivante que l'utilisateur lancera lui même.

Pour info j'ai également tester le DoEvents après le Refresh, mais rien n'y fait le panneau de "requêtes de classeur" me certifie que les Query sont toujours en cours d'actualisation.

Etant encore un humble rookie autodidacte sur VBA, grâce à vous j'ai découvert de nouvelles façon de coder (du coup je vais pouvoir potasser les "Modules de classe" et les "Events", etc... pour ma culture G) 👍 👍 👍 .

Merci ;)
 

Nicocotte125

XLDnaute Nouveau
Allelouia...

J'ai trouvé le coupable ! Et je nous ai bien fait perdre du temps ca en fait ce sont les lignes d'AutoFill qui mettaient le "Bazard". Finalement en le faisant précéder d'un Sheets("xxxxxx").Activate, ca passe à merveille !

Voici le code corrigé :
VB:
Public Inhibition_Fonction_Personnalisee As Variant
Public Rafraichissement_Query_En_Cours As Boolean
Public MAJ_Table_En_Cours As Boolean

Sub MAJ_Extraction_X3()

Dim Derniere_Ligne_Article As Variant: Derniere_Ligne_Article = 0
Dim Derniere_Ligne_Commande As Variant: Derniere_Ligne_Commande = 0
Dim Derniere_Ligne_Decor As Variant: Derniere_Ligne_Decor = 0
Dim Derniere_Ligne_Nomenclature As Variant: Derniere_Ligne_Nomenclature = 0
Dim Derniere_Ligne_Stock As Variant: Derniere_Ligne_Stock = 0

'Module pour inhinber le rafraichissement en temps masqué des tables et faire que la macro ne s'éxécute pas plus vite que les rafraichissements de table "Query" -> A DEBUGUER
Dim Table As QueryTable
Dim Feuille As Worksheet
    For Each Feuille In ThisWorkbook.Worksheets
        For Each Table In Feuille.QueryTables
        Table.BackgroundQuery = False
    Next Table
Next Feuille


Application.CutCopyMode = False
Application.ScreenUpdating = True
Application.Calculation = xlManual
Inhibition_Fonction_Personnalisee = 1 'Recalcul_Volatil = 0
Application.DisplayStatusBar = True
Application.StatusBar = "Initialisation des imports depuis extractions X3"
Application.CommandBars("Workbook Queries").Visible = True


    ' Mise à jour requête "BdD_yinfdec"
    Application.StatusBar = "Import version & B.A.T. étiquette depuis extraction X3"
        If Sheets("BdD yinfdec").FilterMode = True Then
        Sheets("BdD yinfdec").ShowAllData
        Else
        End If

    MAJ_Table_En_Cours = True
   
    With ThisWorkbook.Sheets("BdD yinfdec")
    Set .QT = .ListObjects("BdD_yinfdec").QueryTable
    .ListObjects("BdD_yinfdec").QueryTable.Refresh
    End With
   
    While MAJ_Table_En_Cours = True
    'boucle attente pour mise à jour SUCCESSIVE des BdD
    'https://www.excel-downloads.com/threads/resolu-sequencage-des-rafraichissement-de-plusieurs-tables-power-query.20056661/#post-20426564
    Wend
   
    Sheets("BdD yinfdec").Calculate
    Derniere_Ligne_Decor = Range(Worksheets("BdD yinfdec").ListObjects("BdD_yinfdec")).Rows.Count + 1
    Sheets("BdD yinfdec").Range("U2").FormulaR1C1 = "=IF(MAX(BdD_Yinfdec[@[Acceptation BAT]],BdD_Yinfdec[@[Envoi BAT]]+Delai_Recep,BdD_Yinfdec[@[Réception réelle BAT]]+Delai_Recep,BdD_Yinfdec[@[Récep prév BAT]]+Delai_Recep)>0,MAX(BdD_Yinfdec[@[Acceptation BAT]],BdD_Yinfdec[@[Envoi BAT]]+Delai_Recep,BdD_Yinfdec[@[Réception réelle BAT]]+Delai_Recep,BdD_Yinfdec[@[Récep prév BAT]]+Delai_Recep),73050)"
    Sheets("BdD yinfdec").Activate
    Sheets("BdD yinfdec").Range("U2").AutoFill Destination:=Range("U2:U" & Derniere_Ligne_Decor)
    Sheets("BdD yinfdec").Calculate
   
    Sheets("BdD yinfdec").Range("U:U").Copy
    Sheets("BdD yinfdec").Range("U:U").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Sheets("BdD yinfdec").Range("A1").Select
   
   
    ' Mise à jour requête "BdD_ystoext"
    Application.StatusBar = "Import stock physique et sécurité depuis extraction X3"
        If Sheets("BdD ystoext").FilterMode = True Then
        Sheets("BdD ystoext").ShowAllData
        Else
        End If
    MAJ_Table_En_Cours = True
   
    With ThisWorkbook.Sheets("BdD ystoext")
    Set .QT = .ListObjects("BdD_ystoext").QueryTable
    .ListObjects("BdD_ystoext").QueryTable.Refresh
    End With

    While MAJ_Table_En_Cours = True
    'boucle attente pour mise à jour SUCCESSIVE des BdD
    'https://www.excel-downloads.com/threads/resolu-sequencage-des-rafraichissement-de-plusieurs-tables-power-query.20056661/#post-20426564
    Wend
   
    Sheets("BdD ystoext").Calculate
    Derniere_Ligne_Stock = Range(Worksheets("BdD ystoext").ListObjects("BdD_ystoext")).Rows.Count + 1
    Sheets("BdD ystoext").Range("A2").FormulaR1C1 = "=COUNTIF(Mouvements!C[6],RC[2])"
    Sheets("BdD ystoext").Activate
    Sheets("BdD ystoext").Range("A2").AutoFill Destination:=Range("A2:A" & Derniere_Ligne_Stock)
    Sheets("BdD ystoext").Calculate
    Sheets("BdD ystoext").Range("A1").Select


    ' Mise à jour requête "BdD_ycdecrs"
    Application.StatusBar = "Import des commandes clients depuis extraction X3"
        If Sheets("BdD ycdecrs").FilterMode = True Then
        Sheets("BdD ycdecrs").ShowAllData
        Else
        End If
    MAJ_Table_En_Cours = True
   
    With ThisWorkbook.Sheets("BdD ycdecrs")
    Set .QT = .ListObjects("BdD_ycdecrs").QueryTable
    .ListObjects("BdD_ycdecrs").QueryTable.Refresh
    End With
   
    While MAJ_Table_En_Cours = True
    'boucle attente pour mise à jour SUCCESSIVE des BdD
    'https://www.excel-downloads.com/threads/resolu-sequencage-des-rafraichissement-de-plusieurs-tables-power-query.20056661/#post-20426564
    Wend
   
    Sheets("BdD ycdecrs").Calculate
    Derniere_Ligne_Commande = Range(Worksheets("BdD ycdecrs").ListObjects("BdD_ycdecrs")).Rows.Count + 2
    Sheets("BdD ycdecrs").Range("A3").FormulaR1C1 = "=IF(COUNTIF(Mouvements!C,'BdD ycdecrs'!RC[1])<>0,"""",""X"")"
    Sheets("BdD ycdecrs").Range("B3").FormulaR1C1 = "=""["" &RC[2]&"" #""&RC[4]&""]"""
    Sheets("BdD ycdecrs").Activate
    Sheets("BdD ycdecrs").Range("A3:B3").AutoFill Destination:=Range("A3:B" & Derniere_Ligne_Commande)
    Sheets("BdD ycdecrs").Calculate
   
    Sheets("BdD ycdecrs").Range("B:B").Copy
    Sheets("BdD ycdecrs").Columns("B:B").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Sheets("BdD ycdecrs").Range("A1").Select
     
     
    ' Mise à jour requête "BdD_ycondpal"
    Application.StatusBar = "Import des nomenclatures depuis extraction X3"
        If Sheets("BdD ycondpal").FilterMode = True Then
        Sheets("BdD ycondpal").ShowAllData
        Else
        End If
    MAJ_Table_En_Cours = True
   
    With ThisWorkbook.Sheets("BdD ycondpal")
    Set .QT = .ListObjects("BdD_ycondpal").QueryTable
    .ListObjects("BdD_ycondpal").QueryTable.Refresh
    End With
   
    While MAJ_Table_En_Cours = True
    'boucle attente pour mise à jour SUCCESSIVE des BdD
    'https://www.excel-downloads.com/threads/resolu-sequencage-des-rafraichissement-de-plusieurs-tables-power-query.20056661/#post-20426564
    Wend
   
    Derniere_Ligne_Nomenclature = Range(Worksheets("BdD ycondpal").ListObjects("BdD_ycondpal")).Rows.Count + 1
    Sheets("BdD ycondpal").Calculate
    Sheets("BdD ycondpal").Range("A2:A" & Derniere_Ligne_Nomenclature).Font.Name = "Wingdings"
    Sheets("BdD ycondpal").Range("A1").Value = "Arborescence"
    Sheets("BdD ycondpal").Range("B1").Value = "Version"
    Sheets("BdD ycondpal").Range("C1").Value = "Sous-Version"
    Sheets("BdD ycondpal").Range("D1").Value = "BAT"
    Sheets("BdD ycondpal").Range("A2").FormulaR1C1 = "=IF(SUMIF(C[5],RC[7],C[12])<>0,""ý"",""ð"")"
    Sheets("BdD ycondpal").Range("B2").FormulaR1C1 = "=IFERROR(VLOOKUP(RC[6],'BdD yinfdec'!C[-1]:C[2],4,FALSE),"""")"
    Sheets("BdD ycondpal").Range("C2").FormulaR1C1 = "=IFERROR(VLOOKUP(RC[5],'BdD yinfdec'!C[-2]:C[2],5,FALSE),"""")"
    Sheets("BdD ycondpal").Range("D2").FormulaR1C1 = "=SUMIF('BdD yinfdec'!C[-3],BdD_ycondpal[@Composant],'BdD yinfdec'!C[17])"
    Sheets("BdD ycondpal").Activate
    Sheets("BdD ycondpal").Range("A2:D2").AutoFill Destination:=Range("A2:D" & Derniere_Ligne_Nomenclature)
    Sheets("BdD ycondpal").Calculate
       
    Sheets("BdD ycondpal").Range("A:D").Copy
    Sheets("BdD ycondpal").Columns("A:D").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Sheets("BdD ycondpal").Range("A1").Select
   

    ' Sortie de macro
    Application.StatusBar = "Recalculs"
    Application.Calculation = xlAutomatic
    Inhibition_Fonction_Personnalisee = 0 'Recalcul_Volatil = 0

    'Application.CommandBars("Workbook Queries").Visible = False
    Sheets("Planification").Activate
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
   
    Sheets("Planification").Range("B3").Select
    Application.StatusBar = "Import des extractions : OK"
   
End Sub


Et pour une des feuilles contenant l'une des bases de données :

Code:
Option Explicit
Public WithEvents QT As QueryTable

Private Sub QT_AfterRefresh(ByVal Success As Boolean)
    MAJ_Table_En_Cours = False
End Sub
 
Dernière édition:

Hasco

XLDnaute Barbatruc
Re,

C'est vrai parfois, on se fixe sur un truc et c'en est un autre qui est à l'origine des problèmes. Comme vous parliez de séquençage je n'ai pas bien regardé toutes les lignes de vos macros et me suis seulement concentré sur ce qu'elles semblaient vouloir faire.

J'aurai du voir qu' une comme :
Sheets("BdD ycdecrs").Range("A3:B3").AutoFill Destination:=Range("A3:B" & Derniere_Ligne_Commande)
ne pouvait pas fonctionner si la feuille active n'était pas la bonne. Parce que le Range de destination ne sait pas à qui il appartient aussi prend-il par défaut la feuille active.

Vous n'êtes pas obligé d'activer la feuille mais devait pour chaque objet range ou cell lui indiquer la feuille auquel il appartient soit en répétant le nom de la feuille :
Sheets("BdD ycdecrs").Range("A3:B3").AutoFill Destination:=Sheets("BdD ycdecrs").Range("A3:B" & Derniere_Ligne_Commande) (Quoi que ! normalement c'est ça)

Soit en utilisant un Block With, plus clair à la lecture et moins coûteux en resources, par exemple le bloc de lignes :
VB:
Sheets("BdD ycdecrs").Calculate
    Derniere_Ligne_Commande = Range(Worksheets("BdD ycdecrs").ListObjects("BdD_ycdecrs")).Rows.Count + 2
    Sheets("BdD ycdecrs").Range("A3").FormulaR1C1 = "=IF(COUNTIF(Mouvements!C,'BdD ycdecrs'!RC[1])<>0,"""",""X"")"
    Sheets("BdD ycdecrs").Range("B3").FormulaR1C1 = "=""["" &RC[2]&"" #""&RC[4]&""]"""
    Sheets("BdD ycdecrs").Activate
    Sheets("BdD ycdecrs").Range("A3:B3").AutoFill Destination:=Range("A3:B" & Derniere_Ligne_Commande)
    Sheets("BdD ycdecrs").Calculate

Pourrait être écrit comme suit :

Code:
 With Sheets("BdD ycdecrs")
        .Calculate
        Derniere_ligne_commande = .Range("BdD_ycdecrs[#Headers]") + .Range("BdD_ycdecrs").Rows.Count
        .Range("A3").FormulaR1C1 = "=IF(COUNTIF(Mouvements!C,'BdD ycdecrs'!RC[1])<>0,"""",""X"")"
        .Range("B3").FormulaR1C1 = "=""["" &RC[2]&"" #""&RC[4]&""]"""
        .Range("A3:B3").AutoFill Destination:=.Range("A3:B" & Derniere_Ligne_Commande)
        .Calculate
    End With

Ou pour se passer d'autoFill :
Code:
    With Sheets("BdD ycdecrs")
        .Calculate
        Derniere_ligne_commande = .Range("BdD_ycdecrs[#Headers]") + .Range("BdD_ycdecrs").Rows.Count
        .Range("A3:B" & Derniere_ligne_commande).FormulaR1C1 = "=IF(COUNTIF(Mouvements!C,'BdD ycdecrs'!RC[1])<>0,"""",""X"")"
        .Range("B3:B" & Derniere_ligne_commande).FormulaR1C1 = "=""["" &RC[2]&"" #""&RC[4]&""]"""
        .Calculate

    End With

Attention, ne connaissant pas vos Tableaux je ne suis pas certain de l'exactitude du calcul de Derniere_Ligne_Commande

Encore mieux si c'est pour remplir les colonnes d'un tableau structuré sans avoir à calculé la dernière ligne

Code:
    With Sheets("BdD ycdecrs") ' Travailler sur la bonne feuille
        .Calculate
         With .ListObjects("BdD_ycdecrs") ' Sur le tableau structuré
              '
              ' sur la colonne 1 puis la 2 du tableau
              .ListColumns(1).DataBodyRange.FormulaR1C1 = "=IF(COUNTIF(Mouvements!C,'BdD ycdecrs'!RC[1])<>0,"""",""X"")"
              .ListColumns(2).DataBodyRange.FormulR1C1 = "=""["" &RC[2]&"" #""&RC[4]&""]"""
         End With
        .Calculate
    End With

Cordialement
 

Nicocotte125

XLDnaute Nouveau
Exact, c'est subtile mais logique ! j'aurais du répéter le Sheets("xxxxxx"). dans :
....AutoFill Destination:= Sheets("BdD ycdecrs").Range("A3:B" & Derniere_Ligne_Commande)

Pour le With-End With et plus généralement mon codage infame à lire je suis entièrement d'accord. Il faut juste que je torde le cou à mes sales habitudes d'autodidacte..Shame on me :) !

Merci pour tout ! 👍
 
Dernière édition:

Discussions similaires

Haut Bas