XL 2016 PowerQuery nom des fichiers

steph_29120

XLDnaute Junior
Bonjour,

je réalise 3 "imports" de fichiers par le menu données d'excel 2016 ==>Nouvelle requête à partir d'un classeur.
je souhaiterai ajouter une colonne qui indique le nom du fichier depuis lequel j'ai importer les différents tableaux. : dans ce cas précis 3 noms de fichiers).

bonne journée et merci d'avance

nom du fichiernomprénom
fichier_1martinphilippe
fichier_1avriljean
fichier_2dupontfrançois
fichier_2legendrefrançoise
fichier_3professeurtournesol
 

steph_29120

XLDnaute Junior
1686752742533.png

je ne comprends pas pourquoi on ne peut pas ajouter une colonne qui indique le nom de la table ?
 

Cousinhub

XLDnaute Barbatruc
Re-,
Je pense avoir trouvé...
Une fois que tu as tes 3 requêtes chargées (comme dans l'image ci-dessous), tu fais un clic droit dans la zone "Requête", "Nouvelle requête", "Autres sources", "Requête vide"

1686756885362.png


Tu la renommes "Comb" (par exemple), et tu cliques sur "Éditeur avancé"
Tu mets ce code à la place du code d'origine :
PowerQuery:
let
    Source = Record.ToTable(#sections[Section1]),
    Filtr = Table.SelectRows(Source, each ([Name] <> "Comb")),
    Expand = Table.ExpandTableColumn(Filtr, "Value", {"nom", "prénom"}, {"nom", "prénom"})
in
    Expand

Et normalement, tu obtiens ce que tu veux (regarde le tableau ci-dessus, j'ai rajouté tg pour ti_glazik...
Bon courage

PS, merci à @Amilo pour son code
 

Cousinhub

XLDnaute Barbatruc
Re-,
Afin de s'affranchir des noms de colonnes à développer, mets plutôt ce code dans l'éditeur avancé de la requête "Comb" :
PowerQuery:
let
    Source = Record.ToTable(#sections[Section1]),
    Filtr = Table.SelectRows(Source, each ([Name] <> "Comb")),
    Expand = Table.ExpandTableColumn(Filtr, "Value", Table.ColumnNames(Filtr[Value]{0}), Table.ColumnNames(Filtr[Value]{0}))
in
    Expand
Comme cela, si tu as plus de colonnes, elles seront toutes développées...
Bonne soirée
 

Amilo

XLDnaute Accro
Bonjour le forum, steph_29120, Cousinhub ,

VB:
Expand = Table.ExpandTableColumn(Filtr, "Value", Table.ColumnNames(Filtr[Value]{0}), Table.ColumnNames(Filtr[Value]{0}))
@Cousinhub , si je peux me permettre, cette ligne de code permet d'avoir uniquement toutes les colonnes de la 1ère Table mais pas celles des autres tables de la colonne [Value].
Si une colonne est ajoutée par exemple dans la table [Value]{1}, celle-ci ne sera pas reprise si le nouveau nom de la colonne n'apparait pas dans la 1ère table [Value]{0}.

J'aurais plutôt utilisé mais sans avoir testé :
Code:
=Table.ExpandTableColumn(Filtr, "Value", List.Distinct(List.Combine(List.Transform(Filtr[Value], each Table.ColumnNames(_)))))

@steph_29120 , Cousinhub a posé les bonnes questions dans ses différentes réponses et il n'est pas facile de proposer une méthode parmi d'autres sans connaître le contenu des dossiers, des fichiers et si les tables ou colonnes risquent d'être ajoutées....etc

Mais la dernière proposition de Cousinhub conviendra très certainement à votre situation.

Cordialement
 

Cousinhub

XLDnaute Barbatruc
Bonjour,
Il ne faut pas mettre cela dans la barre de formules, mais dans l'éditeur avancé (qui est en quelque sorte le pendant d'un Module, si tu connais un peu le VBA)
Pour ce faire, tu sélectionnes (comme tu l'as fait) la nouvelle requête (que tu as bien renommée "Comb")
Et dans le ruban Accueil, tu cliques sur "Éditeur avancé"
1686903535821.png

Tu arrives donc dans l'éditeur, et c'est là que tu colles le code :
1686903610875.png

Comme tu peux le voir, ici, j'utilise le code fourni par Amilo
 

chris

XLDnaute Barbatruc
Bonjour à tous

On peut faire un tableau listant les chemins et noms des fichiers puis charger ce tableau dans PowerQuery. On récupère ensuite les contenus : la colonne initiale reste.

Exemple :
Tableau nommé ListeXLS
1686922305697.png

On a une fonction nommée TraitementXLS qui charge les tableau du 1er onglet de chaque classeur, récupère une en-tête, et met les 2 colonnes en nompropre (c'est juste une ligne pour montrer qu'on peut agir sur chaque tableau)

VB:
(Fichier as text)=>
let
    Source = Excel.Workbook(File.Contents(Fichier)),
    Onglet=Source{0}[Data],
    #"En-têtes promus" = Table.PromoteHeaders(Onglet, [PromoteAllScalars=true]),
    NomPropre=Table.TransformColumns(#"En-têtes promus",{{"nom", Text.Proper, type text}, {"prénom", Text.Proper, type text}})
in
NomPropre

Et on a juste à appeler la fonction :
Ajouter une colonne, Appeler une fonction personnalisée, Sélectionner TraitementXLS comme Requête de fonction, valider.
Il n'y a plus qu'à cliquer sur la double flèche en haute de la colonne TraitementXLS

1686924740378.png
 
Dernière édition:

Statistiques des forums

Discussions
312 229
Messages
2 086 426
Membres
103 206
dernier inscrit
diambote