Macro pour fermer un seul classeur parmis plusieurs dont le nom n'est pas connu

christophe82

XLDnaute Nouveau
Bonjour,

Après avoir parcouru de nombreux forums et essayé plusieurs solutions, je n'arrive toujours pas à coder une macro permettant de fermer le classeur qui m'interesse parmis d'autres qui pourraient être ouverts par l'utilisateur.

L'objectif : le classeur excel doit absolument être fermé pour être remonté sur un serveur le soir. J'ai programmé un timer qui gère la fermeture automatique du classeur si il reste inactif un certain temps (définissable).
Mon problème = la procédure ne fonctionne pas si d'autres classeurs excel sont ouverts en plus de celui qui m'interesse.

J'ai utilisé les codes suivants qui me donnent toujours le même résultat à savoir : "Erreur d'execution '1004' : La méthode 'Select' de l'objet '_Worksheet' a échoué"
et macro arrêtée avec classeurS ouverts.

Dernier code "bourrin" qui ne marche pas :
Sub Ferme()
Dim wb As Workbook
For Each wb In Workbooks
wb.Close True
Next
Application.Quit
End Sub

J'ai également essayé les codes à base de
WorkBooks("nom précis du fichier.xls").Activate
ActiveWorkBook.Close True

...pour le même résultat

J'ai positionné mes différents essais aussi bien dans un module de macro que dans "ThisWorkBook"... pour le même résultat dès qu'un autre classeur est ouvert

Ce cas ne me paraît pas si compliqué et pourtant... c'est sur ça que je coince.

D'avance merci aux bonnes âmes qui auraient une solution à me proposer.
 

Pierrot93

XLDnaute Barbatruc
Re : Macro pour fermer un seul classeur parmis plusieurs dont le nom n'est pas connu

Bonjour,

regarde peut être comme suit, à voir...
Code:
Option Explicit
Sub Ferme()
Dim wb As Workbook
For Each wb In Workbooks
If wb.Name <> ThisWorkbook.Name Then wb.Close True
Next
ThisWorkbook.Save 'a voir s'il y a lieu d'en effectuer une sauvegarde
Application.Quit
End Sub

bonne journée
@+
 

Dranreb

XLDnaute Barbatruc
Re : Macro pour fermer un seul classeur parmis plusieurs dont le nom n'est pas connu

Bonjour
Modifiez le code de façon à ne plus effectuer de Select dans la Sub Workbook_BeforeSave du classeur concerné.
Où s'il n'est pas indispensable qu'elle s'exécute, Application.EnableEvents = False durant la boucle de fermeture des classeurs.
À +
 

christophe82

XLDnaute Nouveau
Re : Macro pour fermer un seul classeur parmis plusieurs dont le nom n'est pas connu

Merci pour cette réponse rapide.

Test effectué mais sans succès :
1- en intégrant ce code mon fichier se ferme bien si il est le seul ouvert (donc ça marche "de base")
2- en ouvrant mon classeur et en en ouvrant un second, j'ai toujours le même satané message d'erreur qui bloque tout

A noter que j'ai intégré ce code dans mon module de macro (module 1) pas dans "ThisWorkBook"
Option Explicit est bien spécifié au début de ce module 1

Sujet toujours en cours malheureusement...
 

christophe82

XLDnaute Nouveau
Re : Macro pour fermer un seul classeur parmis plusieurs dont le nom n'est pas connu

Aïe ! Ca ne marche pas non plus.
Je comprends avec votre réponse Dranreb que le souci provient peut-être de la procédure Workbook_BeforeSave que j'ai intégrée dans mon classeur (dans "Thisworkbook").

