Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VBA] - Problème de fermeture de classeur à partir d'un autre

11 réponses
Avatar
belay04
Bonjour !

Je vais essayer d'être bref et précis. J'ai parcouru le forum en long
en large et en travers et je n'ai pas trouvé de solutions qui marche
pour moi.

Je gére un application un poil complexe depuis un classeur nommé
"Gestion.xls" qui crée différents classeurs que l'on va appellé
"Classeur(i).xls"...
Via mon interface VBA du classeur gestion.xls je recupére tous les
classeurs de maniére à pouvoir les modifier.
Tous les classeur(i) reçoive leur de leur sauvegarde un bouton "RETOUR
MENU".

Bon on entre dans le vif du sujet.
Via mon interface VBA de gestion.xls j'ouvre un classeur que je désire
modifier...
J'effectue mes modifications
Et maintenant je dois retourne sur l'application principale
(gestion.xls) en fermant ce classeur. Pour ce faire je clique sur le
bouton "retour menu" qui me lance la procédure suivante :

Application.Run ("gestion.xls") & ("!MODIFFICHIER")

dans le fichier "gestion.xls" j'ai :
**********************************************************
Sub MODIFFICHIER()
'SAUVEGARDE DU FICHIER
ActiveWorkbook.Save
ActiveWindow.WindowState = xlMinimized
MSG_RECOK 'ça c juste une msgbox

'RETOUR MENU
Workbooks("gestion.xls").Activate
ActiveWindow.WindowState = xlMinimized

'FERMETURE DES CLASSEURS INACTIFS
CLOSEWBK

Menu.Show
End Sub
**********************************************************
et pour finir (tjrs ds gestion.xls)
Public Sub CLOSEWBK()

Dim Wb As Workbook
Dim AWb As String
AWb = ActiveWorkbook.Name

For Each Wb In Workbooks
If Wb.Name <> AWb Then
Wb.Close False
End If
Next Wb
Menu.show
End Sub
*********************************************************

MAis voila je n'arrive jamais à l'instruction menu.show parce que
lorsque dans la boucle "If" il tombe sur un classeur inactif, il le
ferme et voila c fini é_è
Si vous avez des pistes je suis preneur ....
J'ai déjà essayer en plaçant des evenements ds workbook_beforeclose
mais ça ne marche pas non plus ......

Merci Beaucoup !
Belay

10 réponses

1 2
Avatar
poy-poy
Bonjour Belay,

Il y a un truc que je ne comprends pas. Quand tu dis "quand il tombe sur un
classeur inactif il le ferme et c'est fini", tu parles de n'importe quel
classeur inactif ?
Parce que ton code étant dans gestion.xls, tant que celui-ci n'est pas fermé
je ne vois pas pourquoi le code s'arreterait. Inversement, si c'est ton code
ferme gestion.xls, le code s'arrete effectivement.

Pourrais-tu donner un peu plus de précisions ?
Cordialement
benjamin


Bonjour !

Je vais essayer d'être bref et précis. J'ai parcouru le forum en long
en large et en travers et je n'ai pas trouvé de solutions qui marche
pour moi.

Je gére un application un poil complexe depuis un classeur nommé
"Gestion.xls" qui crée différents classeurs que l'on va appellé
"Classeur(i).xls"...
Via mon interface VBA du classeur gestion.xls je recupére tous les
classeurs de maniére à pouvoir les modifier.
Tous les classeur(i) reçoive leur de leur sauvegarde un bouton "RETOUR
MENU".

Bon on entre dans le vif du sujet.
Via mon interface VBA de gestion.xls j'ouvre un classeur que je désire
modifier...
J'effectue mes modifications
Et maintenant je dois retourne sur l'application principale
(gestion.xls) en fermant ce classeur. Pour ce faire je clique sur le
bouton "retour menu" qui me lance la procédure suivante :

Application.Run ("gestion.xls") & ("!MODIFFICHIER")

dans le fichier "gestion.xls" j'ai :
**********************************************************
Sub MODIFFICHIER()
'SAUVEGARDE DU FICHIER
ActiveWorkbook.Save
ActiveWindow.WindowState = xlMinimized
MSG_RECOK 'ça c juste une msgbox

