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 :

Machin.enableevents = True/False


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2017
    Messages : 40
    Par défaut Machin.enableevents = True/False
    Bonjour à tous,

    Voilà le problème : si on écrit application.enableevents = False/True ça a l'air de s'appliquer à "tout le monde" (i.e. si je suis sur la feuille 1 d'un classeur multi-feuille ça s'applique aux autres feuilles) est-ce qu'il y a moyen de créer par exemple un worksheet.enableevents ? Ou de mettre en place son propre gestionnaire d'évènement (mais ça doit dépasser mon niveau).

    Merci de vos réponses.

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Difficile de définir la stratégie ad hoc dans l'ignorance du contexte (que tu es seul à connaître).

    Sans connaître le contexte, voilà un exemple de ce que l'on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
      if sh.name = "toto" then application.enableevents = false else application.enableevents = true
    End Sub
    Qui inhibe les évènement de la seule feuille "toto".

    Reste à savoir si utile dans ton contexte ! (tu es bien le seul à le savoir)

  3. #3
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2017
    Messages : 40
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour
    Difficile de définir la stratégie ad hoc dans l'ignorance du contexte (que tu es seul à connaître).

    Sans connaître le contexte, voilà un exemple de ce que l'on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
      if sh.name = "toto" then application.enableevents = false else application.enableevents = true
    End Sub
    Qui inhibe les évènement de la seule feuille "toto".

    Reste à savoir si utile dans ton contexte ! (tu es bien le seul à le savoir)
    Bonsoir,

    Merci de me répondre ça me permet de voir qu'il faut que je précise ma question :

    supposons que je sois sur feuille1 dans une sub :

    Code : 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)  ' Worksheet_Change de feuille1
    
       Application.EnableEvents = False
       ...
       Application.EnableEvents = True
    
    End Sub
    et que je veuille faire exécuter :

    Code : 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)  ' Worksheet_Change de feuille2
    
       Application.EnableEvents = False
       ...
       Application.EnableEvents = True
    
    End Sub
    Ça ne marche pas (pas d'événement dans feuille2...), ça serait très pratique de pouvoir avoir :

    Feuille1.Enableevents = False

    Mais c'est peut-être très compliqué voire impossible ?

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Ce que tu demandes est impossible puisque cette propriété est une propriété de l'objet Application et non une propriété d'un objet Worksheet.
    Des parades existent bien évidemment pour faire face à d'éventuelles nécessités. Leur choix dépend TOUJOURS du contexte et peut être très différent entre deux cas de figure.

    Tu peux par exemple faire en sorte que l'évènement change d'une feuille ne fasse rien dans certaines circonstances, en jouant par exemple et entre autres avec une variable booléenne générale et en quittant la procédure évènementielle si cette variable = True ou en en exécutant les instructions si = False.
    Mais ce sera là la construction d'une stratégie qui ne peut bien évidemment être mise en oeuvre qu'en parfaite connaissance des mécanismes de ta propre application.
    Je t'ai donné à cette fin le mécanisme (expression conditionnelle) à appliquer dans l'évènement Change de ta feuille. Tu es par contre bien évidemment seul à décider quand et où mettre à True ou à false la booléenne utilisée.

  5. #5
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2017
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2017
    Messages : 40
    Par défaut
    Bonjour,

    Je m'explique décidément mal : si j'ai deux feuilles T1 et T2, je peux avoir

    T1 True ET T2 True ou T1 False ET T2 False mais pas :
    T1 True ET T2 False ou T1 False ET T2 True ...

    J'ai dans mes feuilles, pour T1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Option Explicit
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Sec1 As Single
    Dim Sec2 As Single
     
    Sec1 = Timer()
    Application.EnableEvents = False
    Worksheets("T2").Activate
    Sec2 = Timer()
     
    While Sec2 < Sec1 + 10
        Sec2 = Timer()
    Wend
     
    MsgBox " T1 "
    Application.EnableEvents = True
     
    End Sub
    et pour T2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Explicit
     
    Sub Worksheet_Activate()
    MsgBox " T2 "
    End Sub
    Si je sélectionne une cellule dans T1, je ne peux plus RIEN faire avant la fin du "timer"...
    Qui plus est à la fin de du Worksheet_SelectionChange :

    - la msgbox de T1 est affichée (Normal),
    - la feuille T2 est sélectionnée (??? ça voudrait dire que d'une certaine façon on peut l'atteindre...)
    - la msgbox de T2 ne s'affiche pas après click sur celle de T1 (Normal elle n'a pas eu d'événement... ).

    Et désolé mais je ne vois pas comment faire pour changer ça.

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Je ne sais pas ce que tu fabriques, mais réitère ce que je t'ai déjà dit :
    Il est toujours possible, en lieu et place d'inhiber un évènement, d'inclure dans sa procédure évènementielle une expression conditionnelle dont la vocation est d'exécuter ou non les instructions qu'elle contient.
    Cette expression conditionnelle peut utiliser la valeur True ou False d'une variable booléenne générale créée à cette fin.
    Ainsi (exemple valable quelle que soit la procédure) --->> shéma --->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub proc1
      if toto = false then
         ' instructions
      end if
    end sub
    il est clair que toto doit avoir une portée la rendant accessible depuis le module de code de la procédure proc1. Si plusieurs modules impliqués --->> déclarer toto en Public dans un module standard, ainsi
    A partir de là :
    - même si est lancée la procédure proc1, ses instructions ne seront pas exécutées si toto = true
    Reste à donner (là où tu le veux dans ton code) à toto la valeur true ou false selon le résultat que tu veux.

    Le mécanisme est le même, qu'il s'agisse ou non d'une procédure évènementielle.
    Ce mécanisme est tel qu'il n'inhibe pas les évènements, mais que leurs instructions sont ou non exécutées. Ce n'est pas pareil, mais le résultat est bien évidemment le même.

Discussions similaires

  1. [Hibernate] inverse true/false
    Par srvremi dans le forum Hibernate
    Réponses: 3
    Dernier message: 14/11/2009, 15h40
  2. Réponses: 1
    Dernier message: 07/10/2007, 19h38
  3. Saut de ligne - visible = true / false
    Par starkson dans le forum ASP.NET
    Réponses: 3
    Dernier message: 27/08/2007, 22h21
  4. True false mysql
    Par foxmaster2005 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 06/02/2007, 13h11
  5. DBGrid Enabled true/false > pb de rafraichissement
    Par Harry dans le forum Bases de données
    Réponses: 8
    Dernier message: 14/10/2004, 16h50

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