Transposer des plages de numéros de lignes en colonnes

Bonjour,

Jai besoin de faire ca:

Transposer les tranches colonnes B et C

dans les colonnes F,G H,I K,l etc...

15traches-sda.xlsx (9.01 Ko)
NDIdébut finNDIdebut findebut findebut findebut findebut findebut fin
171054945141191515141191534171054945141191515141191534171054745171054754171054945171054945986018966986018966
171054945171054745171054754134304485986017207986017207134303175134303194134304485134304494
171054945171054945171054945547798614556323955556323955556863594556863594549471195549471195
171054945986018966986018966
134304485986017207986017207
134304485134303175134303194
134304485134304485134304494
547798614556323955556323955
547798614556863594556863594
547798614549471195549471195

Je sais que c'est simple mais je n'ai aucune connaissance VB

Bonsoir à tous !

Une proposition type "formule unique dynamique" pour gérer l'entièreté du tableau :

=LET(
    u; UNIQUE(A2:A11);
    t; EXCLURE(SIERREUR(REDUCE(""; u; LAMBDA(a;c; ASSEMB.V(a; DANSLIGNE(FILTRE(B2:C11; A2:A11 = c))))); ""); 1);
    ASSEMB.V(
        ASSEMB.H("NDI"; FRACTIONNER.TEXTE(JOINDRE.TEXTE("/"; ; SI(SEQUENCE(; COLONNES(t) / 2); "Début/Fin"; "")); "/"));
        ASSEMB.H(u; t)
    )
)
image

Bonsoir Vincent_725 , JFL ,

Comme Vincent_725 a évoqué VB, une solution en VBA (mais la solution de JFL en O365 est ) :

  • Le code est dans le module de la feuille "Feuil1".
  • Cliquer sur le bouton Hop !
  • On fait un tri sur la source selon les clefs : NDI puis début. Ce n'est pas forcément nécessaire mais ça fait plus joli au niveau des résultats.

Bonjour à tous,

Une proposition PowerQuery, 0% ruban... désolé...

let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    DebFin = Table.CombineColumns(Table.TransformColumnTypes(Source, {{"début ", type text}, {"fin", type text}}, "fr-FR"),{"début ", "fin"},Combiner.CombineTextByDelimiter("|", QuoteStyle.None),"DebFin"),
    Group = Table.Group(DebFin, {"NDI"}, {{"Tbl", each Table.AddIndexColumn(_,"idx",1,1)}}),
    Dvlp = Table.ExpandTableColumn(Group, "Tbl", {"DebFin", "idx"}, {"DebFin", "idx"}),
    Pivot = Table.Pivot(Table.TransformColumnTypes(Dvlp, {{"idx", type text}}, "fr-FR"), List.Distinct(Table.TransformColumnTypes(Dvlp, {{"idx", type text}}, "fr-FR")[idx]), "idx", "DebFin"),
    RemoveNull = List.Accumulate(List.Skip(Table.ColumnNames(Pivot),1), Pivot, (s,c) => Table.ReplaceValue(s,null," | ",Replacer.ReplaceValue,{c})),
    Final = List.Accumulate(List.Skip(Table.ColumnNames(RemoveNull),1), RemoveNull, (s,c) => Table.SplitColumn(s,c,Splitter.SplitTextByDelimiter("|"))),
    NomColAvant = List.Skip(Table.ColumnNames(Final),1),
    NomColApres = List.Transform(NomColAvant, each if Text.Contains(_, ".1") then _&"Début" else _&"Fin"),
    NewCol = List.Zip({NomColAvant,NomColApres}),
    T_Final = Table.RenameColumns(Final, NewCol)
in
    T_Final
9traches-sda-1.xlsx (18.91 Ko)

Bonjour JB_ ,

Là je m'incline bien bas...

image

Bonsoir à tous !

L'artillerie lourde est sortie.....

Pour le fun, une autre approche :

let
    Source = Excel.CurrentWorkbook(){[Name="tSource"]}[Content],
    GroupBy = Table.Group(Source, {"NDI"}, 
    {
        {"All", each 
            [
                s=Table.RemoveColumns(_,{"NDI"}),
                u=Table.UnpivotOtherColumns(s, {}, "A", "V"),
                t=Table.FromRows({u[V]}, List.Transform({0..List.Count(u[A])-1}, each u[A]{_} & " " & Text.From(List.Sort(List.Repeat({1..Table.RowCount(s)},2)){_})))
            ][t]
        }
    }),
    Expand = Table.ExpandTableColumn(GroupBy, "All",  Table.ColumnNames(Table.Combine(GroupBy[All])))
in
    Expand

Bonsoir à tous,

@mafraise : Je m'incline devant la proposition VBA

@JFL : Bravo pour ce code ! Il faudra que je prenne le temps pour décortiquer le tout

J'essaye d'optimiser la mienne, notamment sur le group du départ :

=> Impossible de fusionner les 2 colonnes "début" et "fin" lors du groupage...

image

Possible ou pas ?

