S'il y a vraiment besoin d'un code, bien que ma précédente démonstration donne déjà immédiatement le résultat escompté
vu le peu de données dans le fichier joint soit en effaçant la ligne 2 soit en modifiant la source des listes dans son code,
la voie encore plus simple et plus rapide est d'utiliser un filtre avancé :
Sub DemoAdvanced1()
With Feuil2
.UsedRange.Clear
Feuil1.[A1:C1].Copy .[A1]
.[A1].Replace "Venus en", "Disparus de", xlPart
.[C1].Replace "Venus", "Nouveaux", xlPart
V = [{"C","","A"}]
For C% = 1 To 3 Step 2
.[F2].Formula = "=ISERROR(MATCH(Feuil1!" & Chr(64 + C) & "3,Feuil1!$" & V(C) & _
"$2:" & Feuil1.Cells(2, V(C)).End(xlDown).Address & ",0))"
Range(Feuil1.Cells(2, C), Feuil1.Cells(2, C).End(xlDown)).AdvancedFilter _
xlFilterCopy, .[F1:F2], .Cells(2, C)
Next
.[F2].Clear
.Activate
End With
End Sub
Seulement deux instructions sont nécessaires pour obtenir le résultat avec un filtre avancé comme dans la boucle :
une pour définir la formule du critère calculé et l'autre pour exécuter le filtre avancé …
Le code n'en est que plus efficace tout en conservant la présentation des listes sources !
Avec la formule du classeur joint de Steelson limitée à la plage effective car c'est bien plus rapide que sur la colonne entière :
Sub DemoAdvanced2()
With Feuil2
.UsedRange.Clear
Feuil1.[A1:C1].Copy .[A1]
.[A1].Replace "Venus en", "Disparus de", xlPart
.[C1].Replace "Venus", "Nouveaux", xlPart
V = [{"C","","A"}]
For C% = 1 To 3 Step 2
.[F2].Formula = "=COUNTIF(Feuil1!$" & V(C) & "$3:" & Feuil1.Cells(2, V(C)) _
.End(xlDown).Address & ",Feuil1!" & Chr(64 + C) & "3)=0"
Range(Feuil1.Cells(2, C), Feuil1.Cells(2, C).End(xlDown)).AdvancedFilter _
xlFilterCopy, .[F1:F2], .Cells(2, C)
Next
.[F2].Clear
.Activate
End With
End Sub
La formule du critère calculé pourrait se passer des références de feuille en la plaçant directement dans la feuille source …