Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim L As Byte 'déclare la variable L (incrément)
Dim TT1 As Variant 'déclare la variable TT1 (Tableau Temporaire 1)
Dim TT2 As Variant 'déclare la variable TT2 (Tableau Temporaire 2)
Dim NB As Integer 'décalre la variable NB (NomBre)
Dim TEST As Boolean 'déclare la variable TEST
Set O = Worksheets("BDD") 'définit l'onglet O
TV = O.Range("B2").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1 du tableau des valeurs TV
Next I 'prochaine ligne de la boucle
TT1 = D.keys 'récupère dans le tableau temporaire TT1 la liste des élémets du dictionnaire D sans doublon
L = 1 'initialise la variable L
For J = 0 To UBound(TT1) 'boucle 1 : sur tous les éléments J du tableau temporaire TT1
NB = 0 'initialise le nombre NB
Set D = CreateObject("Scripting.Dictionary") 'redéfinit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
If TV(I, 1) = TT1(J) Then 'condition : si la donnée ligne I colonne 1 de TV est égale à l'élément J de TT1
D(TV(I, 3)) = "" 'alimente le dictionnaire D avec les données de la colonne 3 de TV
End If 'fin de la condition
Next I 'prochaine ligne de la boucle 2
O.Cells(28 + L, "H").Value = D.Count 'renvoie dans la cellule ligne 28 + L colonne H le nombre d'éléments du dictionnaire D
TT2 = D.keys 'alimente le tableau temporaire TT2 avec la liste des éléments du dictionanire D sans doublons
For K = 0 To UBound(TT2) 'boucle 3 : sur tous les éléments K du dictionnaire TT2
For I = 2 To UBound(TV, 1) 'boucle 4 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
TEST = False 'initialise la variable TEST
'condition : si la données en colonne 3 de TV correspond à l'élément K de TT2 et si la donnée en colonne 1 de TV correspond à lélément J de TT1
If TV(I, 3) = TT2(K) And TV(I, 1) = TT1(J) Then
For M = 6 To 8 'boucle 5 : sur les colonnes 6 à 8 (=G à H)
If TV(I, M) <> "" Then TEST = True: Exit For 'si la donnée ligne I colonne M n'est pas vide, définit la variable TEST, sort de la boucle 5
Next 'prochaine colonne de la boucle 5
End If 'fin de la condition
If TEST = True Then NB = NB + 1: Exit For 'si TEST est [Vrai], incrémente NB, sort de la boucle 4
Next I 'prochaine ligne de la boucle 4
Next K 'prochain élément de la boucle 3
O.Cells(28 + L, "I").Value = IIf(NB = 0, "", NB) 'renvoie NB dans la cellule ligne 28 + L colonne I
L = L + 1 'incrémente L
Next J 'prochain élément de la boucle 1
End Sub