Sub Compter()
Dim dico As New Scripting.Dictionary
Dim ValeursB, colB As Range, derB As Long, i As Long
With Sheets("stat")
' numéro de la dernière ligne remplie de la colonne B
derB = .Cells(.Rows.Count, "b").End(xlUp).Row
' plage (range) des valeurs de la colonne B
Set colB = .Range("B1:B" & derB)
' lecture du tableau dynamique contenant les valeurs de la colonne B
ValeursB = colB.Value
' boucle sur le tableau des valeurs de la colonne B
' comptage des valeurs via le dico
' on exclut la 1ière valeur (i.e. l'en-tête)
For i = 2 To derB
' on exclut aussi les valeurs vides de la colonne B
If ValeursB(i, 1) <> "" Then dico(ValeursB(i, 1)) = dico(ValeursB(i, 1)) + 1
Next i
' on construit les valeurs de la colonne C
' d'abord l'en-tête
ValeursB(1, 1) = "occurences"
' puis Boucle: chaque valeurs dans le tableau des valeurs
' de la colonne B est remplacée par son occurence via le dico.
For i = 2 To derB
If ValeursB(i, 1) <> "" Then ValeursB(i, 1) = dico(ValeursB(i, 1))
Next i
' écriture de tableau ValeursB (dont les valeurs ont
' été remplacées par leur occurences repectives)
' sur la feuille dans la colonne C
.Range("c:c").Clear
.Range("c1").Resize(derB, 1) = ValeursB
' Formatage
.Range("c1").Resize(derB, 1).Borders.LineStyle = xlContinuous
.Range("b1").Copy
.Range("c1").PasteSpecial xlPasteFormats
Application.CutCopyMode = False
End With
End Sub