Pour plus de précision : Objectif de l'application :
1- A chaque fois que l'utilisateur enregistre le fichier, je lance un traitement qui s'appelle "sauv_planif" ET je ne souhaite pas que le fichier soit fermé après l'enregistrement pour que l'utilisateur reste dans le fichier
2- En revanche, si le classeur n'est pas utilisé pendant un moment, je souhaite :
a- que le traitement sauv_planif soit lancé comme à chaque enregistrement volontaire
b- que ce traitement ne réinitialise pas mon timer de fermeture automatique (qui se reinitialise à chaque changement de cellule (proc :"Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)")
c- que CE classeur soit automatiquement fermé MAIS avec un enregistrement préalable.

Ainsi, pour bien dissocier le fait que l'enregistrement du fichier soit issu OU d'une demande de l'utilisateur OU de la macro de fermeture automatique après timer, j'ai utilisé une variable que j'ai nommé "test".

Voici ma procédure "BeforeSave" dans laquelle j'ai intégré le "Application.EnableEvents = False" si mon test = true c'est à dire si l'enregistrement provient suite à la fermeture automatique après timer :

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Test = False Then
Call Sauve_Planif
Else
Application.EnableEvents = False
End If
End Sub

En prime, voici ma procédure de détection de l'activité dans le fichier :

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Test = False Then
Arrêt = True
Laps = Timer
Else
Test = True '****Pas très élégant et sans doute inutile***
End If
End Sub

Avec BeforeSave et la façon dont j'imbrique les traitements, j'avais peur de générer des "boucles de sauvegarde sans fin" mais ce n'est pas le cas, le fichier marche bien quand il est tout seul, le problème arrive quand un autre est ouvert par dessus.

Merci d'avance pour vos aides
 

Pierrot93

XLDnaute Barbatruc
Re : Macro pour fermer un seul classeur parmis plusieurs dont le nom n'est pas connu

Re, bonjour Bernard,

perso aurais plutôt placé "Application.EnableEvents = False" tout au début de ta procédure "ferme".... mais bon je crains de ne pas avoir toutes les infos... A voir comment et où sont définies tes variables "arret" et "test".... d'autre part, pas top pour l'utilisateur de lui fermer ses classeurs en forcant l'enregistrement et de quitter Excel...
 

christophe82

XLDnaute Nouveau
Re : Macro pour fermer un seul classeur parmis plusieurs dont le nom n'est pas connu

Merci Pierrot,

J'ai placé "Application.EnableEvents = False" tout au début de ta procédure "ferme" sans plus de succès.

Pour le fait de fermer l'application et donc tous les classeurs, c'est la solution radicale certes mais à noter que le timer d'inactivité sera configuré sur un délai assez long, l'application ne se fermera que "dans la nuit" si l'utilisateur oublie de le faire en quittant son poste.

Ensuite, pour être un peu plus clair sur le problème :
La variable Test est un booléen initialisé à False à l'ouverture du classeur.
Il bascule à True si le classeur reste inactif trop longtemps défini avec les macros suivantes :


Dans un module de macro:
Option Explicit

Public Durée As Date
Public Arrêt As Boolean
Public Laps As Double
Public Test As Boolean

Sub Départ()

Dim D As Date
D = Now + TimeValue(Durée)
Application.OnTime D, "FermerLeClasseur"
Durée = TimeValue("00:01:00")
End Sub


Sub FermerLeClasseur()

Dim M As Integer
Dim S As Integer
Dim R As String

If Arrêt = False Then
'Ferme et enregistre le classeur.
Test = True
Sauve_Planif
Else
Laps = Timer - Laps
M = Int(Laps / 60)
S = Int(Laps)
R = TimeValue("00:" & M & ":" & S)
Durée = TimeValue(Durée) - TimeValue(R)
Arrêt = False
Départ
End If
End Sub

Dans "ThisWorkBook", les 3 codes suivants :

Private Sub Workbook_Open()

Arrêt = False: Laps = Timer
Test = False
'Le temps pendant lequel le fichier n'est pas activé
'Heures:Minutes:Secondes
' à ajuster ici c'est réglé sur 1 minute !
Durée = TimeValue("00:01:00")
Départ
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'Remarque : cette macro événementielle détecte les clics dans une cellule du classeur.
'Pas de clic dans une cellule donnée, pas de saisie dans un userform, pas de changement de feuille...
If Test = False Then
Arrêt = True
Laps = Timer
Else
Test = True
End If
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

If Test = False Then
Call Sauve_Planif
Else
Application.EnableEvents = False
End If
End Sub


Et pour finir, les dernières lignes de ma macro Sauv_Planif sont :

" If Test = True Then
'Enregistre et lance la Fermeture du classeur.
'ActiveWorkbook.Save
Ferme
Else
End If

Voilà pour l'ensemble du cheminement.

Ce qui m'etonne c'est que le message d'erreur parle d'un "select de l'objet _Worksheet" alors que je n'utilise aucun Select et je ne fais jamais référence à une Worksheet dans les macros entrant en compte dans la fermeture du fichier.

Ca fait une petite tartine mais il fallait en passer par là pour être plus clair.

Merci d'avance pour vos avis d'experts
 

Dranreb

XLDnaute Barbatruc
Re : Macro pour fermer un seul classeur parmis plusieurs dont le nom n'est pas connu

Ce qui m'etonne c'est que le message d'erreur parle d'un "select de l'objet _Worksheet" alors que je n'utilise aucun Select
Si, obligatoirement, probablement dans Sauve_Planif

Vous auriez joint les classeurs concernés, ce serait réglé depuis longtemps.

P.S. Et éliminer le Select ne sera vraissemblablement pas suffisant: il vous faudra préciser ThisWorkbook. devant un Worksheets(... pour qu'il ne cherche pas par défaut celui de ActiveWorkbook, vu que ce n'est pas du tout lui qui est actif quand vous déroulez votre moulinette de fermeture !
Une règle d'or: qualifiez TOUJOURS de leurs parent les collections dont vous extrayez un membre. Je me suis fait avoir une fois (il y a longtemps) à un truc du même genre qui plantait quand on quittait Excel depuis un autre classeur actif !
À+
 
Dernière édition:

Discussions similaires

Réponses
7
Affichages
2 K
Compte Supprimé 979
C

Statistiques des forums

Discussions
311 740
Messages
2 082 047
Membres
101 880
dernier inscrit
Anton_2024