Private test As Boolean 'déclare la variable test
Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim plp As Range 'déclare la variable plp (PLage des P) qui borde la mer d'alors bien entendu...
Dim plg As Range 'déclare la variable plg (PLage des G)
If test = True Then Exit Sub 'si la variable test est vrai, sort de la procédure
If Target.Cells.Count > 1 Then Exit Sub 'si la sélection contient plus d'une seule cellule, sort de la procédure
'définit la variable plp
Set plp = Application.Union(Range("B1"), Range("B4"), Range("B7"), Range("B10"), Range("B13"), Range("B16"), _
Range("E1"), Range("E4"), Range("E7"))
'définit la variable plg
Set plg = Application.Union(Range("B2"), Range("B5"), Range("B8"), Range("B11"), Range("B14"), Range("B17"), _
Range("E2"), Range("E5"), Range("E8"))
'condition 1 : si le changement a lieu dans la plage des p
If Not Application.Intersect(Target, plp) Is Nothing Then
'définit la variable test, écrit "G" ou rien dans la cellule en dessous
test = True: Target.Offset(1, 0) = IIf(UCase(Target.Value) = "P", "G", "")
'condition 2 : si le changement a lieu dans la plage des g
ElseIf Not Application.Intersect(Target, plg) Is Nothing Then
'définit la variable test, écrit "P" ou rien dans la cellule au dessus
test = True: Target.Offset(-1, 0) = IIf(UCase(Target.Value) = "G", "P", "")
End If 'fin des condition
test = False 'réinitialise la variable test
End Sub