Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim COL As Byte 'déclare la variable COL (COLonne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim T As Integer 'déclare la variable T (Total)
If Application.Intersect(Target, Range("B2:U2")) Is Nothing Then Exit Sub 'si le changement a lieu ailleurs qu'en B2:U2, sort de la procédure
If Target.Value = "" Then Target.Offset(1, 0).Value = "": Exit Sub 'si la cellule est effacée, efface la cellule en-dessous et sort de la procédure
DL = Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A
COL = Target.Column + 3 'définit la colonne COL (3 colonnes de plus que la colonne de la cellule modifiée)
Set PL = Range(Cells(9, COL), Cells(DL, COL)).SpecialCells(xlCellTypeVisible) 'définit la plage PL (les cellule visibles de la plage des lignes 9 à DL de colonne COL)
For Each CEL In PL 'boucle sur toutes les cellules CEL de la plage PL
If CEL.Value = Target.Value Then T = T + 1 'si la valeur de la cellule CEL est égale à la valeur de la cellule modifiée, incrémente T de +1
Next CEL 'prochaine celule de la boucle
Target.Offset(1, 0).Value = T 'renvoie le total T dans la cellule en dessous de la cellule modifiée
End Sub