Bonsoir Maximus, pat1545, JeanMarie, le Forum,
Le problème que tu rencontres Maximus est dû à une réaction en cascade de cet évènement Change() dans ton code.
En effet, à chaque modification d'une cellule quelconque de ta feuille, l'évènement Change() va se déclencher. Ce qui implique qu'à chaque passage dans ce code, si F14 vaut 'Fait' alors G14 va être requalifier en 'Username' (même s'il l'est déjà !). Cette requalification par le code va donc entraîner à nouveau un nouvel évènement Change() à son tour, etc..., etc...et le code va tourner en rond jusqu'au plantage d'Excel !
Si tu veux conserver le code tel que tu l'as écrit, tu pourrais donc faire comme ça :
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Range('F14') = 'Fait' Then Range('G14') = Application.UserName
If Range('F15') = 'Fait' Then Range('G15') = Application.UserName
Application.EnableEvents = True
End Sub
Cette instruction 'Application.EnableEvents = False' permet de désactiver la gestion des évènements dans VBA, avant traitement, afin d'éviter à ton code de tourner en boucle. Il est toutefois IMPERATIF de rétablir EnableEvents à TRUE avant de quitter la procédure sous peine de te retrouver avec une application ayant perdu toute réactivité par la suite...
Cela dit, si les cellules F14 ou F15 sont destinées à être modifiées (saisies) manuellement par l'utilisateur, il serait certainement préférable d'utiliser une formulation comme celle-ci :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Not Application.Intersect(Target, Range('F14:F15')) Is Nothing Then
If Target = 'Fait' Then Target.Offset(0, 1) = Application.UserName
End If
End Sub
Ce code à l'avantage de n'appliquer le traitement que si, et seulement si, les cellules F14 ou F15 sont en cours de modification. Cela évite ainsi l'utilisation de EnableEvents qui reste une propriété très sensible et donc à éviter au maximum...
Cordialement,