'RETOUR MENU
Workbooks("gestion.xls").Activate
ActiveWindow.WindowState = xlMinimized

'FERMETURE DES CLASSEURS INACTIFS
CLOSEWBK

Menu.Show
End Sub
**********************************************************
et pour finir (tjrs ds gestion.xls)
Public Sub CLOSEWBK()

Dim Wb As Workbook
Dim AWb As String
AWb = ActiveWorkbook.Name

For Each Wb In Workbooks
If Wb.Name <> AWb Then
Wb.Close False
End If
Next Wb
Menu.show
End Sub
*********************************************************

MAis voila je n'arrive jamais à l'instruction menu.show parce que
lorsque dans la boucle "If" il tombe sur un classeur inactif, il le
ferme et voila c fini é_è
Si vous avez des pistes je suis preneur ....
J'ai déjà essayer en plaçant des evenements ds workbook_beforeclose
mais ça ne marche pas non plus ......

Merci Beaucoup !
Belay



Avatar
anomymousA
bonjour,

j'ai essayé ta macro dans les conditions que tu décris.
Ce qui se produit me parait être la chose suivante. Lorsque depuis ton
classeur p.e Classeur(1).xls tu appelles par Application.run le programme
MODIFFICHIER de gestion.xls, la mémoire pointe sur ce fichier et cette
procédure commence à se dérouler car les 2 fichiers sont chargés en mémoire.
Si au cours de ta procédure WBKCLOSE , tu fermes le fichier appelant , donc
ici Classeur(1) , la mémoire est vidée et la liaison donc rompue, ce qui
explique que ton programme parait s'arrêter et le userform Menu ne jamais
s'afficher puisque quel que soit l'endroit d'où on appelle cette instruction,
celle-ci se produit après la fermeture du fichier qui a généré l'appel à la
procédure maitre.

Fais un essai pour t'en convaincre. Enregistres 2 fichiers l'un que tu
appelles toto et l'autre tata.
Dans tata.xls, tu écris le code suivant.

Sub lancer()
MsgBox "entrée"
Workbooks("toto.xls").Close
MsgBox "suite1"
MsgBox "suite2"

End Sub

et dans toto tu écris

Sub essai()

Application.Run "tata.xls" & "!lancer"

End Sub

si tu lances la procédure essai, tu constateras que le MsgBox "entrée"
s'execute mais pas les autres et ce sans aucune erreur car en fait il n'y en
a aucune , ce qui prouve ce que je t'ai écrit plus haut.

En conséquence, c'est dans la strcuture conceptuelle que tu as un problème
et pas en VBA.

A+


Bonjour !

Je vais essayer d'être bref et précis. J'ai parcouru le forum en long
en large et en travers et je n'ai pas trouvé de solutions qui marche
pour moi.

Je gére un application un poil complexe depuis un classeur nommé
"Gestion.xls" qui crée différents classeurs que l'on va appellé
"Classeur(i).xls"...
Via mon interface VBA du classeur gestion.xls je recupére tous les
classeurs de maniére à pouvoir les modifier.
Tous les classeur(i) reçoive leur de leur sauvegarde un bouton "RETOUR
MENU".

Bon on entre dans le vif du sujet.
Via mon interface VBA de gestion.xls j'ouvre un classeur que je désire
modifier...
J'effectue mes modifications
Et maintenant je dois retourne sur l'application principale
(gestion.xls) en fermant ce classeur. Pour ce faire je clique sur le
bouton "retour menu" qui me lance la procédure suivante :

Application.Run ("gestion.xls") & ("!MODIFFICHIER")

dans le fichier "gestion.xls" j'ai :
**********************************************************
Sub MODIFFICHIER()
'SAUVEGARDE DU FICHIER
ActiveWorkbook.Save
ActiveWindow.WindowState = xlMinimized
MSG_RECOK 'ça c juste une msgbox

'RETOUR MENU
Workbooks("gestion.xls").Activate
ActiveWindow.WindowState = xlMinimized

