Sub test()
Dim Ref, t, dico, clef, i&, j&, ligne, n&
Ref = UCase(InputBox("Saisir le code du Magasin:")) 'saisie du code magasin désiré
Application.ScreenUpdating = False
If Me.FilterMode Then Me.ShowAllData 'si filtre, on affiche toutes les données (pour que le End() fonctionne correctement)
t = Range("a1:c" & Cells(Rows.Count, "a").End(xlUp).Row) 'lecture des données sources dans le tableau t
Set dico = CreateObject("scripting.dictionary") 'création du dico
dico.CompareMode = TextCompare 'on ne distingue pas les majuscules des minuscules pour les clefs du dico
For i = 2 To UBound(t) 'on parcourt les lignes de tableau t (sauf l'en-tête)
clef = CStr(t(i, 2)) 'la clef : c'est le code article
'si la clef correspond au magasin désiré, on rajoute le numéro de la ligne de l'article dans l'item correspondant à clef
If t(i, 1) = Ref Then dico(clef) = dico(clef) & ";" & i
Next i
For i = 2 To UBound(t) 'une nouvelle fois, on parcourt les lignes de tableau t (sauf l'en-tête)
clef = CStr(t(i, 2)) 'la clef : c'est le code article
' Si le magasin n'est pas le magasin désiré, et alors si l'article ne fait partie de dico
' et cela signifie que le produit n'est pas uniquement dans le magasin désiré.
' On élimine donc ce produit du magasin désiré (donc de dico)
If t(i, 1) <> Ref Then If dico.Exists(clef) Then dico.Remove clef
Next i
'il ne reste plus dans dico que les articles qui ne sont pas aussi sortis par d'autres magasins.
'on va "tasser" les lignes correspondant aux articles uniquement sortis du magasin désiré
'dans le haut du tableau. n sera le compteur de lignes du résultat final
n = 1 'n = 1 car on conserve la ligne des en-têtes
For Each clef In dico ' pour chaque article (unique) du magasin désiré (donc les éléments de dico)
For Each ligne In Split(Mid(dico(clef), 2), ";") ' pour chaque ligne correspondant à l'article
' le mid() sert à sauter le ";" en tête. Sinon
' le premier élément du split serait la chaine vide
n = n + 1 'le numéro de ligne du résultat est incrémenté de 1
For j = 1 To UBound(t, 2): t(n, j) = t(ligne, j): Next 'copie de la ligne i vers la ligne n
Next ligne
Next clef
Range("g1").Resize(Rows.Count, 3).ClearContents 'RàZ des résultats précédents
Range("g1").Resize(n, 3) = t 'transfert du résultat (ligne 1 à n de t) sur la feuille
End Sub