Conversion ligne en colonne

Bonjour à toutes et à tous

Je me permet de vous envoyer un petit message pour vous demander de l'aide sur un problème qui me tracasse depuis quelques jours :

j'ai une liste de véhicules avec leur réparation :

immat date réparation

1483xd80 01/01/2018 pare choc

1483xd80 04/03/2018 aile

1483xd80 09/11/2018 moyeux

5850xr72 09/04/2018 troncon

5850xr72 11/09/2018 pare brise

et je voudrais avoir la synthèse en colonne

1483xd80 01/01/2018 pare choc 04/03/2018 aile 09/11/2018 moyeux

5850xr72 09/04/2018 moyeux

je ne sais absolument pas comment faire...

l'un d'entre vous aurait-il une idée, il aura ma reconnaissance éternelle !!

merci par avance

8listing-rep.xlsx (8.59 Ko)

Salut Laurent!

Regarde si ce petit tips ci-dessous t'est utile:

1. Copie ta plage / liste

2. Clique sur la cellule où coller ta plage / liste

3. Clique sur la flèche qui part vers le bas sous le bouton "Coller" de l'onglet "Accueil"

3. Appuie sur la touche "T" de ton clavier

Résultat :

capture

Bonjour à tous

Par VBA (code inspiré de job75)

Sub Pivoter()
Dim source As Range, dest As Range, tablo, d As Object, ncol&, resu(), i&, x$, n&, lig&, col&
With Worksheets("Feuil1")
    Set source = .[A1].CurrentRegion.Resize(, 3) 'à adapter
    Set dest = .[H1] '1ère cellule de destination, à adapter
    tablo = source 'matrice, plus rapide
    Application.ScreenUpdating = False
    dest.Resize(.Rows.Count - dest.Row + 1, .Columns.Count - dest.Column + 1).ClearContents 'RAZ
    '---dimensions du tableau des résultats---
    Set d = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(tablo)
        d(tablo(i, 1)) = d(tablo(i, 1)) + 1 'comptage
    Next
    If d.Count = 0 Then Exit Sub 'GoTo 1
    ncol = 2 + 2 * Application.Max(d.items)
    ReDim resu(1 To d.Count, 1 To ncol)
    '---remplissage du tableau des résultats---
    d.RemoveAll
    For i = 2 To UBound(tablo)
        x = tablo(i, 1)
        If Not d.exists(x) Then
            n = n + 1
            resu(n, 1) = x
            d(x) = n 'mémorise le numéro de ligne
        End If
        lig = d(x)
        resu(lig, ncol) = resu(lig, ncol) + 2 'mémorise le numéro de colonne
        col = resu(lig, ncol)
        resu(lig, col) = tablo(i, 2)
        resu(lig, col + 1) = tablo(i, 3)
    Next
    '---restitution---
    If ncol + dest.Column > .Columns.Count Then ncol = .Columns.Count - dest.Column 'sécurité
    dest.Offset(1, 0).Resize(n, ncol - 1) = resu
    dest = .Cells(1, 1).Value
    For i = 1 To UBound(resu, 2) - 2
        dest.Offset(0, i) = IIf(i Mod 2 = 0, .Cells(1, 3) & " " & i / 2, .Cells(1, 2) & " " & (i + 1) / 2)
    Next i
    dest.Resize(n, ncol - 1).Columns.AutoFit

End With
End Sub

bonjour chris

merci beaucoup pour ton aide, tu est génial !!

juste une question supplémentaire, si j'ai 9 colonnes a mon tableau au lieu de 3 du départ, je dois modifier quels paramètres ?.

je ne connais pas vraiment le vba, j'essaie d'apprendre.

A bientot et merci encore !!

bonjour chris

merci beaucoup pour ton aide, tu est génial !!

juste une question supplémentaire, si j'ai 9 colonnes a mon tableau au lieu de 3 du départ, je dois modifier quels paramètres ?.