'FERMETURE DES CLASSEURS INACTIFS
CLOSEWBK

Menu.Show
End Sub
**********************************************************
et pour finir (tjrs ds gestion.xls)
Public Sub CLOSEWBK()

Dim Wb As Workbook
Dim AWb As String
AWb = ActiveWorkbook.Name

For Each Wb In Workbooks
If Wb.Name <> AWb Then
Wb.Close False
End If
Next Wb
Menu.show
End Sub
*********************************************************

MAis voila je n'arrive jamais à l'instruction menu.show parce que
lorsque dans la boucle "If" il tombe sur un classeur inactif, il le
ferme et voila c fini é_è
Si vous avez des pistes je suis preneur ....
J'ai déjà essayer en plaçant des evenements ds workbook_beforeclose
mais ça ne marche pas non plus ......

Merci Beaucoup !
Belay



Avatar
Belay
Re bonjour et merci de vous attacher à mon pb !

Poy-Poy ->
Ce qui se passe lorsque VBA arrive sur l'instruction wb.close c'est que la
lecture du code s'arrête net....AnonymousA a exactement compris ce qu'il se
passe et en fait à reformulé mon pb.

AnonymousA ->
Comme je le dit plus haut tu as reformulé ma question...Je m'étais rendu
compte de ce pb sans le ratacher à un pb de gestion mémoire ...... Donc
maintenant ma question devient plus simple. En admettant que mon concept soit
bancal ! Comment faire pour retransférer le focus du classeur devant se
fermer (dans l'exemple d'anonymous toto.xls) soit transférer au classeur
maître (gestion.xls ou toto.xls ds le cas d'anonymousA) ?

Je suis preneur de toutes les pistes ....
Cordialement
Avatar
anomymousA
re,

il me semble que tu te compliques la vie ou bien qu'il me manque des données
du problème.
A aucun moment, me semble t-il, ton fichier maitre gestion.xls n'est fermé
ni masqué (au sens masquage des fichiers par la commande Fenêtre/Masquer) et
quand bien même le serait-il , un click sur ton bouton dans ton fichier
Classeur(i).xls pourrait le faire réapparaitre et l'activer voire même
l'ouvrir.

Parallèlement, mets un bouton sur ton fichier gestion.xls qui va faire le
travail WBKCLOSE sur l'ensemble des fichiers ouverts sauf lui-même.
Certes c'est peut-être un peu moins automatique mais là pas de danger que
les crayons s'emmelent.

Autre possibilité, faire un fichier modèle (ce qui evitera par programmation
de construire un bouton et la macro attachée lors de la construction des
ficheirs Classeurs(i).xls) dans lequel il existe un bouton et unemacro
attachée à celui-ci qui ferait la chose suivante: S'enregistrer soit-même (
du gentre thisworkbook.save), rechercher dans tous les fichiers ouverts tous
ceux qui ne s'appellent ni comme lui-même ni comme gestion.xls et les fermer,
puis se fermer soi-même (thisworkbook.close) et donc ne laisser sur
l'environnement excel que le fichier gestion.xls , et par une petite
procédure evenementielle (avec des tests peut-être pour ne s'affichersur que
dans des cas précis) un workbook_Activate déclencher ton userform (MENU.Show).

Et puis surtout gerer les erreurs ce qui n'est peut-être pas le + simple.

Voilà ce que je ferais moi.

A+


Re bonjour et merci de vous attacher à mon pb !

Poy-Poy ->
Ce qui se passe lorsque VBA arrive sur l'instruction wb.close c'est que la
lecture du code s'arrête net....AnonymousA a exactement compris ce qu'il se
passe et en fait à reformulé mon pb.

AnonymousA ->
Comme je le dit plus haut tu as reformulé ma question...Je m'étais rendu
compte de ce pb sans le ratacher à un pb de gestion mémoire ...... Donc
maintenant ma question devient plus simple. En admettant que mon concept soit
bancal ! Comment faire pour retransférer le focus du classeur devant se
fermer (dans l'exemple d'anonymous toto.xls) soit transférer au classeur
maître (gestion.xls ou toto.xls ds le cas d'anonymousA) ?

Je suis preneur de toutes les pistes ....
Cordialement


Avatar
poy-poy
Bonjour Belay,

je ne savais pas ceci, donc je mourrais moi bête ce soir ^^. Sinon j'ai
aussi des propositions sur ton bouton :-).

