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 :

Private Sub Workbook_BeforeClose(Cancel As Boolean) conditionnel [XL-2016]


Sujet :

Macros et VBA Excel

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut Private Sub Workbook_BeforeClose(Cancel As Boolean) conditionnel
    Bonjour,

    je voudrai exécuter le code de Workbook_BeforeClose de manière conditionnel, je ne sais pas si cela est possible.
    Dans certains cas je voudrai ne pas exécuter au close du fichier

    2 façons de voir les possibilités

    1) soit passer un paramètre lors de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks(fichier).close
    et tester le paramètre au début du BeforeClose pour sortir en sautant le code

    2) soit :
    exécuter le code si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks(fichier).close True
    et ne pas l'exécuter si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks(fichier).close False

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pourquoi n'effectue pas le test en amont de ta commande Close, cela me parait plus logique

    [EDIT]
    Un petit exemple d'un fichier qui ne se ferme pas si la cellule nommée pMaintenance a comme valeur VRAI

    Tesr logique effectué dans la procédure Workbook_BeforeClose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
       Cancel = Me.Names("pMaintenance").RefersToRange.Value
    End Sub
    et on pourrait ajouter à la ligne suivante l'affichage d'un message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       If Cancel Then MsgBox "Vous êtes en maintenance"
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    Bonjour et merci

    je ne suis pas sur de tout comprendre dans l'exemple,

    en fait je veux fermer le fichier dans tous les cas mais avec ou sans exécution d'une partie du code de Workbook_BeforeClose

    C'est à dire pouvoir tester qq chose dans la fermeture pour sauter un morceau de code

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    A mon tour de ne pas comprendre ce que tu veux.

    Résumons Cancel est un booléen et sa valeur par défaut est False donc si Cancel est à True le classeur ne se ferme pas
    J'imagine que tu sais à quel moment tu souhaites que la fermeture se fasse ou pas. C'est donc un test logique

    Tu peux donc faire le test directement s'il est simple comme mon exemple le démontre soit en créant une fonction qui renvoie un booléen
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    Pour moi la compréhension que j'ai jusqu'à présent c'est que lorsque je code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks(fichier).close True
    le fichier se ferme en enregistrant le contenu du fichier et en exécutant le code de Workbook_BeforeClose

    et lorsque je code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks(fichier).close False
    le fichier se ferme SANS enregistrer le contenu du fichier et mais en exécutant quand même le code de Workbook_BeforeClose

    Je me rends compte que je n'ai pas bien exprimé ma demande dans mon 1er post et ce je voudrai s'éclairci en lisant tes réponse :

    Ce que je voudrai c'est pouvoir différencier mon code dans Workbook_BeforeClose suivant si on est en Close False ou en Close True

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'en reviens à ma première réponse.
    Au lieu de placer la procédure dans Before_Close, je l'exécuterais avant l'instruction Workbooks(fichier).close True
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    Bonjour,
    je comprends mieux maintenant ta proposition

    le pb est que j'ouvre puis ferme "fichier" (FALSE ou TRUE suivant les cas) dans pas mal de macro.

    Comme j'ai une cinquantaine de lignes, l'avantage de le mettre dans Workbook_BeforeClose est de coder (et modifier) à un seul endroit.
    Reste le pb de savoir si on est en FALSE ou CLOSE pour tester et différencié le code à la fermeture

    J'espère que tu comprends mieux mon pb, pardon de ne pas avoir été très clair dès le début

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Mais rien ne t'empêche de réunir tes cinquante lignes au sein d'une procédure indépendante, c'est d'ailleurs fort recommandé, et avant l'instruction Close, tu invoques cette procédure

    Maintenant, il est toujours possible de prévoir une cellule nommée dans une feuille paramètre dans laquelle tu vas écrire VRAI ou FAUX et dans la procédure Before_Close, tu vas lire cette cellule
    Une autre solution, est l'utilisation d'une variable Boolean de portée publique
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    Bonjour,

    je viens de tester via une procédure indépendante, cela marche bien dans le cas de fermeture par macro

    Cependant j'ai un pb résiduel, dans ma procédure (ex Workbook_BeforeClose) je teste et exécute le morceau de code voulu

    Quand "fichier" est fermé par macro, je peux tester et exécuter le code voulu dans la procédure avant le Close, c'est ok

    Mais quand je ferme par la croix en haut à droite de l'écran, la procédure n'est pas déclenchée. Je ne peux pas exécuter le bon bout de code à la fermeture
    C'est pour cela aussi que j'avais envisagé pour le code dans Workbook_BeforeClose à la condition de pouvoir savoir d'où on vient

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    On ne s'est pas bien compris
    Tu dis avoir placé les cinquante lignes de code dans une procédure indépendante. Est-ce une procédure de type fonction renvoyant une valeur booléenne ?

    Peux-tu dire en quelques mots ce que fait cette procédure ? Un tri, un filtre, une copie ?
    Qu'est-ce qui fait que tu prends la décision de fermer en sauvant ou pas. Est-suite à cette procédure ou pas. Difficile de t'apporter une réponse pertinente sans en savoir plus

    C'est un simple problème d'algorithme.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    J'ai mon fichier "A" qui ouvre "B"

    "B" est soit en consultation soit en modifs, c'est pour cela que je ferme "B" en FALSE ou TRUE

    juste avant l'ouverture de "B" dans "A" j'ouvre "C" pour positionner un top (=1)

    A la fermeture de "B" je veux remettre le top = 0 dans "C" si une condition (autre) est vrai, sinon il reste dans l'état (0 ou 1)

  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,

    Imaginons que ta procédure de 50 lignes se nomme myProcess et quelle a deux arguments. Tu la transformes en une fonction booléenne comme ci-dessous et juste à la fin, tu dois renvoyer soit True soit False
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function myProcess(Arg1 As Range, Arg2 As String) As Boolean
      ' Code
      ' Terminer la procédure
      myProcess = True ' Ou False
    End Function
    Maintenant dans la procédure où tu as écrit la ligne Workbooks(fichier).close True (ou False bien sûr), tu modifies cette ligne par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks(fichier).close myProcess(Arg1, Arg2)
    donc le résultat de ta procédure fera en sorte que l'on sauve ou pas le fichier

    Maintenant si le fait que tu sauves ou pas dépend de deux conditions, tu intègres l'appel à la fonction dans un And. En imaginant que Process est une variable qui vaut 1 si tu as ouvert le fichier B pour une modification et 0 si c'est une consultation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks(fichier).close myProcess(Arg1, Arg2)=True and Process=1
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 291
    Par défaut
    Merci

    j'ai un autre cas :

    j'ai un fichier F que je copie en F'

    A la fermeture de F' je ne veux pas exécuter "Workbooks_BeforeClose" (qui vient de F) :

    1) soit désactiver "Workbooks_BeforeClose"

    2) soit supprimer "Workbooks_BeforeClose" Je sais supprimer un module par macro mais est-ce possible avec "Workbooks_BeforeClose"

    Le fichier F' est supprimé après traitement

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

Discussions similaires

  1. Fonctionnement de Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Par retraite83 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 07/04/2020, 16h22
  2. [XL-2016] Private Sub Workbook_BeforeClose - comment exécuter la procédure plusieurs fois ?
    Par Henri1830 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/09/2019, 18h39
  3. [XL-2016] Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Par retraite83 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 12/05/2019, 14h23
  4. Réponses: 9
    Dernier message: 06/06/2006, 23h05
  5. mettre plusieurs private sub sur un bouton ?
    Par juju33 dans le forum Access
    Réponses: 2
    Dernier message: 26/03/2006, 17h22

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