Microsoft 365 Transposer valeur d'une colonne sur d'autres colonnes

Kad3181

XLDnaute Nouveau
Bonjour à tous,

J'aurais besoin d'un coup de pouce svp.

Aujourd'hui j'ai le tableau suivant. Je voudrais pouvoir réorganiser mon tableau en ayant un paramètre par colonne avec la valeur associée. Peut etre une macro car mon tableau est assez conséquent (40000 lignes)? Merci d'avance pour vos astuces.

K

TABLEAU ACTUEL

Numero de serieParamètresValeur
ATemperature11
APressiona23
A1Temperaturez123
A1Pression19
ETemperature2s
EPression21n
ZTemperature10
ZPression9

TABLEAU SOUHAITE

Numero de serieTemperaturePression
A11a23
A1z12319
E2s21n
Z109
 

alexga78

XLDnaute Occasionnel
Bonjour à tous,

Une solution Power Query.

PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    cols = let x = Table.ColumnNames(Source) in {x{0}} & List.Distinct(Table.Column(Source,x{1})),
    Result = let x = Table.Group(Source, cols{0}, {{"x", (x)=> let x = List.Skip(Table.ToColumns(x)) in Record.FromList(x{1},x{0})}})
             in Table.ExpandRecordColumn(x,"x", List.Skip(cols))
in
    Result

Bonne soirée.
 

Kad3181

XLDnaute Nouveau
Bonjour à tous,

Une solution Power Query.

PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    cols = let x = Table.ColumnNames(Source) in {x{0}} & List.Distinct(Table.Column(Source,x{1})),
    Result = let x = Table.Group(Source, cols{0}, {{"x", (x)=> let x = List.Skip(Table.ToColumns(x)) in Record.FromList(x{1},x{0})}})
             in Table.ExpandRecordColumn(x,"x", List.Skip(cols))
in
    Result

Bonne soirée.
Bonjour alexga78, merci pour ton retour. Je vais tester.

Bonne soirée
 

Jeannette

XLDnaute Junior
Bonjour à tous,

Une solution Power Query.

PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    cols = let x = Table.ColumnNames(Source) in {x{0}} & List.Distinct(Table.Column(Source,x{1})),
    Result = let x = Table.Group(Source, cols{0}, {{"x", (x)=> let x = List.Skip(Table.ToColumns(x)) in Record.FromList(x{1},x{0})}})
             in Table.ExpandRecordColumn(x,"x", List.Skip(cols))
in
    Result

Bonne soirée.
Bonjour Alex,
J'aurais aimé connaître la différence entre votre code, et celui réalisable via le ruban de l'éditeur :
(Temps de traitement?)
PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    #"Colonne dynamique" = Table.Pivot(Source, List.Distinct(Source[Paramètres]), "Paramètres", "Valeur")
in
    #"Colonne dynamique"
 

alexga78

XLDnaute Occasionnel
Bonsoir Jeannette,
j'ai l'habitude, d'éviter les Table.Pivot entre autres pour des raisons de performance pour les grosses bases de données.
et de toujours gérer les noms de colonnes en dynamique.

c'est un des gros plus pour moi de Power query Query chaque utilisateur peut coder à sa convenance.
Aucune différence tant que le but est atteint :)

Bonne soirée
 

job75

XLDnaute Barbatruc
Merci pour ton retour. Oui pour le moment, j'ai toujours 2 paramètres pour chaque numéro de série.
Alors voici la macro :
VB:
Sub Macro()
Dim tablo, rest(), i&, n&
With [A1].CurrentRegion
    tablo = .Resize(1 + 2 * Int((.Rows.Count - 1) / 2), 3) 'matrice, plus rapide
End With
ReDim resu(1 To UBound(tablo), 1 To 3)
For i = 2 To UBound(tablo) - 1 Step 2 '1 ligne sur 2
    If tablo(i + 1, 1) <> tablo(i, 1) Then _
        MsgBox "Numéros différents en lignes " & i & " et " & i + 1 & "!": Range("A" & i).Select: Exit Sub
    n = n + 1
    resu(n, 1) = tablo(i, 1)
    resu(n, 2) = tablo(i, 3)
    resu(n, 3) = tablo(i + 1, 3)
Next
'---restitution---
With [E2]
    If n Then .Resize(n, 3) = resu
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 3).ClearContents 'RAZ en dessous
End With
End Sub
Pour tester j'ai recopié la plage A2:C9 sur 40 000 lignes.

Chez moi la macro s'exécute en 0,09 seconde.
 

Pièces jointes

  • Test.xlsm
    18.1 KB · Affichages: 0
Dernière édition:

Kad3181

XLDnaute Nouveau
Alors voici la macro :
VB:
Sub Macro()
Dim tablo, rest(), i&, n&
With [A1].CurrentRegion
    tablo = .Resize(1 + 2 * Round((.Rows.Count - 1) / 2), 3) 'matrice, plus rapide
End With
ReDim resu(1 To UBound(tablo), 1 To 3)
For i = 2 To UBound(tablo) - 1 Step 2 '1 ligne sur 2
    If tablo(i + 1, 1) <> tablo(i, 1) Then _
        MsgBox "Numéros différents en lignes " & i & " et " & i + 1 & "!": Range("A" & i).Select: Exit Sub
    n = n + 1
    resu(n, 1) = tablo(i, 1)
    resu(n, 2) = tablo(i, 3)
    resu(n, 3) = tablo(i + 1, 3)
Next
'---restitution---
With [E2]
    If n Then .Resize(n, 3) = resu
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 3).ClearContents 'RAZ en dessous
End With
End Sub
Pour tester j'ai recopié la plage A2:C9 sur 40 000 lignes.

Chez moi la macro s'exécute en 0,09 seconde.
Ok merci beaucoup pour ton retour. Je vais tester cela. Merci encore
 

job75

XLDnaute Barbatruc
Bonjour Kad3181, le forum,

On peut s'assurer que le tableau source est trié dans le bon ordre (croissant sur colonne A, décroissant sur colonne B) :
VB:
Sub Macro()
Dim tablo, rest(), i&, n&
With [A1].CurrentRegion
    .Sort .Columns(1), xlAscending, .Columns(2), , xlDescending, Header:=xlYes 'tri sur 2 colonnes
    tablo = .Resize(1 + 2 * Int((.Rows.Count - 1) / 2), 3) 'matrice, plus rapide
End With
ReDim resu(1 To UBound(tablo), 1 To 3)
For i = 2 To UBound(tablo) - 1 Step 2 '1 ligne sur 2
    If tablo(i + 1, 1) <> tablo(i, 1) Then _
        Range("A" & i).Select: MsgBox "Numéros différents en lignes " & i & " et " & i + 1 & "!": Exit Sub
    n = n + 1
    resu(n, 1) = tablo(i, 1)
    resu(n, 2) = tablo(i, 3)
    resu(n, 3) = tablo(i + 1, 3)
Next
'---restitution---
With [E2]
    If n Then .Resize(n, 3) = resu
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 3).ClearContents 'RAZ en dessous
End With
End Sub
A+
 

Pièces jointes

  • Test.xlsm
    18.5 KB · Affichages: 2
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
313 902
Messages
2 103 391
Membres
108 631
dernier inscrit
tarek.kanaan