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 :

Problème de compréhension avec Sub Workbook_BeforeClose [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut Problème de compréhension avec Sub Workbook_BeforeClose
    Bonjour,
    J'ai à la fermeture de mon classeur une séquence classique qui marche bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call Module67.test
    End Sub
    Le problème est que l'utilisateur est invité à enregistrer ou pas le classeur et je ne veux pas
    Alors je teste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call Module67.test
    ActiveWorkbook.Close savechanges:=False
    End Sub
    J'ai l'impression (plus que l'impression) que "ActiveWorkbook.Close" fait réexécuter la macro "Workbook_BeforeClose"

    et cela plante dans la macro "test"

    Comment fermer le classeur sans enregistrement et sans invite sans déclencher à nouveau "Workbook_BeforeClose"

    Mon raisonnement est-il juste ou non?

    Autre question je ne sais pas exécuter en pas à pas "Workbook_BeforeClose"...
    Il ne savait pas que c'était impossible, donc il l' a fait...

  2. #2
    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
    chez moi ca le fait pas le classeur est bien fermer sans message

    ps : au fait j'ai retrouver l'ébauche que je t'avais fait pour ton catalogue
    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

  3. #3
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    Bonsoir Patrick,

    je n'ai pas le message non plus mais la macro "test" est exécutée 2 fois et elle n'est pas faite pour ça, donc elle plante

    j'ai résolu le pb suite à une discussion précédente et un message de Philippe Tulliez proposant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
      Static c As Integer
      c = c + 1
      If c = 1 Then
         Call Module67.test
         Application.DisplayAlerts = False
         ThisWorkbook.Close SaveChanges:=True
         Application.DisplayAlerts = True
      End If
    End Sub
    mais cela me semble étrange, n'y-a-t-il pas une autre solution que l'auto fermeture sans enregistrement du classeur dans son propore "Workbook_BeforeClose"

    J'ai un problème de logique : fermer un classeur dans la procédure de fermeture.. bizarre non?

    PS : pour le catalogue les coups de main que tu m'avais donné à l'époque fonctionnent à merveille, le catalogue est utilisé par 5 personnes en permanence sans jamais aucun problème...
    Il ne savait pas que c'était impossible, donc il l' a fait...

  4. #4
    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
    testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Workbook_BeforeClose(Cancel As Boolean)' déclenché par la fermeture 
    Application.EnableEvents = False
    Call Module67.test
    ActiveWorkbook.Close savechanges:=False'ici tu va donc réenclencher l'événement beforeclose 
    End Sub
    modele67
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
    MsgBox "aa"
    End Sub
    le message n'apparait qu'une fois

    sinon je pense que c'est normal que ta sub serepetait 2 fois
    dans l'évènement avant_fermeture tu appelle la sub et tu REFERME!!! ton classeur avec close meme si il est pas encore fermé tu relance donc l'évènement avant_fermeture

    en bloquant les évènement tu n'a plus la répétition
    enableevents!!!!!!!

    tout simplement
    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

  5. #5
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    Merci Patrick,
    je n'avais pas saisi jusqu'à là le rôle de "Application.EnableEvents"

    C'est fait, merci, le résultat est bon

    2 petites précisions si tu veux bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.EnableEvents = False
    Call Module67.test
    ActiveWorkbook.Close savechanges:=False
    1) ne faut-il pas qq part remettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.EnableEvents = True
    2) je ne comprends pas, si "Application.EnableEvents = False" désactive l'appel du module67 pourquoi est-il appelé la première fois
    Et pourquoi alors "savechanges:=False" est-il vrai (le fichier est bien fermé sans enregistrement et sans le message d'invite)

    Je t'avoue que ces logiques informatiques me surprennent toujours
    Il ne savait pas que c'était impossible, donc il l' a fait...

  6. #6
    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

    La procédure évènementielle BeforeClose inclut déjà, par défaut, la fermeture du classeur. Cette fermeture n'est alors pas à préciser dans une autre instruction.
    Cette procédure n'a d'utilité réelle que pour exécuter d'autres instructions avant la fermeture. Si ces instructions comportent une vérification de conditions sine qua non de la fermeture, cette fermeture peut alors être annulée purement et simplement en spécifiant à TRUE son paramètre Cancel au sein même de la procédure BeforeClose.
    C'est tout, c'est très simple et parfaitement exposé à la rubrique Workbook.BeforeClose, événement de l'aide interne VBA.

    EDIT : j'invite par ailleurs à lire la rubrique Workbook.Saved, propriété de l'aide VBA. Elle montre comment, si on le souhaite, fermer un classeur sans l'enregistrer.
    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.

  7. #7
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    Bonjour Unparia

    merci de ta réponse,

    je connais l'aide que tu me précises, mais elle me semble (à moi seul surement) aussi compréhensible que si je te donnai (à toi) un traité de chirurgie à lire

    Lire ça va, bien comprendre il faut être initié

    Je fais des essais

    Mais je ne comprends toujours pas ce que j'expose dans mon post #5 suite à la réponse de Patrick
    Il ne savait pas que c'était impossible, donc il l' a fait...

  8. #8
    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
    1) ne faut-il pas qq part remettre
    oui si l'application embarque d'autre classeur

    si ton classeur est tout seul dans l'instance d'Excel tu peux faire comme suit ca ferme tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Call Module67.test
        With Application
            .DisplayAlerts = False
            .Quit
        End With
    End Sub
    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

  9. #9
    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
    je connais l'aide que tu me précises, mais elle me semble (à moi seul surement) aussi compréhensible que si je te donnai (à toi) un traité de chirurgie à lire

    Lire ça va, bien comprendre il faut être initié

    Je fais des essais
    Initié à quoi ? (à la lecture ?)

    Puisque tu fais des tests, fais-donc ce tout petit test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Workbook_BeforeClose(Cancel As Boolean) '----
      ThisWorkbook.Saved = True ' si je mets cette instruction, le classeur sera fermé sans message de sauvegarde
      Cancel = test(Cancel) ' le classeur ne sera fermé que si la fonction test retourne True
    End Sub
     
    Private Function test(ByRef c As Boolean) As Boolean ' -->> je passe par référence la valeur du paramètre Cancel
       valeur = "coucou"
       If valeur = "coucou" Then test = True ' --->> test ne retournera True que si valeur = "coucou"
    End Function
    Lance-le -->> le classeur ne sera pas fermé
    Donne maintenant "hola" à la variable valeur et lance -->> le classeur sera fermé, sans message(puisque sa propriété Saved a été mise à true.
    Analyse tout cela et construis ta chose en adéquation avec ton but.
    Nul besoin de quoi que ce soit d'autre.

    Que te dire d'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.

  10. #10
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    merci je me suis "amusé" à tester avec des variantes

    Rien ne vaut le concret, j'ai bien compris... ( à l'exécution)
    Il ne savait pas que c'était impossible, donc il l' a fait...

  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
    Rien ne vaut le concret, j'ai bien compris... ( à l'exécution)
    Je n'en suis pas totalement certain.
    Si tu avais vraiment compris, tu te serais débarrassé de ce paramètre c passé à la fonction test et qui est totalement inutile
    Il était là uniquement parce que j'avais dans un premier temps traité par une simple routine (au lieu d'une fonction) avec un paramètre passé par référence

    Allège --->>.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Workbook_BeforeClose(Cancel As Boolean) '----
      ThisWorkbook.Saved = True ' si je mets cette instruction, le classeur sera fermé sans message de sauvegarde
      Cancel = test() ' le classeur ne sera fermé que si la fonction test retourne True
    End Sub
     
    Private Function test() As Boolean 
       valeur = "coucou"
       If valeur = "coucou" Then test = True ' --->> test ne retournera True que si valeur = "coucou"
    End Function
    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 confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    si si je t’assure,

    revois ton post #9, il n'y a déjà plus ce "c"
    Il ne savait pas que c'était impossible, donc il l' a fait...

  13. #13
    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
    si si je t’assure,

    revois ton post #9, il n'y a déjà plus ce "c"
    Ah bon ? Et ce qu'il contenait inutilement et que je mets ici en rouge gras barré, ce sont des petits canards ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Workbook_BeforeClose(Cancel As Boolean) '----
      ThisWorkbook.Saved = True ' si je mets cette instruction, le classeur sera fermé sans message de sauvegarde
      Cancel = test(Cancel) ' le classeur ne sera fermé que si la fonction test retourne True
    End Sub
     
    Private Function test(ByRef c As Boolean) As Boolean ' -->> je passe par référence la valeur du paramètre Cancel
       valeur = "coucou"
       If valeur = "coucou" Then test = True ' --->> test ne retournera True que si valeur = "coucou"
    End Function
    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. Réponses: 10
    Dernier message: 26/11/2012, 10h45
  2. Problème de compréhension avec les DIV
    Par akaii dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 25/02/2010, 01h32
  3. Problème de compréhension avec MoviClip
    Par jpboogie dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 11/04/2009, 15h01
  4. Réponses: 17
    Dernier message: 22/01/2007, 13h34
  5. Réponses: 5
    Dernier message: 18/10/2006, 16h20

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