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 :

Concaténation de Tableaux Structurés via fonction [XL-2019]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2022
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2022
    Messages : 60
    Par défaut Concaténation de Tableaux Structurés via fonction
    Bonjour,

    Je souhaite regrouper dans un Tableau Structuré les données de différents TS (un dans chaque onglet) ayant bien sûr les mêmes colonnes.
    J'ai trouvé dans le forum un exemple de Pierre Fauconnier (27/09/2020) avec fonction MergeTables dont j'essaie de m'inspirer.

    Seulement l'appel de la fonction provoque une erreur de compilation "type argument ByRef incompatible.
    J'ai pourtant bien déclaré l'argument en listObject au début de ma boucle
    Je sèche donc totalement
    Quelqu'un peut-il m'aider svp à avancer ?

    Je joins un fichier exemple avec code (données bidons)
    Test_ConcatenerTS.xlsm
    J'ajouterais que l'objet de cette concaténation est de réaliser un graphique avec les données des seules colonnes telles que reprises dans le TS "tbl_Cumul" figurant en feuille "Cumul". Ce TS est appelé à être remplacé par le TS "Tableau9" objet du nouveau code après concaténation.

    Merci d'avance
    Cordialement

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 146
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Le problème que vous rencontrez provient du fait que vous n'avez pas déclarer les variables objets telles que Lets, tFinal et d'autres
    La première chose à faire pour programmer en VBA sans devoir perdre un temps à chercher ses erreurs c'est d'ajouter l'Option Explicit en tête de module.
    Pour l'ajouter automatiquement, il faut cocher l'option Déclaration des variable obligatoire dans les options du VBE (onglet [Editeur ] de la boîte de dialogue Options

    Personnellement je ferais ce travail à l'aide de Power Query (emballé en quelques clics)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2022
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2022
    Messages : 60
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Le problème que vous rencontrez provient du fait que vous n'avez pas déclarer les variables objets telles que Lets, tFinal et d'autres
    La première chose à faire pour programmer en VBA sans devoir perdre un temps à chercher ses erreurs c'est d'ajouter l'Option Explicit en tête de module.
    Pour l'ajouter automatiquement, il faut cocher l'option Déclaration des variable obligatoire dans les options du VBE (onglet [Editeur ] de la boîte de dialogue Options

    Personnellement je ferais ce travail à l'aide de Power Query (emballé en quelques clics)
    Bonjour Philippe,

    Merci pour l'astuce déclaration des variables qui a effectivement résolu l'erreur.
    Quant à PowerQuery j'ai lu qu'il pourrait être LA solution mais cet outil m'est encore inconnu et je ne comprends pas si il effectue les calculs sur la base d'un code pour automatiser les calculs ...

    Bonne soirée et merci

    Cordialement

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 493
    Par défaut
    Hello,

    Plutôt que passer par VBA,
    je suggère de passer par Power Query, qui est très fort pour réaliser ce genre d'opération.

    Il suffira alors de rafraichir la requête pour obtenir des données à jour.

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    681
    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 : 681
    Par défaut
    Bonjour,

    En phase avec Philippe et deedolith: Power Query semble être la solution la plus efficace.

    Je vois deux possibilités selon ton besoin (chacune ayant ses avantages et inconvénients):

    • Solution 1:Importer chaque table dans une requête indépendante puis créer une requête chapeau combinant toutes ces sous-requêtes.
      • Avantage: idéal si ta liste de tableaux n'est pas trop importante et n'est pas amenée à évoluer car cela permet de tenir compte des évolutions de tes tableaux à chaque actualisation (sans avoir à enregistrer le fichier au préalable). On est dans le mode d'exploitation classique de tableaux par Power Query au sein d'un même fichier.
      • Inconvénients: fastidieux si beaucoup de tableaux à prendre en compte. Problème de faisabilité ou de maintenance (selon le contexte exact) si ton nombre de tableaux est appelé à évoluer.
    • Solution 2: Utiliser le connecteur Excel normalement utilisé pour récupérer les données d'un ou plusieurs classeurs externes.
      • Avantage: possibilité d'être dynamique sur le nombre de tableaux à prendre en compte (en filtrant si nécessaire selon des règles de nommage de ces tableaux).
      • Inconvénient: fonctionne comme avec un classeur externe: il faut enregistrer le classeur avant actualisation pour que Power Query voie les derniers changements dans tes tables sources.



    Un exemple de script pour la solution 2 (généré directement via l'interface graphique de Power Query; je suis parti du connecteur "à partir d'un fichier Excel"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let
        Source = Excel.Workbook(File.Contents("D:\MonChemin\Book1.xlsx"), null, true),
        #"Filtered Rows" = Table.SelectRows(Source, each ([Kind] = "Table")),
        #"Removed Other Columns" = Table.SelectColumns(#"Filtered Rows",{"Name", "Data"}),
        #"Expanded Data" = Table.ExpandTableColumn(#"Removed Other Columns", "Data", {"Column1", "Column2", "Column3"}, {"Column1", "Column2", "Column3"})
    in
        #"Expanded Data"

    Pour la solution 1, il faut utiliser le connecteur "A partir d'un tableau/plage" pour chaque tableau. Puis voici un exemple de la fonction "Combiner" de Power Query qui te permettra de les combiner facilement (même si ce n'est pas exactement ton cas):
    https://www.lecfomasque.com/powerque...es-dans-excel/

    NB: Power Query est dans le menu Données d'Excel.

  6. #6
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 266
    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 266
    Par défaut
    Bonjour

    quand on utilise le connecteur "A partir d'un tableau ou d'une plage" on obtient un code = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content].
    il suffit de supprimer la référence au Tableau1 = Excel.CurrentWorkbook() pour obtenir la liste de tous les tableaux du classeur actuel.
    on filtre éventuellement la liste et on peut tous les combiner ou développer les colonnes qui nous intéressent.

    Pour combiner TOUS les tableaux/plages nommées d'un classeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    = Table.Combine(Excel.CurrentWorkbook()[Content])
    Attention, si on charge cette requête dans une table, elle va s'autoréférencer.
    Mais c'est possible de la charger dans un TCD

    Sinon il faut la filtrer.

    Voici une requête nommée "Synthèse" qui va combiner TOUS les tableaux/plages nommées sauf la table "Synthèse"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let
        Source = Excel.CurrentWorkbook(),
        Filtre = Table.SelectRows(Source, each [Name] <> "Synthèse"),
        Combine = Table.Combine(Filtre[Content])
    in
        Combine
    Notez que les colonnes des plages nommées s'appelleront Column1, Column2...

    Stéphane

  7. #7
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 021
    Par défaut
    Bonjour,
    Puisque nous sommes sur un forum de programmation VBA, je me permets de vous proposer une solution en programmation VBA, en utilisant les fonctions génériques pour gérer les tableaux structurés que vous trouverez dans cette documentation : Fonctions en VBA pour gérer les Tableaux Structurés d’Excel.

    Ce qui donne ce code, en reprenant le fichier joint dans le premier message :

    Code VBA : 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
    '------------------------------------------------------------------------------------------------------
    Sub ConcaternerLesTableaux()
    '------------------------------------------------------------------------------------------------------
    Dim ListeTableaux As Variant
    Dim Synthèse As Range, Tableau As Range
    Dim i As Integer
     
    ' Liste des tableaux sources:
    ListeTableaux = Array("tbl_Histo_AVENIR2_JL1", "tbl_Histo_AVENIR2_JL2", "tbl_Histo_AVENIR2_CH1", "tbl_Histo_AVENIR2_CH2", "tbl_Histo_SPIRIT2")
     
    ' Le tableau de synthèse est effacé (suppression de la ligne 1 à la dernière):
    Set Synthèse = Range("Tableau9")
    Call TS_SupprimerPlusieursLignes(Synthèse, 1, 0)
     
    ' Boucle sur les tableaux sources pour les ajouter à la suite du tableau de synthèse:
    For i = LBound(ListeTableaux) To UBound(ListeTableaux)
        Set Tableau = Range(ListeTableaux(i))
        Call TS_CopierUnTableau(Tableau, Synthèse, TS_AjouterDonnées, TS_Valeurs)
    Next
     
    ' Correction du format des colonnes en reprenant le format du dernier tableau source:
    For i = 1 To TS_Nombre_Colonnes(Synthèse)
        Call TS_FormatColonne(Synthèse, i, TS_InfoCellule(Tableau, i, 1, TS_Format), True)
    Next i
     
    End Sub
    '------------------------------------------------------------------------------------------------------
    '------------------------------------------------------------------------------------------------------
    Cordialement.

  8. #8
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2022
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2022
    Messages : 60
    Par défaut
    Bonjour,

    Merci Laurent pour cette proposition VBA qui répond parfaitement à ma préoccupation avec utilisation de "Array" (plus rapide) et des fonctions personnalisées.

    Encore mille mercis et Bonne fin de WE

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/05/2020, 17h38
  2. Réponses: 7
    Dernier message: 22/05/2019, 08h21
  3. Réponses: 2
    Dernier message: 17/03/2019, 17h16
  4. remplir un tableau de structure via une fonction
    Par B65AcR dans le forum Débuter
    Réponses: 2
    Dernier message: 07/01/2014, 17h06

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