IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème de format non étendu sur un ListObject (exécution asynchrone?)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 717
    Par défaut Problème de format non étendu sur un ListObject (exécution asynchrone?)
    Bonjour,

    Voici un problème auquel je ne trouve pas de solution.
    A partir d'une table contenant des lignes pour tous les fournisseurs, je souhaite générer un fichier par fournisseur en filtrant cette table successivement pour chaque fournisseur (et en enlevant la colonne avec le nom du fournisseur).
    Sujet très simple à la base.

    Pour cela, j'ai choisi la structuration suivante:
    • Feuille FullTableSheet: Tableau structuré avec les lignes pour tous les fournisseurs
    • Feuille TemplateSheet: Feuille servant de modèle pour les fichiers à générer. L'idée est de la remplir successivement pour chaque fournisseur et d'en faire une copie dans un nouveau fichier Excel.

    Plutôt qu'un filtre élaboré, j'ai choisi de compléter le tableau structuré de la TemplateSheet via une requête Power Query prenant en paramètre d'entrée le nom du fournisseur courant (stocké dans une case Excel).
    Je pilote en VBA le changement de fournisseur dans la case Excel, le refresh de la requête PQ puis la copie de la feuille dans un nouveau classeur, tout cela dans une boucle.

    Fonctionnellement, pas de souci, le contenu des fichiers est correct. Mon problème concerne la mise en forme qui n'est pas correctement étendue sur tout le tableau structuré des fichiers générés alors que la mise en forme est bien appliquée à la colonne du tableau structuré de l'onglet copié (celui de la TemplateSheet).
    Il semble y avoir un problème d’exécution asynchrone des instructions VBA:
    Juste après le Refresh de la requête Power Query, le format n'a pas encore été étendu à toutes les lignes au moment de la copie de l'onglet.
    Insérer des instructions DoEvents, Application.Calculate / .CalculationState en boucle avec tempo ou même un Wait avec Now + 5s entre le Refresh de la connexion et la copie de la feuille ne change rien.


    NB1: Lors de l'exécution du code VBA en pas à pas, cela fonctionne comme attendu (si j'attends 1 ou 2s; en revanche ça échoue si je passe trop vite du refresh à la copie avec F8).

    NB2: L'exécution en arrière plan est désactivée pour la requête PQ pour justement avoir un traitement synchrone:
    Nom : Img2.png
Affichages : 315
Taille : 6,9 Ko

    NB3: Les MFC sont systématiquement étendues correctement à toute la table; seule la mise en forme statique échoue systématiquement sur les lignes autres que la 1ère (typ. retour à la ligne automatique, bordure, centrage):
    Nom : Img1.png
Affichages : 319
Taille : 170,1 Ko

    NB4: J'ai essayé de jouer sur les 3 options de tableau ci-dessous sans succès:
    Nom : Img3.png
Affichages : 308
Taille : 11,1 Ko

    NB5: Problème vu sur Excel 2016 et reproduit sur Excel 2019. J'avais déjà rencontré d'autres problèmes d'exécution asynchrone sur VBA en passant de 2010 à 2016 mais je ne peux pas tester mon code sur 2010 pour comparer à cause du script PQ.

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Sub GenerateSupplierFiles()
        'Fonction de génération des fichiers de prévisions fournisseur
        'Génère un fichier par fournisseur en se basant sur l'onglet template
        Dim rg As Range
        Dim facility As String
        Dim supplierDico As New Scripting.Dictionary
        Dim folderPath As String
        Dim supplierObj
     
        'Récupération du libellé de l'établissement
        facility = "505"
     
        'Vérification du chemin d'enregistrement
        folderPath = "C:\tmp\"
     
        'Remplissage du dictionnaire des fournisseurs (occurrence unique)
        For Each rg In FullTableSheet.Range("Prévisions_Fournisseur[Nom Fournisseur]")
            supplierDico(rg.Value2) = ""
        Next rg
     
        'Boucle créant un fichier par fournisseur (via copie de l'onglet template)
        For Each supplierObj In supplierDico.Keys
            'La plage nommée "Fournisseur" est le paramètre d'entrée de la connexion STR_QUERY_SingleSupplierForecasts;
            'elle doit être mise à jour avant le rafraîchissement de la connexion
            TemplateSheet.Range("Fournisseur") = supplierObj
     
            'Rafraîchissement de la connexion PQ
            ThisWorkbook.Connections("Requête - Prévisions Pour Un Fournisseur").Refresh
     
            '***************************************************
            'C'est manifestement ici que le problème se passe
            '***************************************************
     
            'Copie vers un nouveau fichier
            TemplateSheet.Copy
     
            'Suppression de la connexion puis enregistrement du nouveau fichier et fermeture
            With ActiveWorkbook
                 .Connections("Requête - Prévisions Pour Un Fournisseur").Delete
                 Application.DisplayAlerts = False 'On désactive temporairement les alertes pour écraser sans avertissement utilisateur le cas échéant
                 .SaveAs Filename:=folderPath & "Prévisions_" & VBA.Format(VBA.Now, "yyyy-mm") & "_" & supplierObj & "_" & facility & ".xlsx", FileFormat:=xlOpenXMLWorkbook
                 Application.DisplayAlerts = True 'Réactivation des alertes
                 .Close SaveChanges:=False
            End With
        Next supplierObj
     
        MsgBox "Traitement terminé: les prévisions ont été générées avec succès pour tous les fournisseurs.", vbOKOnly
    End Sub
    Avez-vous une idée de la cause?
    (en solution, je pourrais reconfigurer les styles par VBA mais j'aimerais éviter et surtout comprendre le problème)

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 717
    Par défaut
    Bonsoir,

    Mon problème d'exécution asynchrone n'inspire personne?

  3. #3
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 290
    Par défaut
    Bonjour

    J'ai déjà été confronté à ce genre de problème en voulant générer 50 fichiers pour chacun des 50 périmètres managériaux de ma société.
    J'étais parti avec un fichier maître et des fichiers fils qui récupéraient les données via Power Query
    Mais finalement, je suis reparti à chaque fois du "maître" en supprimant les lignes des tableaux <>"Mon périmètre", puis en actualisant tous les TCD associés.
    Un fichier de base d'environ 3 Mo, génération par macro de 10 fichiers par minute donc en 5 mn j'avais mes 50 fichiers (de 100 à 300 ko suivant la volumétrie de chaque périmètre)

    Stéphane

Discussions similaires

  1. [BO XI R2] Problème de format de date sur invite
    Par jpcreux dans le forum Webi
    Réponses: 18
    Dernier message: 23/03/2018, 15h42
  2. Réponses: 11
    Dernier message: 30/10/2014, 16h28
  3. [XL-2007] Problème de format de données sur importation de fichier texte.
    Par Axe_Débutant dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/04/2013, 12h41
  4. Problème de membres non renseignés sur Jpivot
    Par juju05 dans le forum Mondrian
    Réponses: 0
    Dernier message: 05/04/2010, 13h37
  5. Réponses: 2
    Dernier message: 08/02/2008, 20h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo