Microsoft 365 Épurer les lignes vides d'une cellule puis fractionner la cellule en plusieurs lignes

de_hanstrapp

XLDnaute Occasionnel
Bonjour le forum,

Dans le fichier exemple joint, je cherche à :
1/ supprimer toutes les lignes vides contenues dans les cellules de la colonne "C" pour arriver au résultat de l'onglet 2
2/ fractionner les lignes contenues dans les cellules pour arriver au résultat de l'onglet 3

J'ai cherché sur le forum mais dans les codes d'épurage trouvés, il ne prend jamais en compte la première ligne et pour spliter en plusieurs lignes on fait référence à un caractère alors que la il s'agit d'une tabulation.

Des idées ?

Merci par avance,

De_Hanstrapp
 

Pièces jointes

  • Exemple.xlsm
    14.9 KB · Affichages: 10

Staple1600

XLDnaute Barbatruc
Bonjour

Une solution avec PowerQuery
PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    #"Type modifié" = Table.TransformColumnTypes(Source,{{"JOUR", Int64.Type}, {"DISCIPLINE", type text}, {"PROGRAMME", type text}}),
    #"Tableau croisé dynamique des colonnes supprimé" = Table.UnpivotOtherColumns(#"Type modifié", {"JOUR", "DISCIPLINE"}, "Attribut", "Valeur"),
    #"Fractionner la colonne par délimiteur" = Table.SplitColumn(#"Tableau croisé dynamique des colonnes supprimé", "Valeur", Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.Csv), {"Valeur.1", "Valeur.2", "Valeur.3", "Valeur.4", "Valeur.5", "Valeur.6", "Valeur.7", "Valeur.8", "Valeur.9", "Valeur.10", "Valeur.11", "Valeur.12"}),
    #"Type modifié1" = Table.TransformColumnTypes(#"Fractionner la colonne par délimiteur",{{"Valeur.1", type text}, {"Valeur.2", type text}, {"Valeur.3", type text}, {"Valeur.4", type text}, {"Valeur.5", type text}, {"Valeur.6", type text}, {"Valeur.7", type text}, {"Valeur.8", type text}, {"Valeur.9", type text}, {"Valeur.10", type text}, {"Valeur.11", type text}, {"Valeur.12", type text}}),
    #"Supprimer le tableau croisé dynamique des autres colonnes" = Table.UnpivotOtherColumns(#"Type modifié1", {"JOUR", "DISCIPLINE", "Attribut"}, "Attribut.1", "Valeur"),
    #"Lignes filtrées" = Table.SelectRows(#"Supprimer le tableau croisé dynamique des autres colonnes", each ([Valeur] <> null and [Valeur] <> "") and ([Attribut.1] <> "Valeur.1")),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Lignes filtrées",{"Attribut.1"})
in
    #"Colonnes supprimées"
Il doit y avoir un code M plus simple
Celui-ci a été obtenu avec l'Assistant PQ

Voici le résultat obtenu dans Excel
ResultatPQ.PNG
 

Staple1600

XLDnaute Barbatruc
Bonjour @Efgé ;)

Pour coller plus au résultat à obtenir
PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    #"Type modifié" = Table.TransformColumnTypes(Source,{{"JOUR", Int64.Type}, {"DISCIPLINE", type text}, {"PROGRAMME", type text}}),
    #"Tableau croisé dynamique des colonnes supprimé" = Table.UnpivotOtherColumns(#"Type modifié", {"JOUR", "DISCIPLINE"}, "Attribut", "Valeur"),
    #"Fractionner la colonne par délimiteur" = Table.SplitColumn(#"Tableau croisé dynamique des colonnes supprimé", "Valeur", Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.Csv), {"Valeur.1", "Valeur.2", "Valeur.3", "Valeur.4", "Valeur.5", "Valeur.6", "Valeur.7", "Valeur.8", "Valeur.9", "Valeur.10", "Valeur.11", "Valeur.12"}),
    #"Type modifié1" = Table.TransformColumnTypes(#"Fractionner la colonne par délimiteur",{{"Valeur.1", type text}, {"Valeur.2", type text}, {"Valeur.3", type text}, {"Valeur.4", type text}, {"Valeur.5", type text}, {"Valeur.6", type text}, {"Valeur.7", type text}, {"Valeur.8", type text}, {"Valeur.9", type text}, {"Valeur.10", type text}, {"Valeur.11", type text}, {"Valeur.12", type text}}),
    #"Supprimer le tableau croisé dynamique des autres colonnes" = Table.UnpivotOtherColumns(#"Type modifié1", {"JOUR", "DISCIPLINE", "Attribut"}, "Attribut.1", "Valeur"),
    #"Lignes filtrées" = Table.SelectRows(#"Supprimer le tableau croisé dynamique des autres colonnes", each ([Valeur] <> "" and [Valeur] <> " ")),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Lignes filtrées",{"Attribut", "Attribut.1"}),
    #"Colonnes renommées" = Table.RenameColumns(#"Colonnes supprimées",{{"Valeur", "PROGRAMME"}})
in
    #"Colonnes renommées"
 

de_hanstrapp

XLDnaute Occasionnel
Bonjour @Efgé ;)

Pour coller plus au résultat à obtenir
PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    #"Type modifié" = Table.TransformColumnTypes(Source,{{"JOUR", Int64.Type}, {"DISCIPLINE", type text}, {"PROGRAMME", type text}}),
    #"Tableau croisé dynamique des colonnes supprimé" = Table.UnpivotOtherColumns(#"Type modifié", {"JOUR", "DISCIPLINE"}, "Attribut", "Valeur"),
    #"Fractionner la colonne par délimiteur" = Table.SplitColumn(#"Tableau croisé dynamique des colonnes supprimé", "Valeur", Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.Csv), {"Valeur.1", "Valeur.2", "Valeur.3", "Valeur.4", "Valeur.5", "Valeur.6", "Valeur.7", "Valeur.8", "Valeur.9", "Valeur.10", "Valeur.11", "Valeur.12"}),
    #"Type modifié1" = Table.TransformColumnTypes(#"Fractionner la colonne par délimiteur",{{"Valeur.1", type text}, {"Valeur.2", type text}, {"Valeur.3", type text}, {"Valeur.4", type text}, {"Valeur.5", type text}, {"Valeur.6", type text}, {"Valeur.7", type text}, {"Valeur.8", type text}, {"Valeur.9", type text}, {"Valeur.10", type text}, {"Valeur.11", type text}, {"Valeur.12", type text}}),
    #"Supprimer le tableau croisé dynamique des autres colonnes" = Table.UnpivotOtherColumns(#"Type modifié1", {"JOUR", "DISCIPLINE", "Attribut"}, "Attribut.1", "Valeur"),
    #"Lignes filtrées" = Table.SelectRows(#"Supprimer le tableau croisé dynamique des autres colonnes", each ([Valeur] <> "" and [Valeur] <> " ")),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Lignes filtrées",{"Attribut", "Attribut.1"}),
    #"Colonnes renommées" = Table.RenameColumns(#"Colonnes supprimées",{{"Valeur", "PROGRAMME"}})
in
    #"Colonnes renommées"
Merci Staple1600.
J'essaie de suivre la démarche via powerquery mais je bloque assez vite...
Comment procèdes-tu pour fractionner par délimiteur (tu es dans quelle colonne à ce moment la ? Valeur ?
 

Efgé

XLDnaute Barbatruc
Re
Pour le résultat 2 une autre proposition peut-être plus adéquate en repartant du résultat 1
VB:
=FRACTIONNER.TEXTE(JOINDRE.TEXTE(";";1;ASSEMB.V(E2:E3));;CAR(10);1)
Cordialement
 

Pièces jointes

  • Exemple.xlsm
    16 KB · Affichages: 0

Staple1600

XLDnaute Barbatruc
Re, Bonjour @mapomme


@de_hanstrapp
J'ai fait un peu de ménage
PowerQuery:
let
  Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
   #"Fractionner la colonne par délimiteur" = Table.SplitColumn(Source, "PROGRAMME", Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.Csv), {"PROGRAMME.1", "PROGRAMME.2", "PROGRAMME.3", "PROGRAMME.4", "PROGRAMME.5", "PROGRAMME.6", "PROGRAMME.7", "PROGRAMME.8", "PROGRAMME.9", "PROGRAMME.10", "PROGRAMME.11", "PROGRAMME.12"}),
    #"Supprimer le tableau croisé dynamique des autres colonnes" = Table.UnpivotOtherColumns(#"Fractionner la colonne par délimiteur", {"JOUR", "DISCIPLINE"}, "Attribut", "Valeur"),
    #"Lignes filtrées" = Table.SelectRows(#"Supprimer le tableau croisé dynamique des autres colonnes", each ([Valeur] <> "" and [Valeur] <> " ")),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Lignes filtrées",{"Attribut"}),
    #"Colonnes renommées" = Table.RenameColumns(#"Colonnes supprimées",{{"Valeur", "PROGRAMME"}})
in
    #"Colonnes renommées"

Pour tester, voici comment tu peux procéder
Depuis ton classeur exemple
Obtenir les données/A partir d'autres sources/Requête vide
Ce qui te mène dans PowerQuery
Là sur l'onglet Accueil, choisir Editeur avancé
Puis copier/coller le code M de mon dernier message
Tu dois obtenir ceci
Requetevide.PNG
Ensuite il te reste plus qu'à cliquer sur Fermer et Charger

@Efgé
Merci pour le fichier exemple.
Ce m'a remis les yeux en face des trous ;)
 

de_hanstrapp

XLDnaute Occasionnel
Re, Bonjour @mapomme


@de_hanstrapp
J'ai fait un peu de ménage
PowerQuery:
let
  Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
   #"Fractionner la colonne par délimiteur" = Table.SplitColumn(Source, "PROGRAMME", Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.Csv), {"PROGRAMME.1", "PROGRAMME.2", "PROGRAMME.3", "PROGRAMME.4", "PROGRAMME.5", "PROGRAMME.6", "PROGRAMME.7", "PROGRAMME.8", "PROGRAMME.9", "PROGRAMME.10", "PROGRAMME.11", "PROGRAMME.12"}),
    #"Supprimer le tableau croisé dynamique des autres colonnes" = Table.UnpivotOtherColumns(#"Fractionner la colonne par délimiteur", {"JOUR", "DISCIPLINE"}, "Attribut", "Valeur"),
    #"Lignes filtrées" = Table.SelectRows(#"Supprimer le tableau croisé dynamique des autres colonnes", each ([Valeur] <> "" and [Valeur] <> " ")),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Lignes filtrées",{"Attribut"}),
    #"Colonnes renommées" = Table.RenameColumns(#"Colonnes supprimées",{{"Valeur", "PROGRAMME"}})
in
    #"Colonnes renommées"

Pour tester, voici comment tu peux procéder
Depuis ton classeur exemple
Obtenir les données/A partir d'autres sources/Requête vide
Ce qui te mène dans PowerQuery
Là sur l'onglet Accueil, choisir Editeur avancé
Puis copier/coller le code M de mon dernier message
Tu dois obtenir ceci
Regarde la pièce jointe 1195469
Ensuite il te reste plus qu'à cliquer sur Fermer et Charger

@Efgé
Merci pour le fichier exemple.
Ce m'a remis les yeux en face des trous ;)
Merci Staple1600, je souhaitais simplement comprendre quelle manip tu as utilisée pour intégrer le séparateur #(If) car je n'y arrive pas.
 

Discussions similaires

Statistiques des forums

Discussions
315 093
Messages
2 116 122
Membres
112 666
dernier inscrit
Coco0505