Première possibilité, (j'y crois pas trop mais bon ca se tente ) tu finis
d'automatiser les modifications qui doivent se faire sur chacun de tes
fichiers afin que gestion pilote tout tout seul et ferme les dossiers par la
même occasion.
Deuxième possibilité, plus plausible, tu te crée un macro fermer tous les
dossier sauf gestion que tu colles dans un module de personnel.xls. tu
pourras alors la lancer de n'importe quel fichier.
Bon, c'est juste histoire de dire que je participe parce que le mysterieux
personnage qui t'as repondu à raison, un simple bouton sur gestion marcherait
nickel.

Cordialement
Benjamin


Re bonjour et merci de vous attacher à mon pb !

Poy-Poy ->
Ce qui se passe lorsque VBA arrive sur l'instruction wb.close c'est que la
lecture du code s'arrête net....AnonymousA a exactement compris ce qu'il se
passe et en fait à reformulé mon pb.

AnonymousA ->
Comme je le dit plus haut tu as reformulé ma question...Je m'étais rendu
compte de ce pb sans le ratacher à un pb de gestion mémoire ...... Donc
maintenant ma question devient plus simple. En admettant que mon concept soit
bancal ! Comment faire pour retransférer le focus du classeur devant se
fermer (dans l'exemple d'anonymous toto.xls) soit transférer au classeur
maître (gestion.xls ou toto.xls ds le cas d'anonymousA) ?

Je suis preneur de toutes les pistes ....
Cordialement


Avatar
Belay
Merci de ta reponse ;)

Bon alors je v préciser un peu plus la finalité de la mon application ....
En fait, le fichier gestion.xls contient :
- une feuille de données clients
- une feuille modéle pour réaliser des devis
- une feuille modéle pour réaliser des factures
- une feuille modéle pour réaliser des bons de livraisons...
(je sais , j'aurai pu faire ça sous Access mais maitrîsant bien plus excel
je me suis orienté la dessus)....
Bref! Le classeur gestion.xls est mis à jour à chaque fois que l'on réalise
une opération (nouveau devis, nouvelle facture, modification de devis,
edition de bon de livraison) et je gére tout cela via plusieurs userform VBA
qui s'enchaînent en proposant des options aux utilisateurs : LES EMPLOYES DE
MA SOCIETE ^_^ ...
Alors en gros j'ai utilisé la méthode que je vous ai décrite parce que le
classeur gestion.xls génére des fichiers (pr les devis, les factures et les
bl)... Le pb c'est pas la génération de fichier mais la modification...
Puisque qu'à chaque modification d'un fichier, mon classeur MAITRE
(gestion.xls) ouvre le fichier selectionné par l'opérateur (listbox +
filesearch font des merveilles) et à partir de ce moment j'ai deux solutions :
-> soit je rend la userform qui m'a permis de selectionner puis d'ouvrir le
fichier non-modale ------------> Pb j'ai toujours ma userform qui reste
affichée
-> soit jer cache ma userform (ce que je fais) , donc plus de pb de
modalités et j'essai de redonner son status de maître au fichier gestion.xls
(ce que je n'arrive pas à faire qui n'est peu etre pas faisable d'ailleur
^_^) via un bouton + macro ....

Aprés avoir lu t proposition, il me semble que je ne devrai peu etre pas
essayer de passer comme cela et qu'au lieu d'essayer de fermer les classeurs
esclaves je devrai peu etre juste les masquer et lorsque je ferme le classeur
maître fermer tous les classeurs ouvert -------------> Pb en admettant que
je modifi 100devis différents j'aurai 100devis d'ouvert sans compté les pb de
fichiers déjà ouvert que l'on tente de réouvrir...... Ce qui me chagrine un
peu c'est que j'utilise la mm méthode pour créer un devis et que cela marche
sans pb ..... Cf ci-dessous...
Je peux vous transmettre mes fichiers si vous le souhaiter pour que vous
comprenniez bien le fonctionnement de mon application

