Option Explicit
Private TEST As Boolean 'déclare la variable TEST
Private V123 As Boolean 'déclare la variaboe V123
Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
'si le changement a lieu ailleurs qu'en B4 ou B7, sort de la procédure
If Not Application.Intersect(Target, Range("B4"), Range("B7")) Is Nothing Then Exit Sub
If TEST = True Then Exit Sub 'si text est vraie, sort de la procédure
TEST = True 'définit la variable TEST
If Target.Address = "$B$4" Then 'condition : si le changement a lien en B4
Select Case Target.Value 'agit en fonction de la valeur de B4
Case 1, 2, 3 'cas B4 vaut 1, 2 ou 3
V123 = True 'définit la variable V123
Range("B5").Validation.Delete 'supprime la validation de données en B5
Range("B5").Value = 200 'définit la valeur de B5
Case 4 'cas B4 vaut 4
With Range("B5").Validation 'prend en compte la validation de données en B4
.Delete 'supprime une liste de validation éventuelle
'définit la nouvelle liste de validation
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=$J$6:$J$8"
End With 'fin de la prise en compte de la validation de données
Range("B5").Value = "" 'vide la cellule B5
Case 5 'cas B4 vaut 5
Range("B5").Validation.Delete 'supprime la validation de données en B5
Range("B5").Value = "" 'définit la valeur de B5
Case "" 'cas ou B4 est effacée
Range("B5").Value = "" 'efface B5, B7 et B9
Range("B7").Value = ""
Range("B9").Value = ""
End Select 'fin de l'action en fonction de la valeur de B4
End If 'fin de la condition
If Range("B7").Value <> 0 Then 'Condition : si B7 né st pas nulle
Range("B9").Value = CInt(Range("B5").Value) * CInt(Range("B7").Value) 'place le calcul em B9
'si V123 est vrai et le calcul dépasse 1000, place 1000 en B9: initialise la variable V123
If V123 = True And CInt(Range("B5").Value) * CInt(Range("B7").Value) > 1000 Then Range("B9").Value = 1000: V123 = False
End If 'fin de la condition
TEST = False 'initialise la variable TEST
End Sub