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 :

Application.EnableEvents = False


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 29
    Par défaut Application.EnableEvents = False
    Comment empêcher l'exécution du script MonObjet_Change() dans un dialogue lors qu'on lui affecte une valeur par programmation ?

    J'ai tenté d'encadrer l'affectation comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.EnableEvents = False
    MonChamp = 999
    Application.EnableEvents = True
    mais le script MonObjet_Change() est malgré tout exécuté...

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    bonjour,

    rends les evenements inactif à l ouverture du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Workbook_Open()
    application..EnableEvents = False
    End Sub
    puis lorsque la boite de dialogue est validée tu rends les evenements actifs

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 29
    Par défaut
    Citation Envoyé par patbou Voir le message
    bonjour,

    rends les evenements inactif à l ouverture du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Workbook_Open()
    application..EnableEvents = False
    End Sub
    puis lorsque la boite de dialogue est validée tu rends les evenements actifs
    Tu as une explication du pourquoi ce n'est pas possible de "juste" encadrer l'affectation ?

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    c une question forte interessante

    j ai fait l essais avec 2 txtbox , et je constate qu on ne peut " arreter" le message evenement que ce soit en rendant le control enable ou l application.
    j ai essayé de rajouter une boucle ,ss resultat

    je vais regarder d un peu plus pres le fct des evenements !!!

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Par défaut
    Crées une variable globale dans la section Déclarations du UserForm, comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public MonObjet_ProcessusEnCours as Boolean
    et avant d'affecter une nouvelle valeur au contrôle, mets une ligne comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonObjet_ProcessusEnCours = True
    Ensuite, dans MonObjet_Change(), vérifies MonObjet_ProcessusEnCours avant de procéder aux opérations.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub MonObjet_Change()
        If MonObjet_ProcessusEnCours = True Then
            MonObjet_ProcessusEnCours = False
            Exit Sub
        End If
        ...
    End Sub

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 29
    Par défaut
    Citation Envoyé par Singular Voir le message
    Crées une variable globale dans la section Déclarations du UserForm, comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public MonObjet_ProcessusEnCours as Boolean
    et avant d'affecter une nouvelle valeur au contrôle, mets une ligne comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonObjet_ProcessusEnCours = True
    Ensuite, dans MonObjet_Change(), vérifies MonObjet_ProcessusEnCours avant de procéder aux opérations.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub MonObjet_Change()
        If MonObjet_ProcessusEnCours = True Then
            MonObjet_ProcessusEnCours = False
            Exit Sub
        End If
        ...
    End Sub
    Oui, j'y avais pensé aussi, de faire cela pour tous mes objets de mon formulaire... Mais je trouvais ca tellement lourd comme solution, alors qu'il doit s'agir d'un probleme que tout le monde rencontre... Je me suis dis qu'il devait y avoir une manière plus simple de régler l'affaire...

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Par défaut
    Désolé mais l'objet UserForm est membre de la référence MSForms et non de Excel.

    Il est donc impossible pour Application de gérer les évènements des UserForms.

    Et comme il n'y a pas d'équivalent à EnableEvents dans MSForms...

    J'ai longtemps bossé sur le problème mais, pas de gâteau!!!

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 29
    Par défaut
    Il n'y a plus qu'à implementer la technique de Montréal...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 29
    Par défaut
    En fait, au lieu de gérer soit meme un booleen, on peut dans les script tester (Application.EnableEvents = true)

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    mais j ai essayé en rendant un controle enable :
    le controle passe bien inactif (du moins celui ci n est plus en surbrillance) par contre l evenement associé est detecté et realisé.

    ds un userforms place 2 txtbox puis ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub TextBox1_Change()
    TextBox2.Enabled = False
    TextBox2.Value = TextBox1.Value
    End Sub
     
    Private Sub TextBox2_Change()
    MsgBox "raté"
    End Sub
    tu verras le resultat

  11. #11
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 62
    Par défaut Ejecter une procédure évènementielle
    Bonjour à tous,

    Presque 10 ans, jour-pour-jour par rapport à l'ouverture de cette discussion (non encore fermée !) que je viens de découvrir, je voudrais vous soumettre une solution au problème posé que j'ai souvent appliquée depuis 3 ans, qui fonctionne très bien et qui me semble bien plus simple que toutes celles proposées.
    Je suis un nouveau membre et encore loin de maitriser VBA comme la plupart d'entre vous. Si vous pouviez me faire savoir si ma solution tient la route, cela me ferait le plus grand plaisir !

    Je résume le problème : éviter que l'action sur un contrôle d'un UserForm ne déclenche en cascade d'autres procédures évènementielles que celle qui lui est associée (lorsque ce contrôle modifie, même indirectement, les propriétés d'autres contrôles associés à des procédures du type "_Change").
    Pour éviter cela, je défini une seule variable "Public" du type "Boolean" que je nomme "CE".

    Voici, en quelques lignes, la structure de mes procédures:

    Sub (NomProcédure)
    If Ce = False then Ce = True else Exit Sub
    ... instructions
    Ce = False
    End Sub

    Merci de vos réponses que j'attends avec impatience...

Discussions similaires

  1. [XL-2003] Application.EnableEvents = False ne fonctionne pas
    Par sharox dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/03/2015, 15h20
  2. L'instruction Application.EnableEvents = False ne fonctionne pas
    Par CatherineRennes dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 15/11/2012, 17h55
  3. [XL-2003] A propos de "Application.Visible = False"
    Par thomasisajerk dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/08/2010, 20h53
  4. Application.EnableEvents = False ne marche pas !
    Par statquant dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/08/2009, 10h01
  5. workbook_activate >> application.visible=false
    Par kstorfou dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/04/2009, 10h50

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