Bonjour,
Comme l'a écrit BsAlv, il suffit d'jouter une gestion d'erreur.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
If Target.Address = "$D$1" Then
ActiveSheet.ShowAllData
End If
Calculate 'permet d'appliquer la MFC sur la ligne sélectionnée
End Sub
**************************************************************************************************************************
On peut aussi, traiter la cause de l'erreur, en comparant le nombre total de lignes du tableau avec le nombre de lignes visibles après filtrage.
Là aussi, il y a une gestion d'erreur mais qui est là, uniquement pour forcer la sortie de la macro en cas d'anomalies pendant le déroulement de la macro, mais la cause de cette anomalie, ne sera pas provoquée par l'absence de zone filtrée. Certes, c'est un poil plus long mais plus "propre", enfin, c'est mon point de vue.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Derlig&, Nb_lig_Vis&
On Error GoTo Sortie ' si une erreur se produit en cours d'exécution, on se redirige vers la sortie
Application.EnableEvents = False ' on arrête la surveillance évènementielle
Derlig = Range("A" & Rows.Count).End(xlUp).Row - 2 'nombre total de lignes du tableau - les 2 premières
Nb_lig_Vis = Range("_FilterDataBase").Resize(, 1).SpecialCells(xlCellTypeVisible).Count - 1 'Nombre de lignes visibles après filtrage
'si la cellule sélectionnée est D1 et la comparaison du nombre de lignes entre DerLig et Nb_lig_Vis est différente, alors on désactive le filtre
If Target.Address = "$D$1" And Nb_lig_Vis <> Derlig Then ActiveSheet.ShowAllData
Calculate 'permet d'appliquer la MFC sur la ligne sélectionnée
Sortie:
Application.EnableEvents = True ' on remet en marche la surveillance évènementielle
End Sub
Cdlt