Option Compare Text 'la casse est ignorée
Private Sub Worksheet_Activate()
Dim tablo, resu(), i&, j%, n%
'---tri sur 3 colonnes---
With Feuil1.[A1].CurrentRegion
.AutoFilter: .AutoFilter 'si le tableau est filtré
.Columns(5).Insert xlToRight 'insère une colonne auxiliaire
.Cells(1, 5) = 1: .Columns(5).DataSeries 'numérotation
.Resize(, 5).Sort .Columns(1), xlAscending, .Columns(3), , xlAscending, .Columns(4), xlAscending, Header:=xlYes
tablo = .Resize(, 4) 'matrice, plus rapide
.Resize(, 5).Sort .Columns(5), xlAscending 'ordre initial
.Columns(5).Delete xlToLeft
End With
'---transposition en sautant la colonne B---
ReDim resu(1 To 4, 1 To UBound(tablo))
For i = 1 To UBound(tablo)
resu(4, i) = 1 'prénumérotation
For j = 1 To 3
resu(j, i) = tablo(i, IIf(j = 1, 1, j + 1))
Next j, i
resu(4, 1) = "Quantité"
'---comptage et repérage des colonnes en doublon---
For i = UBound(tablo) To 2 Step -1
If resu(1, i) = resu(1, i - 1) And resu(2, i) = resu(2, i - 1) And resu(3, i) = resu(3, i - 1) Then
resu(4, i - 1) = resu(4, i) + 1 'comptage
resu(4, i) = "" 'repérage de la colonne en doublon
End If
Next i
'---suppression des colonnes en doublon---
For i = 1 To UBound(tablo)
If resu(4, i) <> "" Then
n = n + 1
For j = 1 To 4
resu(j, n) = resu(j, i)
Next j
End If
Next i
'---restitution---
With [A1] '1ère cellule, à adapter
.Resize(4, n) = resu
.Offset(, n).Resize(4, Columns.Count - n - .Column + 1).Delete xlToLeft 'RAZ à droite
.Resize(4, n).Borders.Weight = xlThin 'bordures
End With
With UsedRange: End With 'actualise la barre de défilement horizontale
End Sub