je ne connais pas vraiment le vba, j'essaie d'apprendre.

A bientot et merci encore !!

Bonjour à tous

Par VBA (code inspiré de job75)

Sub Pivoter()
Dim source As Range, dest As Range, tablo, d As Object, ncol&, resu(), i&, x$, n&, lig&, col&
With Worksheets("Feuil1")
    Set source = .[A1].CurrentRegion.Resize(, 3) 'à adapter
    Set dest = .[H1] '1ère cellule de destination, à adapter
    tablo = source 'matrice, plus rapide
    Application.ScreenUpdating = False
    dest.Resize(.Rows.Count - dest.Row + 1, .Columns.Count - dest.Column + 1).ClearContents 'RAZ
    '---dimensions du tableau des résultats---
    Set d = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(tablo)
        d(tablo(i, 1)) = d(tablo(i, 1)) + 1 'comptage
    Next
    If d.Count = 0 Then Exit Sub 'GoTo 1
    ncol = 2 + 2 * Application.Max(d.items)
    ReDim resu(1 To d.Count, 1 To ncol)
    '---remplissage du tableau des résultats---
    d.RemoveAll
    For i = 2 To UBound(tablo)
        x = tablo(i, 1)
        If Not d.exists(x) Then
            n = n + 1
            resu(n, 1) = x
            d(x) = n 'mémorise le numéro de ligne
        End If
        lig = d(x)
        resu(lig, ncol) = resu(lig, ncol) + 2 'mémorise le numéro de colonne
        col = resu(lig, ncol)
        resu(lig, col) = tablo(i, 2)
        resu(lig, col + 1) = tablo(i, 3)
    Next
    '---restitution---
    If ncol + dest.Column > .Columns.Count Then ncol = .Columns.Count - dest.Column 'sécurité
    dest.Offset(1, 0).Resize(n, ncol - 1) = resu
    dest = .Cells(1, 1).Value
    For i = 1 To UBound(resu, 2) - 2
        dest.Offset(0, i) = IIf(i Mod 2 = 0, .Cells(1, 3) & " " & i / 2, .Cells(1, 2) & " " & (i + 1) / 2)
    Next i
    dest.Resize(n, ncol - 1).Columns.AutoFit

End With
End Sub

Re

Tout dépend ce qui doit pivoter parmi les 9

On le répète : joindre un exemple REPRÉSENTATIF

Les formules ou le VBA ou PowerPivot : quelle que soit la solution adoptée c'est du travail d'orfèvre donc il faut savoir ce qu'on a à faire...

Bonjour à tous,

Une autre proposition à étudier.

Réalisée avec Recupérer et transformer (Power Query).

Cdlt.

4listing-rep.xlsx (18.59 Ko)

Re

@ Jean-Eric : j'avais fait ailleurs un PowerQuery sur une question très similaire mais job75 ayant publié un code qui met 1/3 de seconde à s'exécuter sur 20 000 lignes, et ma tentative PQ sur 20 000 n'ayant pas abouti, j'ai rendu les armes

Bonjour,

@ 78chris

Excel, les tableaux (arrays) et VBA seront toujours d'une grande utilité.

La rapidité d'exécution n'est plus à démontrer. Mais, maintenant, nous avons une alternative.

J'ai lu un article qui (tente) d'expliquer le pourquoi du comment de certaines lenteurs de PQ dans Excel.

Pas tout compris, mais pour résumer, PQ + Excel, il y a un grand nombre de recalculs (inutiles !) effectués lors des actualisations.

Ceci en fonction du nombre de tables liées (et certainement avec nos formules ou fonctions non optimisées, colonnes ajoutés, etc...)

Avec PQ + Power BI, le souci serait moindre, mais dans quelle mesure ?

Cela dit, la procédure de job75 fait parfaitement le job !...

Bonne journée

Merci beaucoup pour ces precieux conseils !!

Rechercher des sujets similaires à "conversion ligne colonne"