Je souhaiterais :

NDI Fusion idx

1710... 1411... | 1411 1

Merci de votre concours

Bonsoir à tous !

...... Il faudra que je prenne le temps pour décortiquer le tout

C'est là, le (presque) meilleur....

Concernant votre questionnement, est-ce le code suivant va dans la bonne direction ?

let
    Source = Excel.CurrentWorkbook(){[Name="tSource"]}[Content],
    TypeText = Table.TransformColumnTypes(Source,{{"début", type text}, {"fin", type text}}),
    GroupBy = Table.Group(TypeText, {"NDI"}, {{"Fusion", each List.Transform(List.Zip({[début],[fin]}), each Text.Combine(_,"/")) }})
in
    GroupBy

Bonsoir à tous,

Avec un dictionnaire :

Option Explicit
Sub transpose()
    Dim a, w(), i As Long, n As Long, col As Byte, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.comparemode = 1
    a = Sheets("Feuil1").Range("A1").CurrentRegion.Value
    col = UBound(a, 2): n = 1
    For i = 2 To UBound(a, 1)
        If Not dico.exists(a(i, 1)) Then
            n = n + 1: dico(a(i, 1)) = VBA.Array(n, col)
            a(n, 1) = a(i, 1)
            a(n, 2) = a(i, 2)
            a(n, 3) = a(i, 3)
        Else
            w = dico(a(i, 1)): w(1) = w(1) + 2
            If UBound(a, 2) < w(1) Then
                ReDim Preserve a(1 To UBound(a, 1), 1 To w(1))
            End If
            a(w(0), w(1) - 1) = a(i, 2)
            a(w(0), w(1)) = a(i, 3)
            dico(a(i, 1)) = w
        End If
    Next
    Application.ScreenUpdating = False
    If Not Evaluate("isref('Transpose'!a1)") Then Sheets.Add(, Sheets(Sheets.Count)).Name = "Transpose"
    With Sheets("Transpose")
        With .Cells(1)
            .CurrentRegion.Clear
            With .Resize(n, UBound(a, 2))
                .Value = a
                If UBound(a, 2) > col Then
                    With .Offset(, 1).Resize(1, 2)
                        .AutoFill .Resize(, UBound(a, 2) - 1)
                    End With
                End If
                .Font.Name = "calibri"
                .Font.Size = 10
                .VerticalAlignment = xlCenter
                .Borders(xlInsideVertical).Weight = xlThin
                .BorderAround Weight:=xlThin
                With .Rows(1)
                    .HorizontalAlignment = xlCenter
                    .Font.Size = 11
                    .BorderAround Weight:=xlThin
                    .Interior.ColorIndex = 43
                End With
                .Columns.ColumnWidth = 14
            End With
        End With
    End With
    Set dico = Nothing
    Application.ScreenUpdating = True
End Sub

klin89

RE,

C'est dans la bonne direction mais pas encore ça :

Le but est de créer des tables sous-jacentes :

  • En fusionnant les 2 colonnes "début" et "fin" ;
  • En ajoutant une colonne d'index.

Exemple de résultat pour le NDI 171054945 :

image

Ce qui donnerait : Table.Group( ..., each fusion des 2 colonnes, each Table.AddIndexColumn... ) mais c'est plus compliqué que ça je pense...

Le but étant de faire cela en 1 seule étape.

Bonjour à tous !

Le but est de créer des tables sous-jacentes ...

Alors peut-être ainsi :

let
    Source = Excel.CurrentWorkbook(){[Name="tSource"]}[Content],
    GroupBy = Table.Group(Source, {"NDI"}, {{"all", each
                let 
                    t=Table.TransformColumnTypes(_,{{"début", type text}, {"fin", type text}}),
                    f=Table.CombineColumns(t,{"début", "fin"},Combiner.CombineTextByDelimiter("|", QuoteStyle.None),"Fusion")
                in Table.AddIndexColumn (f,"Idx",1)}})
in
    GroupBy

Bonjour,

Une autre approche (vu que je l'avais faite...)

let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    UnPivot = Table.UnpivotOtherColumns(Source, {"NDI"}, "Attribut", "Valeur"),
    GroupBy = Table.Sort(Table.Combine(Table.Group(UnPivot, {"NDI", "Attribut"}, {{"Tbl", each Table.CombineColumns
        (Table.TransformColumnTypes( Table.AddIndexColumn(_,"Idx",1),{{"Idx", type text}}),{"Idx","Attribut"},
        Combiner.CombineTextByDelimiter(".", QuoteStyle.None),"Période")}})[Tbl]),{{"Période", 0}}),
    Pivot = Table.Pivot(GroupBy, List.Distinct(GroupBy[Période]), "Période", "Valeur")
in
    Pivot

Bon dimanche (tempétueux par ici..)

Bonjour à tous,

@JFL : Merveilleux Merci beaucoup !

@Cousinhub : Bravo, belle méthode également

Rechercher des sujets similaires à "transposer plages numeros lignes colonnes"