IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Hiérarchie entre évènements Workbook_SheetChange et Worksheet_Change ? [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Programmeur VBA amateur
    Inscrit en
    Février 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur VBA amateur
    Secteur : Finance

    Informations forums :
    Inscription : Février 2020
    Messages : 3
    Par défaut Hiérarchie entre évènements Workbook_SheetChange et Worksheet_Change ?
    Bonjour,

    J'ai un fichier comprenant plusieurs feuilles. Je gère les changements de valeurs de certaines cellules des certaines feuilles avec des évènements Worksheet_change sur chaque feuille. Jusque là ça va.

    Après certaines lectures de forum, j'ai pensé gérer les modifications de certaines autres cellules ayant un impact sur plusieurs feuilles à l'aide d'un évènement Workbook_SheetChange.

    Est-ce que les deux, Worksheet_Change et Workbook_SheetChange, peuvent cohabiter sans problèmes ou si ça risque de planter?

    J'ai un doute!

    Merci

    JF

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 385
    Par défaut
    Bonjour,

    Oui les deux événements peuvent cohabiter.
    Il faut néanmoins faire très attention car c'est vite fait de rentrer dans des boucles infinies...
    Sans aucune précision de ta part, c'est l'événement Worksheet_Change qui se déclenchera en premier.
    Et ensuite l'événement Worksheet_SheetChange se déclenchera (sauf si l'événement Worksheet_Change modifie une cellule,auquel cas il s'appellera lui même à nouveau).

    Il faut donc bien penser à "borner" les cellule qu'on veut tester en modification avec par exemple : If Not Application.Intersect(Target, Range("A1")) Is Nothing Then

  3. #3
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Les deux évènements cohabitent naturellement, Worksheet_Change se produit avant Workbook_SheetChange
    Pour éviter de rentrer dans des boucles récursives infinies, lorsque la macro modifie une cellule, il penser à désactiver les évènements :
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Application.EnableEvents = False
      ' Ici le code qui modifie une cellule et provoque les 2 évènements _Change et _SheetChange
      ' ....
      Application.EnableEvents = True
    Noter que ceci est vrai pour toute procédure évènementielle, lorsque le code de cette procédure provoque le même évènement qui la déclenche.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Programmeur VBA amateur
    Inscrit en
    Février 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur VBA amateur
    Secteur : Finance

    Informations forums :
    Inscription : Février 2020
    Messages : 3
    Par défaut
    Merci Patrice et Mat pour vos réponses et désolé pour la coquille : je voulais bien sûr parler de Workbook_SheetChange!!!

    Une dernière question!

    Puisque WorkSheet_Change s'exécute en premier, si je désactive les évènements en entrant dans son code et que je les réactive avant d'en sortir, est-ce que WorkBook_SheetChange va se rappeller du changement de cellule qui a tout déclenché pour s'exécuter elle-aussi? J'imagine que oui; mais je pose la question juste au cas...

    Merci

  5. #5
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Citation Envoyé par jieffel44 Voir le message
    Puisque WorkSheet_Change s'exécute en premier, si je désactive les évènements en entrant dans son code et que je les réactive avant d'en sortir, est-ce que WorkBook_SheetChange va se rappeller du changement de cellule qui a tout déclenché pour s'exécuter elle-aussi? J'imagine que oui; mais je pose la question juste au cas...
    Oui, désactiver les évènements évite qu'un nouvel évènement soit généré pendant le traitement mais ça ne supprime pas les évènements qui se sont déjà produits et qui sont en attente de traitement.
    Par exemple essaies ces codes - dans le module de feuille :
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Worksheet_Change(ByVal Target As Range)
    '  Application.EnableEvents = False
      If Target.Address = "$A$1" Then
        Range("B1").Value = "Ok"
      End If
      MsgBox "Cellule " & Target.Address
      Application.EnableEvents = True
    End Sub
    Et dans le module du classeur :
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      MsgBox "Feuille " & Sh.Name & " - Cellule " & Target.Address
    End Sub
    Modifier A1 pour voir la chronologie des évènements.
    Puis enlève l'apostrophe (commentaire) de la ligne 2 et recommence.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD15] Hiérarchie des évènements
    Par GCASPIC10 dans le forum WinDev
    Réponses: 3
    Dernier message: 11/08/2010, 12h01
  2. [SSAS] [2K5] Hiérarchie entre 2 dimensions
    Par Sam3oul dans le forum SSAS
    Réponses: 1
    Dernier message: 20/03/2009, 12h03
  3. Entrée évènement dans un combobox
    Par guillaume89 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 21/08/2008, 18h40
  4. [AJAX] Décalage entre évènement et renvoi serveur
    Par Aurias dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/06/2006, 15h45
  5. plantage entre l'événement close et destroy
    Par dvarrel dans le forum Langage
    Réponses: 2
    Dernier message: 20/02/2006, 22h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo