problème de "target" et worksheet_change

  • Initiateur de la discussion Initiateur de la discussion Blafi
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Blafi

XLDnaute Occasionnel
Bonjour à tous et bon week-end,

Juste un petit problème que je rencontre : dans le fichier joint feuille1, je cherche par une macro à mettre une valeur en colonne C en fonction de la valeur entrée en colonne B.

j'ai déja résolu la chose par formule mais, pour le plaisir j'ai essayé de faire une macro (et elle marche pas !)

Si par exemple la valeur entrée est <61, je dois avoir 8 en colonne B, si la valeur entrée est >=61 et <80 je dois obtenir 6 etc...

J'ai utilisé pour cela une macro worsheet_change en fonction de la valeur entrée dans la "target"...

Mon pb : lorsque je rentre une valeur, toutes les cellules à droite se remplissent avec une valeur alors que je voudrais seulement remplir la colonne C...

J'ai certainement raté un truc dans ma macro ou pas compris l'utilisation de worsheet_change...

Pouvez-vous m'aider ?

Merci d'avance et à bientôt.
 

Pièces jointes

Re : problème de "target" et worksheet_change

Salut Blafi, le Forum

peu-être comme cela

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

If Not (IsNumeric(Target)) Then Exit Sub
[B]If Not Intersect(Range("B2:B8"), Target) Is Nothing Then[/B]
 Vava = Target.Value
 
 Select Case Vava
    Case Is < 61
        Target.Offset(0, 1).Value = 8
    Case 61 To 80
        Target.Offset(0, 1).Value = 6
    Case 81 To 150
        Target.Offset(0, 1).Value = 4
    Case Is > 150
        Target.Offset(0, 1).Value = 0
End Select
[B]End If[/B]
End Sub
Bonne Journée
 
Re : problème de "target" et worksheet_change

Bonjour Blafi, Dull,

Si je puis me permettre une petite précision dictée par mon expérience personnelle :

Il faut toujours être très prudent dans l'utilisation de la procédure événementielle Worksheet_Change, car elle s'exécute à chaque modification d'une cellule, et celà peut être sans fin. Il faut donc bien réfléchir aux conditions de tests pour éviter ce phénomène, c'est ce qu'a fait ici Dull en testant la position de la cellule. Ainsi, lorsque la procédure s'exécute au changement de la valeur d'une cellule, si celle-ci n'est pas située dans la plage définie, la procédure se termine sans autre action.

Je tenais à apporter cette précision, car cette procédure n'est pas toujours bien comprise : il m'a fallu moi-même un certain temps pour évaluer ce phénomène (et j'arrive encore à me faire piéger !).

Espérant avoir été utile.

Cordialement.
 
Re : problème de "target" et worksheet_change

Bonjour à tous
La gestion de l'évènement Worksheet_Change est effectivement délicate comme le remarque Papou-net.
Même avec la précaution prise par Dull, la procédure se répète inutilement. Pour s'en convaincre, il suffit de l'exécuter pas à pas.
Pour y remédier, j'écrirais plutôt :
Code:
[COLOR="DarkSlateGray"][B]Private Sub Worksheet_Change(ByVal Target As Range)
   If IsNumeric(Target) And Not Intersect(Range("B2:B8"), Target) Is Nothing Then
      [COLOR="Sienna"]Application.EnableEvents = False[/COLOR]
      With Target
         Select Case .Value
            Case Is < 61: .Offset(0, 1).Value = 8
            Case 61 To 80: .Offset(0, 1).Value = 6
            Case 81 To 150: .Offset(0, 1).Value = 4
            Case Is > 150: .Offset(0, 1).Value = 0
         End Select
      End With
      [COLOR="Sienna"]Application.EnableEvents = True[/COLOR]
   End If
End Sub[/B][/COLOR]
Le danger est que, si une erreur survient entre les lignes Application.EnableEvents = False et Application.EnableEvents = True, la gestion des évènements restera inhibée et plus aucune procédure évènementielle ne s'exécutera. Il faut donc être certain que le code est très propre, ou, en cas de doute, prévoir une procédure de gestion des erreurs.
Par exemple :
Code:
[COLOR="DarkSlateGray"][B]Private Sub Worksheet_Change(ByVal Target As Range)
   If IsNumeric(Target) And Not Intersect(Range("B2:B8"), Target) Is Nothing Then
      Application.EnableEvents = False
      On Error GoTo E
      With Target
         Select Case .Value
            Case Is < 61: .Offset(0, 1).Value = 8
            Case 61 To 80: .Offset(0, 1).Value = 6
            Case 81 To 150: .Offset(0, 1).Value = 4
            Case Is > 150: .Offset(0, 1).Value = 0
         End Select
      End With
R:    Application.EnableEvents = True
   End If
Exit Sub
[COLOR="SeaGreen"]'[/COLOR]
E: MsgBox "Une erreur imprévue et survenue.", vbOKOnly, "A T T E N T I O N  !"
Resume R
End Sub[/B][/COLOR]
ROGER2327
#3317
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
9
Affichages
508
Retour