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