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

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 !

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
 
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 à 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
 
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
 
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

Dernière édition:
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
 
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

Dernière édition:
- 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

Réponses
5
Affichages
474
  • Question Question
Microsoft 365 Programme trop lent
Réponses
12
Affichages
883
Retour