Bonjour à tous,
J'avais commencé un truc en VBA mais comme il y avait des réponses je n'avais pas publié ; je me lance.
On n'utilise ni tableau, ni dictionary. Juste une formule qui renvoie #N/A si la ligne est un doublon sur le champ 'Code BT' et du tri.
Une fonctionnalité ajoutée sans doute inutile : pour chaque tableau source, on ôte d'abord les doublons propres à chaque tableau pour n'avoir que des enregistrements uniques. Si chaque tableau source ne comporte aucun doublon en son sein, alors on retombe sur les résultats des autres méthodes.
Le traitement est relativement rapide avec un grand nombre de lignes. Le code est un peu commenté dans le fichier joint.
Sub singleton()
Dim PremLigR&, DerLigR&, t0
t0 = Timer
Application.ScreenUpdating = False
With Sheets("résultat")
.Activate
.Range("a:d").Clear
Sheets("Feuil1").Range("a1").CurrentRegion.Copy .Range("a1")
.Range("a1").CurrentRegion.RemoveDuplicates Columns:=Array(1), Header:=xlYes
PremLigR = .Cells(Rows.Count, "a").End(xlUp).Row
.Range("d2:d" & PremLigR) = "Feuil1"
Sheets("Feuil2").Range("a1").CurrentRegion.Copy .Cells(PremLigR + 1, "a")
DerLigR = .Cells(Rows.Count, "a").End(xlUp).Row
.Cells(PremLigR + 1, "d").Resize(DerLigR - PremLigR) = "Feuil2"
.Cells(PremLigR, "a").Resize(DerLigR - PremLigR + 1, 4).RemoveDuplicates Columns:=Array(1), Header:=xlYes
.Cells(PremLigR + 1, "a").EntireRow.Delete
DerLigR = .Cells(Rows.Count, "a").End(xlUp).Row
.Cells(1, "a").Resize(DerLigR, 4).Sort key1:=.Range("a1"), order1:=xlAscending, Header:=xlYes
.Cells(2, "c").Resize(DerLigR - 1).FormulaR1C1 = "=IF(OR(RC[-2]=R[-1]C[-2],RC[-2]=R[1]C[-2]),NA(),"""")"
.Cells(2, "c").Resize(DerLigR - 1) = .Cells(2, "c").Resize(DerLigR).Value
.Cells(1, "a").Resize(DerLigR, 4).Sort key1:=.Range("c1"), order1:=xlAscending, Header:=xlYes
On Error Resume Next
Columns("c:c").SpecialCells(xlCellTypeConstants, 16).EntireRow.Delete
Columns("c:c").EntireColumn.Delete
Range("a1").CurrentRegion.Borders.LineStyle = xlContinuous
End With
MsgBox Format(Timer - t0, "#,##0.00\ sec")
End Sub