j'ai mis en variable les colonnes & lignes de début et fin à partir d'une zone qui est l'intersection de la colonne des villes et de la ligne des villes, zone appelée ... villes
le code unique quelque soit le bouton est :
Sub filtrer()
choix = ActiveSheet.Buttons(Application.Caller).Caption
Cells.Select
Selection.EntireColumn.Hidden = False
Selection.EntireRow.Hidden = False
If choix = "Tous" Then Exit Sub
depuisL = Cells(1, [villes].Column).End(xlDown).Row
depuisC = Cells([villes].Row, 1).End(xlToRight).Column
jusqueL = Cells(Rows.Count, [villes].Column).End(xlUp).Row
jusqueC = Cells([villes].Row, Columns.Count).End(xlToLeft).Column
For col = jusqueC To depuisC Step -1
If Cells([villes].Row, col) <> choix Then Columns(col).EntireColumn.Hidden = True
Next
For lig = jusqueL To depuisL Step -1
If Cells(lig, [villes].Column) <> choix Then Rows(lig).EntireRow.Hidden = True
Next
End Sub