Private Sub Worksheet_Activate()
Dim ncol%, tablo, d As Object, i&, resu(), x$, n&, j%
With Sheets("Source").[A1].CurrentRegion
ncol = .Columns.Count
If ncol < 21 Then ncol = 21
tablo = .Resize(, ncol) 'matrice, plus rapide
End With
'---liste des éléments concaténés---
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(tablo)
If IsNumeric(CStr(tablo(i, 14))) Then d(tablo(i, 1) & Chr(1) & -tablo(i, 14) & Chr(1) & tablo(i, 21)) = ""
Next i
'---tableau des résultats---
ReDim resu(1 To UBound(tablo), 1 To ncol + 1) 'une colonne de plus
For i = 2 To UBound(tablo)
x = tablo(i, 1) & Chr(1) & tablo(i, 14) & Chr(1) & tablo(i, 21)
If CStr(tablo(i, 4)) <> "103" And CStr(tablo(i, 4)) <> "903" And Not d.exists(x) Then
n = n + 1
resu(n, 1) = i 'récupère le numéro de ligne
For j = 1 To ncol
resu(n, j + 1) = tablo(i, j)
Next j
End If
Next i
'---restitution---
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A2] '1ère cellule de restitution
If n Then .Resize(n, ncol + 1) = resu
.Offset(n).Resize(Rows.Count - n - .Row + 1, ncol + 1).ClearContents 'RAZ en dessous
End With
With UsedRange: End With 'actualise la barre de défilement verticale
End Sub