XL 2019 Power query - modifier le type des colonnes

  • Initiateur de la discussion Initiateur de la discussion Flx1er
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Flx1er

XLDnaute Occasionnel
Bonjour,
Est-il possible de modifier dynamique le type des colonnes en fonction de certains intitulés.
Par exemple (cf fichier joint), si l'intitulé commence par "Nombre"; "Age" alors le type des colonnes respectives sera de type number
En vous remerciant
 

Pièces jointes

Bonjour Flx1er, le forum,

Tu peux tester avec ce code :
PowerQuery:
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("XYvBDcAwCAN34W0pmJC0mYWw/xrNp1Lp887nCFe4Y3WI+W5qu5maC9aAsJhfINZLnwhiDtyEKL/TEcZ61YrzIF+8mPkA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Nombre 1 = _t, Nombre 2 = _t, Nombre 3 = _t, Date 1 = _t, Nombre 4 = _t, Date 2 = _t, Date 3 = _t, Date 4 = _t, Nombre 5 = _t]),
    transformationsList = {{each Text.StartsWith(_, "Nombre"), type number}, {each Text.StartsWith(_, "Date"), type date}},
    ChangeTypes = 
        let
            colNames = List.Buffer(Table.ColumnNames(Source)),
            transformations = List.Combine(List.Transform(transformationsList, each let current = _, columns = List.Select(colNames, current{0}) in List.Transform(columns, each {_, current{1}})))
        in
            Table.TransformColumnTypes(Source, transformations)
in
    ChangeTypes

A+
 
Bonjour Flx1er, le forum,

Tu peux tester avec ce code :
PowerQuery:
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("XYvBDcAwCAN34W0pmJC0mYWw/xrNp1Lp887nCFe4Y3WI+W5qu5maC9aAsJhfINZLnwhiDtyEKL/TEcZ61YrzIF+8mPkA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Nombre 1 = _t, Nombre 2 = _t, Nombre 3 = _t, Date 1 = _t, Nombre 4 = _t, Date 2 = _t, Date 3 = _t, Date 4 = _t, Nombre 5 = _t]),
    transformationsList = {{each Text.StartsWith(_, "Nombre"), type number}, {each Text.StartsWith(_, "Date"), type date}},
    ChangeTypes =
        let
            colNames = List.Buffer(Table.ColumnNames(Source)),
            transformations = List.Combine(List.Transform(transformationsList, each let current = _, columns = List.Select(colNames, current{0}) in List.Transform(columns, each {_, current{1}})))
        in
            Table.TransformColumnTypes(Source, transformations)
in
    ChangeTypes

A+
Merci mromain,
Ta solution fonctionne à merveille.
Encore merci

 
Bonjour,

Je ré-ouvre ce post pour vous demander une faisabilité : s'il est possible de modifier le type de chaque colonne en utilisant 2 list :
  • 1ere liste contient les noms de chaque colonne
  • 2d liste contient les types de chaque colonne
Le document joint intègre ces 2 listes au niveau de la requête Format type. Mais je ne trouve pas la métho pour exploiter ces 2 listes
En vous remerciant
 

Pièces jointes

Bonjour Flx1er, le forum,

Ci-dessous un essai :
PowerQuery:
let
    DefModifTypes =
        let
            Noms_colonnes = Excel.CurrentWorkbook(){[Name="Noms_cols"]}[Content][Column1],
            Type_colonne = Excel.CurrentWorkbook(){[Name="Types_cols"]}[Content][Column1]
        in
            List.Zip({Noms_colonnes, List.Transform(Type_colonne, Expression.Evaluate)}),
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    TypesModifiés = Table.TransformColumnTypes(Source,DefModifTypes)
in
    TypesModifiés

A+
 
Bonjour,
J'avais également trouvé une solution, mais non aboutie, car la transformation ne supportait pas le type "Int64.Type", ni tous les typages en ".Type"...
Je vois qu'il en est de même avec la solution de romain 😕

Après transformation de la plage dans l'onglet "param" en TS nommé T_Types, le code :

PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    ModType = Table.TransformColumnTypes(Source,List.Zip({T_Types[Colonne],List.Transform(T_Types[Type],Expression.Evaluate)}))
in
    ModType

Je ne sais pas s'il est possible de déterminer ainsi le type des "Int64.Type, Percent.Type...."
Bonne apm
 

Pièces jointes

Bonjour Cousinhub,

Je ne sais pas s'il est possible de déterminer ainsi le type des "Int64.Type, Percent.Type...."

C'est possible oui.
L'erreur se déclenche car dans le contexte d'évaluation par défaut, il ne connait pas la fonction Int64.Type.

Tu trouveras ci-dessous 2 moyens de faire fonctionner la chose :
PowerQuery:
let
    Erreur = Expression.Evaluate("Int64.Type"),
    SansErreur1 = Expression.Evaluate("Int64.Type", [Int64.Type = Int64.Type]),
    SansErreur2 = Expression.Evaluate("Int64.Type", #shared),
    WTF = Expression.Evaluate("List.Max({1, 9})", [List.Max = List.Min])
in
    WTF

Le dernier exemple sert juste à montrer que dans ce contexte d'évaluation, on dit que List.Max vaut List.Min

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Power Query Power Query
Réponses
26
Affichages
575
  • Question Question
Microsoft 365 Power Query
Réponses
7
Affichages
257
  • Question Question
Microsoft 365 Power Query
Réponses
8
Affichages
230
  • Question Question
Microsoft 365 Power Query
Réponses
2
Affichages
203
Réponses
8
Affichages
479
Réponses
1
Affichages
109
  • Question Question
Réponses
16
Affichages
1 K
Retour