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.events et wokbook_open [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    autodidacte
    Inscrit en
    Septembre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Septembre 2011
    Messages : 21
    Points : 12
    Points
    12
    Par défaut Application.events et wokbook_open
    Bonjour
    Question comment forcer application.eventsenabled ? ... certainement pas dans workbook_open mais alors ?

    voici le descriptif du pb
    J'ai un classeur travail.xlsm qui à l'ouverture déclenche une macro
    donc dans
    thisworkbook
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private sub workbook_open()
    macro_depart
    end sub
    dans un module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub macro_depart()
    msgbox "bonjour"
    end sub
    Mes utilisateurs (excel mac ou excel pc 2016) m'ont signalé que cela ne fonctionnait pas

    après plusieurs recherches ... , voici ce que j'observe

    si par suite d'un incident un classeur a laissé application.eventsenabled à false
    alors m^me si on ferme ce classeur et que excel reste ouvert application.eventsenabled reste à false d'où mon problème

    j'ai fait le test
    dans un classeur vilain.xlsm j'ai activé une macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sub pasevent
     
    application.eventsenabled=false
    end sub
    puis j'ai fermé ce classeur sans fermer excel
    puis j'ai ouvert travail.xlsm et effectivement la macro d'ouverture ne s'execute pas ce qui me semble cohérent.

    Si on ferme et rouvre excel, pas de problème semble t'il c'est donc la consigne donnée en attendant mieux

    d'où ma question en entête : comment peut on mettre application.eventsenabled actif à l'ouverture d'un classeur ?
    merci pour vos réponses

    cordialement

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    "eventsenabled" ? Tiens ! c'est une nouvelle propriété ?
    Il est manifeste que le code que tu montres ici n'est pas un copié/collé du tien.
    Reviens s'il te plait avec ton vrai code.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.EnableEvents = True
    End Sub
    peut etre que comme ca cela reglera ton soucis
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Membre à l'essai
    Homme Profil pro
    autodidacte
    Inscrit en
    Septembre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Septembre 2011
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    re

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.EnableEvents = True
    End Sub
    peut etre que comme ca cela reglera ton soucis

    bonjour et merci pour la remarque
    effectivement j'ai tapé un peu vite et c'est bien Application.EnableEvents que j'évoquais
    et donc la correction ne règle pas le souci .. ce serait trop simple
    cordialement

  5. #5
    Membre à l'essai
    Homme Profil pro
    autodidacte
    Inscrit en
    Septembre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Septembre 2011
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour
    "eventsenabled" ? Tiens ! c'est une nouvelle propriété ?
    Il est manifeste que le code que tu montres ici n'est pas un copié/collé du tien.
    Reviens s'il te plait avec ton vrai code.
    bonjour et merci

    effectivement j'ai tapé directement le code pour le simplifier .. voici donc le code corrigé

    dans un classeur vilain.xlsm j'ai activé une macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sub pasevent
    Application.EnableEvents=false
    end sub
    cordialement

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 661
    Points : 5 785
    Points
    5 785
    Par défaut
    Bonjour à tous,
    Citation Envoyé par patricktoulon Voir le message
    re

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.EnableEvents = True
    End Sub
    peut etre que comme ca cela reglera ton soucis
    Il me semble que ça ne peut pas fonctionner.
    Si les évènements sont désactivés, normalement le BeforeClose ne se déclenche pas et donc les évènements ne sont pas réactivés.

    @softwood
    Malheureusement pour toi, je pense que ton soucis se trouve dans le(s) classeur(s) où tu désactive les évènement, il faut que tu vérifie chaque macro et trouve celle(s) où les évènements de sont pas réactivés et rajouter la ligne d'activation en fin de macro.
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.

    Par définition, on ne saurait pas réactiver les évènements lors de la survenance d'un évènement.

    C'est un gros problème de application.enableevents = false, c'est qu'il faut le remettre à TRUE en fin de procédure/fonction, comme le fait remarquer Halaster

    Attention que cela ne suffit pas. Si le code plante sur une macro qui a désactivé les évènements, ces derniers restent désactivés. Tu as donc intérêt à gérer les erreurs qui peuvent arriver dans une macro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub MaMacro()
      On Error GoTo EndHandler
      Application.EnableEvents = True
      ...
      ...
      ...
    EndHandler:
      Application.EnableEvents = False
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Membre à l'essai
    Homme Profil pro
    autodidacte
    Inscrit en
    Septembre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Septembre 2011
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Complètement d'accord le problème est que je ne maitrise évidemment pas toutes les applis ouvertes par les utilisateurs de ma propre application !!
    Bien entendu j'ai mis en oeuvre la gestion des erreurs afin de réactiver si besoin les évènements !
    mais si une autre appli inconnue n'a pas fait le nécessaire le gestionnaire d’événements reste inactif tant que que excel est ouvert .. et ce m^me si l'appli fautive est fermée (j'ai fait les tests)

    donc je confirme ma consigne : si problème (il y a un message de bienvenue à l'ouverture du classeur ... qui apparait si l'ouverture se fait correctement) FERMER EXCEL et rouvrez mon application (à l'ouverture d'excel le gestionnaire d’évènements est rétabli)

    Qu'en pensent les experts ?
    merci
    cordialement

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

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    dès que les procédures en cause deviennent un peu longues j'évite .enabledEvents= false.

    Défini dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public noEvents as Boolean
    .
    Au début de toutes les événementielles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If noEvents then Exit Sub
    et là où il faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    noEvents = True
    ' code sans événement
    noEvents = False
    Ca n'évitera pas tes plantages à rechercher, mais au moins à la ré-ouverture noEvents sera à False, donc événements actifs.
    Tu peux même, en multipliant les variables, choisir de suspendre certains événement et pas d'autres.

    Maintenant pour les applis que tu ne maitrises pas, à part leur mettre un raccourci vers une macro qui rétabli les événements sur demande je vois pas.
    Déjà ça leur évitera de devoir tout fermer.
    eric

    PS : une idée quand même si c'est un autre fichier qui a bloqué les événements.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function enabledEvents()
        Application.Volatile
        Application.EnableEvents = True
    End Function
    Dans une cellule :
    Comme elle est volatile, elle sera exécutée à l'ouverture.
    Vider la cellule avant de suspendre les événements, remettre la formule ensuite.
    Par contre ça sera trop tard pour WorkbookOpen()
    Ca fait un peu bricolage mais bon...
    eric

  10. #10
    Membre à l'essai
    Homme Profil pro
    autodidacte
    Inscrit en
    Septembre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Septembre 2011
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    merci de tes conseils je vais reprendre mes procédures - et suivre ton idée
    mais on ne peut être derrière chaque utilisateur ....et imaginer ce qu'ils peuvent ...imaginer
    cordialement

  11. #11
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Utiliser la macro Auto_Open pour systématiquement mettre à true la propriété enableevents.
    Elle s'exécutera ipso facto sur tout classeur ouvert
    Et gérer ensuite comme on l'entend, dans chaque classeur, cette propriété enableevents.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

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

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    Utiliser la macro Auto_Open pour systématiquement mettre à true la propriété enableevents.
    effectivement, mieux que la fonction personnalisée.
    eric

  13. #13
    Membre à l'essai
    Homme Profil pro
    autodidacte
    Inscrit en
    Septembre 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Septembre 2011
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour
    Utiliser la macro Auto_Open pour systématiquement mettre à true la propriété enableevents.
    Elle s'exécutera ipso facto sur tout classeur ouvert
    Et gérer ensuite comme on l'entend, dans chaque classeur, cette propriété enableevents.
    cela répond tout à fait à mon problème et du coup les différentes tâches prévues dans workbook_open vont être replacées dans auto_open
    J'avais lu ici et là qu'il ne fallait plus utiliser auto_open mais plutôt workbook open
    Pourtant et dans ce cas auto_open me semble plus intéressant et fonctionne parfaitement sur excel 2016 excel 2010 ..
    Reste à tester sur Mac où il y a toujours quelques surprises

    En tout cas merci

  14. #14
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    En tout cas merci
    Il n'y a pas de quoi
    J'avais lu ici et là qu'il ne fallait plus utiliser auto_open mais plutôt workbook open
    Les vocations de l'une (la macro) et de l'autre (l'évènement) sont très différentes et indépendantes l'une de l'autre.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

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

Discussions similaires

  1. Thread et Application principale: Event,Message..?
    Par ghost942 dans le forum Delphi
    Réponses: 17
    Dernier message: 30/05/2007, 18h32
  2. Réponses: 10
    Dernier message: 11/11/2006, 14h21
  3. [2.0][C#] Transmission d'event entre applications .NET
    Par coucoufle dans le forum Windows
    Réponses: 5
    Dernier message: 10/11/2006, 14h12
  4. "event" vers une autre application
    Par devmat dans le forum MFC
    Réponses: 5
    Dernier message: 05/10/2005, 15h15
  5. [Event]Annuler la fermeture d'une application
    Par willowII dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 16/11/2004, 09h28

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