Private Sub Worksheet_Change(ByVal Target As Range)
Dim NS As Byte 'déclare la variable NS (Nombre de Semaines)
Dim PL As Range 'déclare la variable PL (PLage)
Dim NB As Byte 'déclare la variable NB (NomBre)
Dim R As Range 'déclare la variable R (Recherche)
Dim PA As String 'déclare la variable PA (Première Adresse)
Dim COL As Integer 'déclare la variable COL (COLonne)
Dim I As Integer 'déclare la variable I (Incrément)
If Application.Intersect(Target, Range("D5:D6")) Is Nothing Then Exit Sub 'si le changement a lieu ailleurs que dans la plage D5:D6, sort de la procédure
Set PL = Range("A1:" & Cells(1, Application.Columns.Count).Address(0, 0)) 'définit la plage PL
Select Case Target.Address(0, 0) 'agit en fonction de l'adresse de la cellule modifiée
Case "D5" 'cas D5
If Target.Value = "" Then Range("D7").Value = "": Exit Sub 'si la cellule est effacée, efface la somme, sort de la procédure
If Range("D6").Value = "" Then Range("D7").Value = "": Exit Sub 'si D6 est vide, efface la somme, sort de la procédure
Case "D6" 'cas D6
If Target.Value = "" Then Range("D7").Value = "": Exit Sub 'si la cellule est effacée, efface la somme, sort de la procédure
If Range("D5").Value = "" Then Range("D7").Value = "": Exit Sub 'si D5 est vide, efface la somme, sort de la procédure
End Select 'fin de l'action en fonction de...
I = 1 'initialise la variable I
Set R = PL.Find(Range("D5"), Range("A1"), xlValues, xlWhole) 'définit la recherche R
NB = Application.WorksheetFunction.CountIf(PL, Range("D5").Value) 'définit le nombre d'occurrences de la valeur en D5 dans la plage PL
If NB = 1 Then 'condition : si ne nombre d'occurrences trouvé est égal à 1
COL = R.Column 'définit la colonne COL (de la première occurrence trouvée)
Else 'sinon
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
PA = R.Address 'définit l'adresse PA de la première occurrence trouvée (génère une erreur si aucune occurrence trouvée)
If Err <> 0 Then 'condition : si une erreur a été générée
Err.Clear 'supprime l'erreur
MsgBox "Le texte de la recherche n'existe pas !" 'message
Range("D5").Select 'séletionne D5
Exit Sub 'sort de la procédure
End If 'fin de la condition
On Error GoTo 0
Do 'exécute
I = I + 1 'incrément I
Set R = PL.FindNext(R) 'redéfinit la recherche R (occurrence suivante)
If I = NB Then COL = R.Column 'si I est égale au nombre NB, définit la colonne COL (de la dernière occurrence trouvée)
Loop While Not R Is Nothing And R.Address <> PA 'boucle tant qu'il existe de nouvelles occurrences ailleurs qu'en PA
End If 'fin de la condition
'calcul de la somme
Range("D7").Value = Application.WorksheetFunction.Sum(Range(Cells(2, COL - (CInt(Range("D6").Value) - 1)), Cells(2, COL)))
End Sub