Function Occurrences(plage As Range, Optional Texte)
Dim collec As New Collection, y, n&, i&, j&
Dim t, ech As Boolean, aux, repet As New Collection, quoi&
Application.ScreenUpdating = False
t = plage.Value 'lecture de la plage de valeurs
'si une seule colonne alors on en rajoute une
If UBound(t, 2) = 1 Then ReDim Preserve t(1 To UBound(t), 1 To UBound(t, 2) + 1)
On Error Resume Next 'pour la gestion des collections
'boucle d'indexation des éléments distincts des valeurs
For i = 1 To UBound(t)
For j = 1 To UBound(t, 2)
y = "": y = collec(LCase(t(i, j)))
If y = "" Then
'la valeur n'est pas dans collec
n = n + 1 'nouvel index
collec.Add n, LCase(t(i, j)) 'on ajoute l'index avec pour clef LCase(t(i, j))
t(i, j) = n 'on place l'index à la place de la valeur de t(i,j)
Else
'la valeur de l'index est déjà dans collec
t(i, j) = y 'on place cette valeur dans t(i,j)
End If
Next j
Next i
'les valeurs de t on été maintenant remplacées par leur index (unique pour chaque valeur distincte)
'tri des index de chaque ligne de t (méthode classique par échange)
For i = 1 To UBound(t)
Do
ech = False
For j = 1 To UBound(t, 2) - 1
If t(i, j) > t(i, j + 1) Then
ech = True: aux = t(i, j): t(i, j) = t(i, j + 1): t(i, j + 1) = aux
End If
Next j
Loop Until Not ech
Next i
For i = 1 To UBound(t)
'on met dans chaque élément de la première colonne de chaque ligne
'le texte des index de la ligne (chaque index du texte est entouré avec le caractère "|"
y = ""
For j = 1 To UBound(t, 2): y = y & "|" & t(i, j) & "|": Next
t(i, 1) = y
'puis on se sert de la collection repet pour compter le nombre d'occurrence de chaque texte
y = "": y = repet(t(i, 1))
If y = "" Then
'le texte n'existe pas alors on ajoute 1 à la collection avec la clef texte ( = t(i,1) )
repet.Add 1, t(i, 1)
Else
'la clef texte existe déjà, on la supprime, on la rajoute en incémentant de 1 la valeur existante
repet.Remove t(i, 1)
repet.Add y + 1, t(i, 1)
End If
Next i
'on place dans la deuxième colonne de t le nombre d'occurrence du texte de la 1ère colonne de t
For i = 1 To UBound(t): t(i, 2) = repet(t(i, 1)): Next
'Quoi Retourner: Nombre d'occurrence ou bien texte avec les index ?
If IsMissing(Texte) Then
'on retourne le nombre d'occurrence
For i = 1 To UBound(t): t(i, 1) = t(i, 2): Next
End If
Occurrences = Application.Index(t, 0, 1) 'on renvoie le tableau désiré
End Function