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 :

Fonctionnement de Private Sub Workbook_BeforeClose(Cancel As Boolean)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 288
    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 288
    Par défaut Fonctionnement de Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Bonjour,

    il y a quelque chose que je n'arrive pas à saisir malgré mes multiples essais et recherche dans ma macro de fermeture du fichier "fichAv" :
    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
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
     
    Dim fichInt As String, integ As Worksheet, EsInt As String
     
    EsInt = fich26 & ".xlsm"
    fichInt = ThisWorkbook.Path & "\" & EsInt
     
    Application.ScreenUpdating = False
    MsgBox "ok"
    Workbooks.Open fichInt
    Set integ = Workbooks(EsInt).Sheets("Ctrl")
    integ.Range("B2") = 0
    Workbooks(EsInt).Close True
     
    End Sub
    Si je ferme le fichier "fichAv" en cliquant sur la croix en haut à droite de l'écran, tout est ok, Msgbox affichée et top en B2 = 0 dans le fichier fich26

    Si je ferme par macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks(fichAv).Close False
    j'ai bien "ok" mais fich26 n'est pas ouvert et j'ai erreur sur la ligne
    Set integ = Workbooks(EsInt).Sheets("Ctrl")
    (normal le fichier n'est pas ouvert)

    je cherche aussi du côté de
    Cancel As Boolean)
    mais sans trouver...
    Avez-vous une explication et une solution ?

    Je sèche...

  2. #2
    Expert confirmé
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Par défaut
    Bonjour,

    Je ne voudrais pas faire d'erreur dans mon interprétation, mais il me semble que l'instance d'Excel se ferme avant que tu puisses ouvrir le fichier.

    Par contre, si tu places le code à exécuter avant la fermeture dans le code de fermeture, cela va fonctionner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim fichInt As String, integ As Worksheet, EsInt As String
     
    EsInt = fich26 & ".xlsm"
    fichInt = ThisWorkbook.Path & "\" & EsInt
     
    Application.ScreenUpdating = False
    MsgBox "ok"
    Workbooks.Open fichInt
    Set integ = Workbooks(EsInt).Sheets("Ctrl")
    integ.Range("B2") = 0
    Workbooks(EsInt).Close True
     
    Workbooks(fichAv).Close False

  3. #3
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    Bonjour
    ce n'est qu'une recommandation d'un autodidacte ,méfiez vous
    Si tu précède la fermeture de ton fichier par on error resume next (entre ligne 12 et 13 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    Set integ = Workbooks(EsInt).Sheets("Ctrl")
    integ.Range("B2") = 0
    on error resume next
    Workbooks(EsInt).Close True

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par retraite83 Voir le message
    Si je ferme par macro :
    A ta place, je commencerais par mettre un Debug.Print en début de la macro Before_Close pour savoir à quoi font référence ThisWorkbook et la variable fich26 (qui ne semble pas renseignée dans ce code).

    Cela dit, à ma connaissance, VBA n'est pas multi-tâches.
    Donc, avec ce type de montage, tu joues un peu à la roulette russe.

    Citation Envoyé par BENNASR
    Si tu précède la fermeture de ton fichier par on error resume next (entre ligne 12 et 13 :
    Ca, ça s'appelle cacher la poussière sous le tapis...

  5. #5
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 288
    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 288
    Par défaut
    Bonjour,

    #4
    ThisWorkbook est correct et la variable fich26 est définie en "cste public" dans un autre module

    #3
    on error resume next
    ne sert à rien puisque le fichier "EsInt" n'est pas ouvert

    #2
    Cela ne marche pas
    Du coup je ne sais plus quoi faire,

    Je rappelle le problème qui m'intrigue toujours c'est la différence de fonctionnement entre le close par la croix en haut de l'écran (qui fonctionne) et le close par macro (qui plante) avec le même code dans la fermeture
    LE FICHIER "EsInt" NE S'OUVRE PAS DANS LE CLOSE PAR MACRO ALORS QU'IL S'OUVRE LORS DE LA FERMETURE PAR LA CROIX DE L'ECRAN

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par retraite83 Voir le message
    la variable fich26 est définie en "cste public" dans un autre module
    Si je te conseille de faire quelque chose et que tu ne prends pas la peine de le faire, il ne sert à rien que je réponde.
    Avant d'énoncer ce que tu crois être une certitude, vérifie-le avec les méthode qu'on t'indique.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 288
    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 288
    Par défaut
    Voilà le résultat avec debug.print (je n'ai jamais utilisé, j'utilise souvent le pas à pas)

    Je n'arrive vraiment pas à comprendre pourquoi la macro fonctionne bien en fermant le fichier par la croix en haut de l'écran et qu'elle plante en fermeture du fichier par macro.

    Pourquoi passe-t-on sur sans ouvrir le fichier, sans message d'erreur et plantage seulement après sur l'affectation
    Set integ = Workbooks(EsInt).Sheets("Ctrl")
    Images attachées Images attachées  

  8. #8
    Expert confirmé
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Par défaut
    J'ai réfléchi au problème... Cela fait tellement longtemps que je n'ai plus fait régulièrement du VBA que j'ai oublié certaines choses...

    En fait le problème vient du fait qu'il faut créer une nouvelle instance Excel et travailler sur cette instance... j'ai testé ça fonctionne sur l'évènement BeforeClose.

    J'ai un peu adapté ton code, mais tu t'y retrouveras.

    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
    Dim fichInt As String, oApp As Application, oClasseur As Workbook, EsInt As String
     
    EsInt = "classeur2.xlsm"
    fichInt = ThisWorkbook.Path & "\" & EsInt
     
    Application.ScreenUpdating = False
    Set oApp = New Excel.Application
    Set oClasseur = oApp.Workbooks.Open(fichInt)
    With oClasseur.Sheets("Ctrl")
        .Range("B2") = 0
    End With
     
    ' Fermeture des objets
    oClasseur.Close True
    oApp.Quit
     
    ' Libération des objets
    Set XlsApp = Nothing
    Set oClasseur = Nothing

+ 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. [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, 13h23
  3. Réponses: 3
    Dernier message: 04/02/2018, 12h11
  4. Réponses: 9
    Dernier message: 06/06/2006, 22h05
  5. mettre plusieurs private sub sur un bouton ?
    Par juju33 dans le forum Access
    Réponses: 2
    Dernier message: 26/03/2006, 16h22

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