Private Sub Worksheet_Change(ByVal Target As Range)
Dim P As Range
Set P = Intersect(ListObjects(1).DataBodyRange, Range([Debut], Columns(Columns.Count))) 'zone des "X"
If P Is Nothing Then Exit Sub
If Not Intersect(Target, [Choix]) Is Nothing Then
Application.ScreenUpdating = False
If FilterMode Then ShowAllData 'si la feuille est filtrée
With ListObjects(1).Range
.AutoFilter: .AutoFilter 'si le tableau Excel est filtré
.Rows.Hidden = False 'RAZ
.Sort [Nom], xlAscending, Header:=xlYes 'tri sur les noms
End With
[Nom].EntireColumn.Name = "Col" 'colonne(A) nommée
Application.EnableEvents = False 'désactive les évènements
P = "=REPT(""X"",(Choix<>"""")*IF(Choix=""Ventiler"",(Date>=Du)*(Date<=Au),IF(Nom<>OFFSET(Nom,-1,),SIGN(SUMPRODUCT((Date>=OFFSET(Du,,,COUNTIF(Col,Nom)))*(Date<=OFFSET(Au,,,COUNTIF(Col,Nom))))))))"
P = P.Value 'supprime les formules
Application.EnableEvents = True 'réactive les évènements
If [Choix] <> "Ventiler" Then
P.EntireRow.Hidden = True 'masque toutes les lignes
On Error Resume Next 'si aucune SpecialCell
P.SpecialCells(xlCellTypeConstants).EntireRow.Hidden = False 'affiche les lignes non vides
End If
ElseIf Not Intersect(Target, ListObjects(1).DataBodyRange) Is Nothing Then
If [Choix] <> "Ventiler" Then [Choix] = "Ventiler": Exit Sub
Set P = Intersect(Target.EntireRow, P)
Application.AutoCorrect.AutoFillFormulasInLists = False 'désactive la propagation des formules
Application.EnableEvents = False 'désactive les évènements
P = "=REPT(""X"",(Date>=Du)*(Date<=Au))"
For Each P In P.Areas
P = P.Value 'supprime les formules de chaque zone
Next
Application.EnableEvents = True 'réactive les évènements
Application.AutoCorrect.AutoFillFormulasInLists = True 'réactive la propagation des formules
End If
End Sub