Code de création d'un devis :
**************************************************
Private Sub b_creer_Click() 'fichier "gestion.xls"
Application.Run ("gestion.xls") & ("!CREERFICHIER")
End Sub
***************************************************
Sub CREERFICHIER()
Dim nomdevis, nomfichier, newbook As String
Dim xlline As Integer

'MAJ DES DONNEES
'RECUPERATION DE LA LIGNE XL CORRESPONDANT O CLIENT
xlline = devis_p2.recherche2.ListIndex + 3 ' Decalage de 3 due à la feuille
excel
Sht_Clients.Cells(xlline, 14) = Sht_Devis.Cells(9, 3) 'MAJ N° Proposition
Client
Sht_Donnees.Cells(2, 4) = Sht_Devis.Cells(10, 3) 'MAJ Nbre Global de Devis

'RECUPERATION DU NUMERO DE DEVIS'
nomdevis = Sht_Devis.Cells(14, 3)
nomfichier = "DV_" & nomdevis

'MISE EN FORME DU NOUVEAU CLASSEUR
Workbooks.Add
newbook = Application.ActiveWorkbook.Name
ActiveWindow.WindowState = xlMinimized
Workbooks(xlmaster).Activate
ActiveWindow.WindowState = xlMinimized
Sht_Devis.Select
Sht_Devis.Copy Before:=Workbooks(newbook).Sheets(1)

'MASQUAGE DU BOUTON CREER
Sht_Devis.b_creer.Visible = False
Sht_Devis.b_modifier.Visible = True
ActiveWindow.View = xlPageBreakPreview 'Apperçu des sauts de pages

'EFFACAGE DES FEUILLES QUI SERVENT A RIEN EN DESACTIVANT LES ALERTES
Sheets(Array("Feuil1", "Feuil2", "Feuil3")).Select
Application.DisplayAlerts = False
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True

'MASQUAGE DES BOUTONS
ActiveSheet.b_modifier.Visible = False
ActiveSheet.b_retour.Visible = False
ActiveSheet.b_creer.Visible = False

'SAUVEGARDE
ActiveWorkbook.SaveAs Filename:=(chemindevis) & (nomfichier),
FileFormat:=xlNormal, password:="", WriteResPassword:="", _
ReadOnlyRecommended:úlse, CreateBackup:úlse
MSG_RECOK
ActiveWorkbook.Close

'EFFACAGE DU BROUILLON DEVIS
CLEARDEVIS

'RETOUR MENU
Menu.Show

End Sub
***************************************************

Votre avis la dessus ? ^_^
Avatar
Belay
Comme koi ton post n'est pas inutile puisqu'il m'a aidé à comprendre le post
de anonymous A
Avatar
anonymousA
bonsoir,

je n'ai pas trop le temps tout de suite de regarder ton code. Ceci dit
comme j'ai lu ton mail, il y a un moment ou tu evoques le fait que ton
userform est toujours affiché s'il est non modal.
Dans l'attente d'examiner ton code plus attentivement, je te
communiquerai demain un code qui permet de minimiser un userform non
modal dans la barre des fichiers ( un miracle de notre ami de l'autre
coté du monde: Ivan Moala).

A+

Merci de ta reponse ;)

