Sub Rechercher()
Dim F As Worksheet, d As Object, tablo, i&, source, resu(), lig&, n&, j%
Set F = Feuil4 'CodeName de la feuille de destination
If F.FilterMode Then F.ShowAllData 'si la feuille est filtrée
F.[C:C].ClearContents 'effacement des repères en colonne C
'---liste des villes à rechercher---
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignoré
tablo = F.Range("B1:C" & F.Range("B" & F.Rows.Count).End(xlUp).Row) 'matrice, plus rapides
For i = 2 To UBound(tablo)
If tablo(i, 1) <> "" Then d(tablo(i, 1)) = i 'repère la ligne
Next
'---analyse du tableau source---
source = Feuil1.UsedRange.Columns("A:T") 'matrice, plus rapide
ReDim resu(1 To UBound(source), 1 To 19) 'tableau pour les résultats
For i = 1 To UBound(source)
lig = d(source(i, 3))
If lig Then
n = n + 1
For j = 1 To 19: resu(n, j) = source(i, j + 1): Next
tablo(lig, 2) = " " 'repère invisible en colonne C
End If
Next
'---restitution---
If n Then
F.[C1].Resize(UBound(tablo)) = Application.Index(tablo, , 2)
F.[D2].Resize(n, 19) = resu
F.[D2].Resize(n, 19).Borders.Weight = xlHairline 'bordures
End If
F.Range("D" & n + 2 & ":V" & F.Rows.Count).Delete xlUp 'RAZ en dessous
F.Visible = xlSheetVisible 'si la feuille est masquée
Application.Goto F.[A1], True 'cadrage
End Sub