Sub Macro1()
Dim r As Object 'déclare la variable r (onglet Résultat)
Dim d As Object 'déclare la variable d (Dictionnaire)
Dim o As Byte 'déclare la variable o (Onglets)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl(1 To 2) As Range 'déclare le tableau de variables indexées pl (PLages)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim plc As Range 'déclare la variable plc (PLage des Critères)
Dim celv As Range 'déclare la variable celv (CELlule Visible)
Dim tc As String 'déclare la variable tc (Texte Concatené)
Set r = Sheets("résultat") 'définit l'onglet r
r.UsedRange.Offset(1, 0).Clear 'efface d'éventuelles anciennes données dans l'onglet r
Set d = CreateObject("Scripting.Dictionary") 'définit le dictionnaire d
For o = 1 To 2 'boucle dur les deux premiers onglets du classeur
With Sheets(o) 'prend en compte l'onglet de la boucle
dl = .Cells(Application.Rows.Count, o).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne o
Set pl(o) = .Range(.Cells(2, o), .Cells(dl, o)) 'définit la plage pl(o) de l'onglet
For Each cel In pl(o) 'boucle sur toutes les cellules cel de la plage pl(o)
d(cel.Value) = "" 'alimente le dictionnaire
Next cel 'prochaine cellule de la boucle
End With 'fin de la prise en compte de l'onglet de la boucle
Next o 'prochain onglet de la boucle
r.Range("A2").Resize(d.Count) = Application.Transpose(d.keys) 'renvoie les valeurs uniques (sans doublon) du dictionnaire d
dl = r.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A) de l'onglet r
Set plc = r.Range("A2:A" & dl) 'définit la plage des critères
For o = 1 To 2 'boucle 1 : sur les deux premiers onglets du classeur
For Each cel In plc 'boucle 2 : sur tous les critères de la plage plc
'filtre la colonne o de l'onglet de la boucle 1 avec la valeur de cel comme critère
Sheets(o).Range("A1").AutoFilter Field:=o, Criteria1:=cel.Value
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
'boucle 3 sur toutes les cellules visibles de l'onglet filtré (génère une erreur si aucune cellule visible)
For Each celv In pl(o).Offset(0, 1).SpecialCells(xlCellTypeVisible)
If Err <> 0 Then Err = 0: GoTo suite 'si une erreur a été générée, annule l'erreur, va à l'étiquette "suite"
tc = IIf(tc = "", celv.Value, tc & "+" & celv.Value) 'définit le text concatené tc
Next celv 'prochaine celluile visible de la boucle 3
cel.Offset(0, o).Value = tc: tc = "" 'renvoie le texte tc dans l'onglet r à o colonnes à droite de cel
suite: 'étiquette
Sheets(o).Range("A1").AutoFilter 'supprime le filtre automatique
Next cel 'prochaine cellule de la boucle 2
Next o 'prochain onglet de la boucle 1
End Sub