Bon alors je v préciser un peu plus la finalité de la mon application ....
En fait, le fichier gestion.xls contient :
- une feuille de données clients
- une feuille modéle pour réaliser des devis
- une feuille modéle pour réaliser des factures
- une feuille modéle pour réaliser des bons de livraisons...
(je sais , j'aurai pu faire ça sous Access mais maitrîsant bien plus excel
je me suis orienté la dessus)....
Bref! Le classeur gestion.xls est mis à jour à chaque fois que l'on réalise
une opération (nouveau devis, nouvelle facture, modification de devis,
edition de bon de livraison) et je gére tout cela via plusieurs userform VBA
qui s'enchaînent en proposant des options aux utilisateurs : LES EMPLOYES DE
MA SOCIETE ^_^ ...
Alors en gros j'ai utilisé la méthode que je vous ai décrite parce que le
classeur gestion.xls génére des fichiers (pr les devis, les factures et les
bl)... Le pb c'est pas la génération de fichier mais la modification...
Puisque qu'à chaque modification d'un fichier, mon classeur MAITRE
(gestion.xls) ouvre le fichier selectionné par l'opérateur (listbox +
filesearch font des merveilles) et à partir de ce moment j'ai deux solutions :
-> soit je rend la userform qui m'a permis de selectionner puis d'ouvrir le
fichier non-modale ------------> Pb j'ai toujours ma userform qui reste
affichée
-> soit jer cache ma userform (ce que je fais) , donc plus de pb de
modalités et j'essai de redonner son status de maître au fichier gestion.xls
(ce que je n'arrive pas à faire qui n'est peu etre pas faisable d'ailleur
^_^) via un bouton + macro ....

Aprés avoir lu t proposition, il me semble que je ne devrai peu etre pas
essayer de passer comme cela et qu'au lieu d'essayer de fermer les classeurs
esclaves je devrai peu etre juste les masquer et lorsque je ferme le classeur
maître fermer tous les classeurs ouvert -------------> Pb en admettant que
je modifi 100devis différents j'aurai 100devis d'ouvert sans compté les pb de
fichiers déjà ouvert que l'on tente de réouvrir...... Ce qui me chagrine un
peu c'est que j'utilise la mm méthode pour créer un devis et que cela marche
sans pb ..... Cf ci-dessous...
Je peux vous transmettre mes fichiers si vous le souhaiter pour que vous
comprenniez bien le fonctionnement de mon application

Code de création d'un devis :
**************************************************
Private Sub b_creer_Click() 'fichier "gestion.xls"
Application.Run ("gestion.xls") & ("!CREERFICHIER")
End Sub
***************************************************
Sub CREERFICHIER()
Dim nomdevis, nomfichier, newbook As String
Dim xlline As Integer

'MAJ DES DONNEES
'RECUPERATION DE LA LIGNE XL CORRESPONDANT O CLIENT
xlline = devis_p2.recherche2.ListIndex + 3 ' Decalage de 3 due à la feuille
excel
Sht_Clients.Cells(xlline, 14) = Sht_Devis.Cells(9, 3) 'MAJ N° Proposition
Client
Sht_Donnees.Cells(2, 4) = Sht_Devis.Cells(10, 3) 'MAJ Nbre Global de Devis

'RECUPERATION DU NUMERO DE DEVIS'
nomdevis = Sht_Devis.Cells(14, 3)
nomfichier = "DV_" & nomdevis

'MISE EN FORME DU NOUVEAU CLASSEUR
Workbooks.Add
newbook = Application.ActiveWorkbook.Name
ActiveWindow.WindowState = xlMinimized
Workbooks(xlmaster).Activate
ActiveWindow.WindowState = xlMinimized
Sht_Devis.Select
Sht_Devis.Copy Before:=Workbooks(newbook).Sheets(1)

'MASQUAGE DU BOUTON CREER
Sht_Devis.b_creer.Visible = False
Sht_Devis.b_modifier.Visible = True
ActiveWindow.View = xlPageBreakPreview 'Apperçu des sauts de pages

'EFFACAGE DES FEUILLES QUI SERVENT A RIEN EN DESACTIVANT LES ALERTES
Sheets(Array("Feuil1", "Feuil2", "Feuil3")).Select
Application.DisplayAlerts = False
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True

'MASQUAGE DES BOUTONS
ActiveSheet.b_modifier.Visible = False
ActiveSheet.b_retour.Visible = False
ActiveSheet.b_creer.Visible = False

'SAUVEGARDE
ActiveWorkbook.SaveAs Filename:=(chemindevis) & (nomfichier),
FileFormat:=xlNormal, password:="", WriteResPassword:="", _
ReadOnlyRecommended:úlse, CreateBackup:úlse
MSG_RECOK
ActiveWorkbook.Close

'EFFACAGE DU BROUILLON DEVIS
CLEARDEVIS

