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 :

Workbook_BeforeClose - procédure +/- exécutées


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 656
    Par défaut Workbook_BeforeClose - procédure +/- exécutées
    Bonjour,

    Je tourne en rond depuis... des jours.

    Workbook_BeforeClose exécute les sous-routines parfaitement si je ferme le classeur en cliquant sur "la croix"

    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
    20
    21
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim Sh As Worksheet
    Stop
     
        Call Stop_Tempo
        Call Test_Répertoire
     
        ThisWorkbook.SaveCopyAs Répertoire & "\" & FichierIndexé
     
        ThisWorkbook.Unprotect ""
     
        Feuil01.Visible = xlSheetVisible
        For Each Sh In ThisWorkbook.Sheets
            If Sh.CodeName <> "Feuil01" Then Sh.Visible = xlSheetVeryHidden
        Next
     
        ThisWorkbook.Protect "", True, True
     
        If Application.Workbooks.Count = 1 Then Application.Quit
     
    End Sub
    Si Workbook_BeforeClose est lancé depuis la procédure qui suit, la copie du classeur et l'affichage de la Feuil01 ne s'exécute pas !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test_Affichage_UF() 
     
        If UserForm1.Visible = False Then
            UserForm1.Show
        Else
            Unload UserForm1
    '        Call Test_Répertoire
    '        ThisWorkbook.SaveCopyAs Répertoire & "\" & FichierIndexé  'ne fonctionne pas si placé dans BeforeClose !
            ActiveWorkbook.Close SaveChanges:=True 
        End If
    End Sub
    ... ce qui me contraint à (re)mettre :

    ThisWorkbook.SaveCopyAs Répertoire & "\" & FichierIndexé 'ne fonctionne pas si placé dans BeforeClose !
    dans ce module !

    Je précise qu'il n'y a pas de :

    Application.EnableEvents = False
    dans les procédures intermédiaires.

    Qu'est-ce qui peut "inhiber" l'exécution d'une procédure dans Workbook_BeforeClose ?

    En vous remerciant d'avance pour votre aide,
    Cdt

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 122
    Par défaut
    Salut

    Tu devrais essayer en laissant à false le paramètre de sauvegarde auto

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ActiveWorkbook.Close SaveChanges:=False
    Et faire cette enregistrement dans le BeforClose. Si l'enregistrement ne doit pas être systématique, tu peux utiliser une variable boolean de niveau module (déclaré en Public dans une module standard). Tu passes cette variable à True avant d'appeler ActiveWorkbook.Close et dans le code de BeforeClose, tu vérifie si la variable est à True, si c'est le cas tu sauvegarde sinon, tu ne sauvegarde pas.

    Je n'ai pas fait de tests alors le problème vient peut-être d'ailleurs... Vu que tu semble appeler le Close à partir d'un UserForm et si le classeur que tu demandes de fermé est celui qui contient le UserForm... c'est peut-être ça qui fait que BeforClose n'est pas appelé, car le classeur ne peut pas être fermé avec un UF actif. [Cette affirmation n'en ait pas vraiment une ]

    Aussi attention avec les Actives...workbook/worksheet/.. Il vaut mieux pointer l'objet dans une variable au moment de son ouverture si c'est via le code par exemple.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 656
    Par défaut
    Bonsoir et merci pour ton aide,

    Aussi attention avec les Actives...workbook/
    J'ai suivi ton conseil mais en vain.

    le classeur ne peut pas être fermé avec un UF actif
    Mon UF est bien déchargé avec Unload (et non hide) donc c'est bien la procédure Sub Test_Affichage_UF() qui lance Workbook_BeforeClose ?! En mode pas à pas, la procédure Workbook_BeforeClose est bien appelée.

    Si l'enregistrement ne doit pas être systématique, tu peux utiliser une variable boolean (...)
    Si, si, l'enregistrement doit être systématique et quid de l'impossibilité de ré-afficher la Feuil01 ?!

    En général, le forum n'est pas friand des codes trop longs, mais à toutes fins utiles, voici les étapes intermédiaires (où se trouve peut-être le problème) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test_Affichage_UF() 'new
     
        If UserForm1.Visible = False Then
            UserForm1.Show
        Else
            Unload UserForm1
    '        Call Test_Répertoire
    '        ThisWorkbook.SaveCopyAs Répertoire & "\" & FichierIndexé  'ne fonctionne pas si placé dans BeforeClose !
            ActiveWorkbook.Close SaveChanges:=True 'True 'avec vbYes : shunt message "voulez-vous ... ?"
        End If
    End Sub
    * Affichage du UF

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub UserForm_Activate()
        Call Alerte
        TimeSetting 10
        AfficherSecondes
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Alerte()
    Dim i As Integer
        On Error GoTo fin
        For i = 1 To 3
            Beep 440, 500 'note + durée
        Next i
    fin:
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub TimeSetting(Optional kSec As Integer = 30) 'new MODIFIER durée (300 = 5') REMETTRE
     
        On Error Resume Next  'à conserver
        Application.OnTime EarliestTime:=CloseTime, Procedure:="Test_Affichage_UF", Schedule:=False
        CloseTime = DateAdd("s", kSec, Now)
        Application.OnTime EarliestTime:=CloseTime, Procedure:="Test_Affichage_UF", Schedule:=True
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub AfficherSecondes()
    Dim i As Integer, n As Single
     
        n = (CloseTime - Now) * 24 * 3600
        For i = n To 1 Step -1
            Me.LabelTime = i
            Application.Wait (Now + TimeValue("00:00:01"))
            DoEvents
            On Error GoTo fin   'si clic sur Fermer > Erreur > Fin:
            If Me.Visible = False Then Exit For
        Next i
    fin:
    End Sub
    Et on finit ici (ActiveWorkbook.Close)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test_Affichage_UF()
     
        If UserForm1.Visible = False Then
            UserForm1.Show
        Else
            Unload UserForm1
    '        Call Test_Répertoire
    '        ThisWorkbook.SaveCopyAs Répertoire & "\" & FichierIndexé  'ne fonctionne pas si placé dans BeforeClose !
            ActiveWorkbook.Close SaveChanges:=True 'True 'avec vbYes : shunt message "voulez-vous ... ?"
        End If
    End Sub
    Je sais que la longueur du code est rédhibitoire...
    Si j'active les 2 lignes "commentées" de la dernière procédure, ça fonctionne mais c'est redondant avec ces 2 lignes qui figurent déjà dans Workbook_BeforeClose, ce qui n'est pas satisfaisant.

    Cdt

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Par défaut
    Bonsoir JPMA75,

    J'ai un pb tout à fait similaire.
    Aurais-tu trouvé une parade?

    Merci de ton retour.

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

Discussions similaires

  1. [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, 17h39
  2. [WD18] Procédure exécutée même lorsque l'application est fermée
    Par aurabarth dans le forum WinDev
    Réponses: 7
    Dernier message: 25/03/2016, 15h41
  3. Réponses: 7
    Dernier message: 27/06/2011, 15h56
  4. Procédure à exécuter mensuellement
    Par x-tasy dans le forum PL/SQL
    Réponses: 4
    Dernier message: 19/02/2010, 16h51
  5. Réponses: 15
    Dernier message: 08/07/2004, 08h20

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