Faire apparaitre le nom utilisateur

  • Initiateur de la discussion Maximus
  • Date de début
M

Maximus

Guest
Bonjour ! Et super ce forum

Voici le code que j'ai placé dans une feuille

Private Sub Worksheet_Change(ByVal Target As Range)
If Range('F14') = 'Fait' Then Range('G14') = Application.UserName

End Sub

Cela marche nickel lorsque la cellule F14 contient le texte 'fait' la cellule d'a coté affiche automatiquement le nom de l'utilisateur qui a saisi la donnée.

Mais mon problème c'est que si j'ajoute cette ligne plus rien ne fonctionne:

Private Sub Worksheet_Change(ByVal Target As Range)
If Range('F14') = 'Fait' Then Range('G14') = Application.UserName
If Range('F15') = 'Fait' Then Range('G15') = Application.UserName

End Sub

Quelqu'un peut -il m'aider (un pro).

Merci pour tous les tuyaux...
 
M

Maximus

Guest
Merci bcp pour votre aide

En fait je souhaite que sur un certain nombre de
cellules, lorsque l'utilisateur saisit service fait (Fait) la cellule a cote fasse apparaitre son user. Mon code marche sur une cellule mais des que je l'applique a plusieurs cela freeze tout.

Je vais voir pour ton code je te tiens au courant

encore merci
 

myDearFriend!

XLDnaute Barbatruc
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,
 

Discussions similaires

Réponses
3
Affichages
210

Statistiques des forums

Discussions
312 338
Messages
2 087 393
Membres
103 537
dernier inscrit
alisafred974