'RETOUR MENU
Menu.Show

End Sub
***************************************************

Votre avis la dessus ? ^_^


Avatar
Belay
Me revoila je fais evoluer mon thread tout seul ^_^

J'ai trouvé la solution à mon pb en m'inspirant de vos remarques ..... et
en l'adaptant à mon sens de fonctionnement.

Les boutons qui étaient avant intégrés directement sur mes classeurs et qui
lançaient des MACROS source de mes pb ont été supprimés et remplacés par de
petites userform contenant 1seul bouton non-modale et sans croix de
fermeture.... qui fait exactement la chose que mes boutons intégrés aux
classeurs ac le gros avantage de ne pas me faire perdre le focus (puisque les
boutons - userform sont lancés depuis le classeur maître)....

Merci pour votre aide c'était sympa et rapide ;)
Avatar
Gaenonius
Apparemment tu as trouvé une solution. Cependant, ton problème initial, comme
cela t'a été suggéré, vient de ce que ton code ferme purement et simplement le
classeur qui contient le code de CLOSEWBK (soit gestion.xls). En effet ce
classeur fait partie de la collection Workbooks et il n'est pas "protégé" par la
condition If Wb.Name <> AWb, sans doute parce que, malgré
Workbooks("gestion.xls").Activate
de la procédure MODIFFICHIER il _n'est pas_ le classeur actif à ce moment-là.
En remplaçant ActiveWorkbook par ThisWorkbook, cela devrait fonctionner comme tu
le souhaitais :

'''''''''''''''''''''
Public Sub CLOSEWBK()
Dim Wb As Workbook
Dim AWb As String

AWb = ThisWorkbook.Name
For Each Wb In Workbooks
If Wb.Name <> AWb Then
Wb.Close False
End If
Next Wb
Menu.show

End Sub
'''''''''''''''''''''

--
Gaenonius

Bonjour !

Je vais essayer d'être bref et précis. J'ai parcouru le forum en long
en large et en travers et je n'ai pas trouvé de solutions qui marche
pour moi.

Je gére un application un poil complexe depuis un classeur nommé
"Gestion.xls" qui crée différents classeurs que l'on va appellé
"Classeur(i).xls"...
Via mon interface VBA du classeur gestion.xls je recupére tous les
classeurs de maniére à pouvoir les modifier.
Tous les classeur(i) reçoive leur de leur sauvegarde un bouton "RETOUR
MENU".

Bon on entre dans le vif du sujet.
Via mon interface VBA de gestion.xls j'ouvre un classeur que je désire
modifier...
J'effectue mes modifications
Et maintenant je dois retourne sur l'application principale
(gestion.xls) en fermant ce classeur. Pour ce faire je clique sur le
bouton "retour menu" qui me lance la procédure suivante :

Application.Run ("gestion.xls") & ("!MODIFFICHIER")

dans le fichier "gestion.xls" j'ai :
**********************************************************
Sub MODIFFICHIER()
'SAUVEGARDE DU FICHIER
ActiveWorkbook.Save
ActiveWindow.WindowState = xlMinimized
MSG_RECOK 'ça c juste une msgbox

'RETOUR MENU
Workbooks("gestion.xls").Activate
ActiveWindow.WindowState = xlMinimized

'FERMETURE DES CLASSEURS INACTIFS
CLOSEWBK

Menu.Show
End Sub
**********************************************************
et pour finir (tjrs ds gestion.xls)
Public Sub CLOSEWBK()

Dim Wb As Workbook
Dim AWb As String
AWb = ActiveWorkbook.Name

For Each Wb In Workbooks
If Wb.Name <> AWb Then
Wb.Close False
End If
Next Wb
Menu.show
End Sub
*********************************************************

MAis voila je n'arrive jamais à l'instruction menu.show parce que
lorsque dans la boucle "If" il tombe sur un classeur inactif, il le
ferme et voila c fini é_è
Si vous avez des pistes je suis preneur ....
J'ai déjà essayer en plaçant des evenements ds workbook_beforeclose
mais ça ne marche pas non plus ......

Merci Beaucoup !
Belay


1 2