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 fermeture de deux classeurs en vba


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Technicien
    Inscrit en
    Octobre 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1
    Par défaut Problème de fermeture de deux classeurs en vba
    Bonjour,
    Je suis confronté à un problème lors de la fermeture de deux classeurs en vba.
    En effet lorsque je ferme les classeurs par la croix ou le menu Fichier/Fermer il reste une application Excel.

    Je vous explique les tests que j'ai effectués.
    Pour cela deux fichiers sont nécessaires. Je les mets en pièce jointe pour éviter de retaper le code.
    Un classeur nommé "Classeur4.xlsm" qui ouvre un fichier "Classeur5.xlsx" à la demande.
    Une Forme dans le classeur "Classeur4.xlsm" permet d'enregistrer et fermer le "Classeur5.xlsx" puis le "Classeur4.xlsm".

    Test avec les deux classeurs ouvert.
    Test_1: Fermeture par la Forme(Quitter) dans la Feuil1 -> la fermeture des deux classeurs est OK plus d'application Excel en cours.
    Test_2: Fermeture par le menu Fichier/Quitter -> la fermeture des deux classeurs est OK plus d'application Excel en cours.
    Test_3: Fermeture par le menu Fichier/Fermer ou la croix -> la fermeture des deux classeurs est OK mais il reste une application Excel.

    Test avec uniquement le classeur "Classeur4.xlsm" ouvert.
    Dans ce cas tout fonctionne. je n'est aucune application Excel en cours.

    Code du classeur "Classeur4.xlsm" :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    Option Explicit
     
    Private objClasseur2 As Workbook
    Private prvBeforeClose As Boolean
     
    Private Const CLASSEUR2 As String = "Classeur5.xlsx"
     
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
     
      '*****************************************************************************************************************'
      ' Gestion de la fermeture du classeur principal par la croix ou le menu Fichier/Quitter ou le menu Fichier/Fermer '
      '*****************************************************************************************************************'
     
      'Flag de passage par l'événement "BeforeClose"
      prvBeforeClose = True
     
      'Appel de la procédure de fermeture des classeurs
      Quitter
     
    End Sub
     
    Public Sub Quitter()
     
      '********************************************'
      ' Gestion de la fermeture des deux classeurs '
      '********************************************'
     
      With Application
     
        .ScreenUpdating = False
        .DisplayAlerts = False
        .EnableEvents = False
     
      End With
     
      'Enregistrement et Fermeture du deuxième classeur si il est ouvert
      If Not objClasseur2 Is Nothing Then objClasseur2.Close True
     
      'Enregistrement du classeur principal
      ThisWorkbook.Save
     
      'Gestion si il y a plusieurs classeurs Excel ouvert
      If Application.Workbooks.Count = 1 Then
     
        'Gestion si la demande de fermeture proviens de l'événement "BeforeClose"
        If prvBeforeClose = False Then Application.Quit
     
      Else
     
        'On ferme le classeur principal sans quitter l'application
        ThisWorkbook.Close
     
      End If
     
    End Sub
     
    Private Sub Workbook_Open()
     
      '**********************************************'
      ' Gestion de l'ouverture du classeur principal '
      '**********************************************'
     
      'Gestion de l'ouverture du deuxième classeur
      If MsgBox("Voulez-vous ouvrir le classeur '" & CLASSEUR2 & "'?", vbYesNo, "Deuxième Classeur") = vbYes Then
     
        'Ouverture du second fichier
        Set objClasseur2 = Workbooks.Open(ThisWorkbook.Path & "\" & CLASSEUR2)
     
        'Passage au premier plan du classeur principal
        ThisWorkbook.Activate
     
      End If
     
    End Sub
    Mes questions:
    1 Est-ce un fonctionnement normal?
    2 L'événement "Beforeclose" est bien déclenché par la croix ou le menu Fichier/Fermer ou le menu Fichier/Quitter mais se comporte différemment.
    3 Après plusieurs heures de recherche je n'ai pas la solution pour fermer totalement l'application Excel par la croix ou le menu Fichier/Fermer dans le cas de deux classeurs.

    Pourriez-vous regarder ce problème car je suis coincé pour avancer dans le développement de deux classeurs pour mon travail.

    Merci d'avance du temps que vous pourriez me consacrer.

  2. #2
    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
    Remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      If Not objClasseur2 Is Nothing Then objClasseur2.Close True
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      If Not objClasseur2 Is Nothing Then objClasseur2.Close True
      Set objClasseur2 = Nothing
    Cela dit, ce genre d’acrobatie visant à fermer Excel m'a toujours semblé dangereuse : c'est un peu comme sauter d'une voiture en marche alors qu'on en est le conducteur. L'application est fermée alors que la macro elle-même n'a pas été fermée. Tu multiplies encore le problème avec des macro événementielles qui se déclenchent à la fermeture.

    En tout cas, il me semble que le gain d'un simple clic manuel sur la croix rouge ne vaut pas le risque encouru.

  3. #3
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Grossière erreur de logique : l'évènement Before_Close est déclenché lors de la fermeture d'un classeur
    donc il est tout à fait inutile - pour ne pas dire idiot - de redemander au sein de cet évènement
    une nouvelle fermeture du classeur alors qu'elle est déjà en cours !

    Tout traiter dans cet évènement et si la fermeture du classeur doit être annulée alors utiliser la ligne de code Cancel = True

    _________________________________________________________________________________________________________
    Je suis Paris, Berlin, Nice, Bruxelles, Charlie, …

Discussions similaires

  1. [XL-2007] Problème actualisation automatique entre deux classeurs liés
    Par edouard47 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 24/05/2016, 16h14
  2. [XL-2010] Copier/coller Entre deux classeurs excel VBA
    Par Benjen dans le forum Excel
    Réponses: 11
    Dernier message: 19/09/2014, 15h58
  3. [VBA-E]travail sur deux classeurs excel
    Par richou dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/04/2006, 10h59
  4. [VBA]Detection de l'annulation de la fermeture d'un classeur
    Par LitteulKevin dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 18/01/2005, 15h36

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