Sub Macro1()
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim dico1 As Object 'déclare la variable dico1 (DICtiOnnaire 1)
Dim cel1 As Range 'déclare la variable cel1 (CELlule 1)
Dim temp1 As Variant 'déclare la variable temp1 (tableau TEMPoraire 1)
Dim i As Integer 'déclare la variable i (Incrément)
Dim dico2 As Object 'déclare la variable dico2 (DICtiOnnaire 2)
Dim cel2 As Range 'déclare la variable cel2 (CELlule 2)
Dim temp2 As Variant 'déclare la variable temp2 (tableau TEMPoraire 2)
Dim r As Range 'déclare la variable r (Recherche)
Dim x As Integer 'déclare la variable x (incrément)
Dim j As Integer 'déclare la variable j (incrément)
Application.ScreenUpdating = False 'masque les changements à l'écran
With Sheets("Feuil1") 'prend en compte l'onglet "Feuil1"
dl = .Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière liogne éditée dl de la colonne 1 (=A)
Set pl = .Range("A5:A" & dl) 'définit la plage pl
Set dico1 = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico1
For Each cel1 In pl.Offset(0, 1) 'boucle sur toutes les cellules cel1 de la plage pl décalé de une colonne à droite (B)
dico1(cel1.Value) = "" 'alimente le dictionnaire
Next cel1 'prochaine cellule de la boucle
temp1 = dico1.keys 'récupère le dictionnaire dico1 sans doublon dans le tableau temp1
For i = LBound(temp1) To UBound(temp1) 'boucles sur toutes les éléments du tableau temp1
.Range("A4").AutoFilter 'lance le filtre automatique
.Range("A4").AutoFilter Field:=2, Criteria1:=temp1(i) 'filtre la colonne 2 (=B) selon le critère : élément du tableau temp1
Set dico2 = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico2
For Each cel2 In pl.SpecialCells(xlCellTypeVisible) 'boucle sur toutes les cellules cel2 des lignes visible de la plage pl
dico2(cel2.Value) = "" 'alimente le dictionnaire dico2
Next cel2 'prochaine cellule de la boucle
temp2 = dico2.keys 'récupère le dictionnaire dico2 sans doublon dans le tableau temp2
'définit la recherche r (recherche la valeur temp1(i) dans la colonne 1 de l'onglet "Feuil2"
Set r = Sheets("Feuil2").Columns(1).Find(temp1(i), , xlValues, xlWhole)
x = 1 'initialise la variable x
For j = LBound(temp2) To UBound(temp2) 'boucles sur toutes les éléments du tableau temp2
.Range("A4").AutoFilter Field:=1, Criteria1:=temp2(j) 'filtre la colonne 1 (=A) selon le critère : élément du tableau temp2
Range(r.Offset(x, 0), r.Offset(x, 1)).Insert Shift:=xlDown 'insère deux cellules sour r
Range(r.Offset(x, 0), r.Offset(x, 1)).Interior.ColorIndex = xlNone 'couleur blances dans les cellules insérées
'place sour r la valeur de temp2(j), place à cotés la somme
r.Offset(x, 0).Value = temp2(j): r.Offset(x, 1).Value = Application.WorksheetFunction.Sum(pl.Offset(0, 2).SpecialCells(xlCellTypeVisible))
x = x + 1 'incrément i
Next j 'prochain élément du tableau temp2
.Range("A4").AutoFilter 'annule le filtre automatique
Next i 'prochain élément du tableau temp1
End With 'fin de la prise en compte de l'onglet "Feuil1"
Application.ScreenUpdating = True 'affiche les changements à l'écran
End Sub