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
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 Subbonjour 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.
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 !!
