Option Explicit
Sub compter_sans_doublons()
Dim d As Object, tb(), i As Long, j As Long, k As Long
Dim d_etb As Object, d_cat As Object
Application.ScreenUpdating = False
Set d = CreateObject("scripting.dictionary")
Set d_etb = CreateObject("scripting.dictionary")
Set d_cat = CreateObject("scripting.dictionary")
'on met toute la bd dans un tableau
tb = [Tableau_test_elior].Value
For i = LBound(tb) To UBound(tb)
d_etb(tb(i, 3)) = "" 'on récupère dans un dictionnaire sans doublons la colonne 3
d_cat(tb(i, 7)) = "" 'on récupère dans un dictionnaire sans doublons la colonne 7
Next i
If d_etb.Count > 0 Then 'si au moins un item etb dans le dictionnaire
For i = 0 To d_etb.Count - 1 'boucle sur le nombre d'items etb
With Sheets(d_etb.keys()(i)) 'avec feuille concernèe
.Cells.ClearContents 'on vide la feuille
If d_cat.Count > 0 Then 'si au moins un item cat dans le dictionnaire
For j = 0 To d_cat.Count - 1 'boucle sur le nombre d'items cat
For k = 1 To UBound(tb) ''boucle sur les lignes de tb
'conditions pour récupèrer dans un dictionnaire suivant critères les clients sans doublons
If tb(k, 3) = d_etb.keys()(i) And tb(k, 7) = d_cat.keys()(j) Then d(tb(k, 2)) = ""
Next k
'report du résultat sur la feuille concernée
.Cells(1, Columns.Count).End(xlToLeft).Offset(, 1).Resize(d.Count) = Application.Transpose(d.keys)
.Cells(1, Columns.Count).End(xlToLeft).Offset(, 1) = d.Count
.Cells(1, Columns.Count).End(xlToLeft).Offset(1, 0) = "cat=" & d_cat.keys()(j)
Next j
End If
End With
Next i
End If
Application.ScreenUpdating = True
MsgBox "Traitement terminé!", vbInformation + vbOKOnly, "Succès"
Set d = Nothing
Set d_etb = Nothing
Set d_cat = Nothing
End Sub