[VBA-E] Bricolage pour fermer et ouvrir le classeur actif
Salut tout le monde!
Nouveau jour, nouveau problème!
Je recherche une méthode pour fermer et ouvrir le classeur actif (ThisWorkbook) pour une raison que je vous épargne, et je me suis mis à bricoler un truc qui fonctionne a moitié :
Sub CloseOpen()
Dim X As Integer
Dim fi, fi2, ch As String
Dim Cl As Workbook
Dim VBComp As VBComponent
Set Cl = Workbooks.Add
fi = Cl.Name
fi2 = ThisWorkbook.Name
ch = ThisWorkbook.Path
Set VBComp = Cl.VBProject.VBComponents.Add(1)
VBComp.Name = "ModuleTemp"
With VBComp.CodeModule
X = .CountOfLines
.InsertLines X + 1, "Sub FermeFichier ()"
.InsertLines X + 2, "Application.DisplayAlerts = False"
.InsertLines X + 3, "Workbooks(""" & fi2 & """).Close savechanges:=False"
.InsertLines X + 4, "Workbooks.Open Filename:=""" & ch & "\" & fi2 & """"
.InsertLines X + 5, "ThisWorkbook.Close SaveChanges:= False"
.InsertLines X + 6, "Application.DisplayAlerts = True"
.InsertLines X + 7, "End Sub"
End With
Application.Run ("" & fi & "!ModuleTemp.FermeFichier")
End Sub
Voilà, donc mon fichier ce ferme bien, correspond à la ligne X+3
, mais il ne s'ouvre pas :/
C'est pas une urgence mais si quelqu'un savait d'où vient le problème, ou même une méthode pour ouvrir / fermer le fichier actif, sa serait cool
Merci d'avance!
Bonjour, Juice,
il faudrait mettre la macro dans le classeur de macro perso (Personnal.xlsb)
et modifier ThisWorkbook
par ActiveWorkbook
Bonjour i20100,
Merci pour ton retour rapide!
Alors j'ai bien l'impression que sa a fonctionné! Je serais pas dire vue que c'est assez rapide et que j'ai pas eu le temps de voir si le fichier c'est bien ouvert et fermé!
Une dernière question : Comment je refais appel à la macro que j'ai mis dans le classeur Personnal.xlsb
:0 ?
Édit: C'est moi qui ai été trop pressé et qui n'a pas enregistré la macro avant de la lancer !
Du coup tout c'était fermé et "perdu" !
Merci i20100 pour ton aide
Encore une Édit : Bon bah malgré le fais que le code soit placé dans un module du classeur personnel, l’exécution s'arrête à la fermeture du classeur qui a lancé la macro!
Sa fonctionne en utilisant le "Pas à Pas" (ou F8
) mais pas en la laissant tourner
re,
oups je vient de voir qu'un fichier était ajouter par la macro, Workbooks.Add
je voudrait vérifier avec toi, si j'ai bien compris la démarche,
on détermine ou est la macro principal
fi2 = ThisWorkbook.Name
ch = ThisWorkbook.Path
on ajoute un classeur, ce nouveau classeur devient l'ActiveWorkbook
Set Cl = Workbooks.Add
fi = Cl.Name
puisque le nouveau classeur n'a pas été encore enregistrer, celui-ci aura le nom de "Classeurx"
ensuite tu ajoute une macro dans le nouveau classeur (fi)
Set VBComp = Cl.VBProject.VBComponents.Add(1)
VBComp.Name = "ModuleTemp"
With VBComp.CodeModule
X = .CountOfLines
.InsertLines X + 1, "Sub FermeFichier ()"
.InsertLines X + 2, "Application.DisplayAlerts = False"
.InsertLines X + 3, "Workbooks(""" & fi2 & """).Close savechanges:=False"
.InsertLines X + 4, "Workbooks.Open Filename:=""" & ch & "\" & fi2 & """"
.InsertLines X + 5, "ThisWorkbook.Close SaveChanges:= False"
.InsertLines X + 6, "Application.DisplayAlerts = True"
.InsertLines X + 7, "End Sub"
End With
et tu veux exécuter la macro qui est sur le nouveau classeur (fi)
Application.Run ("" & fi & "!ModuleTemp.FermeFichier")
cette macro ferme le premier classeur (fi2) sans l'enregistrer
puis ré-ouvre le premier classeur (fi2)
ensuite ThisWorkbook.Close SaveChanges:= False
là tu veux fermer le fichier (fi) que tu vient de créer, mais sans l’enregistrer ?
Re-
on détermine ou est la macro principal
fi2 = ThisWorkbook.Name ch = ThisWorkbook.Path
En effet, c'est deux variable contiennent le nom et chemin de mon fichier principal
on ajoute un classeur, ce nouveau classeur devient l'ActiveWorkbook
Set Cl = Workbooks.Add fi = Cl.Name
En effet! Puisqu'il viens d'être créé, il passe automatiquement devant le fichier principal
Puis on enregistre son nom dans la variable fi
puisque le nouveau classeur n'a pas été encore enregistrer, celui-ci aura le nom de "Classeurx"
ensuite tu ajoute une macro dans le nouveau classeur (fi)
Set VBComp = Cl.VBProject.VBComponents.Add(1) VBComp.Name = "ModuleTemp" With VBComp.CodeModule X = .CountOfLines .InsertLines X + 1, "Sub FermeFichier ()" .InsertLines X + 2, "Application.DisplayAlerts = False" .InsertLines X + 3, "Workbooks(""" & fi2 & """).Close savechanges:=False" .InsertLines X + 4, "Workbooks.Open Filename:=""" & ch & "\" & fi2 & """" .InsertLines X + 5, "ThisWorkbook.Close SaveChanges:= False" .InsertLines X + 6, "Application.DisplayAlerts = True" .InsertLines X + 7, "End Sub" End With
Exactement! Tout cela fonctionne très bien !
et tu veux exécuter la macro qui est sur le nouveau classeur (fi)
Application.Run ("" & fi & "!ModuleTemp.FermeFichier")
Oui ! La macro ce lance correctement ce sur le Classeurx
cette macro ferme le premier classeur (fi2) sans l'enregistrer
puis ré-ouvre le premier classeur (fi2)
Voilà, c'est là où sa calanche : Une fois le classeur (fi2) fermé l'exécution du code s'arrête
ensuite
ThisWorkbook.Close SaveChanges:= False
là tu veux fermer le fichier (fi) que tu vient de créer, mais sans l’enregistrer ?
En effet, le classeur (fi) est (dans l'idée) un classeur temporaire utilisé uniquement pour pouvoir ouvrir et fermer le fichier principal (fi2)
T'a exactement tout compris *-*
re
T'a exactement tout compris *-*
pas exactement, je n'ai pas compris à quoi ça sert ?
Bonjour,
moi aussi je serais curieux de connaitre l'intérêt et la finalité.
Il y a peut-être des méthodes plus orthodoxes pour atteindre le but.
Maintenant, si ça fonctionne en pas à pas, et pas en direct il peut s'agir d'enchainements trop rapides. Essayer en insérant une tempo après fermeture du classeur1 et/ou une autre après sa ré-ouverture.
eric
Isa, Eric,
Encore une fois, merci de votre sollicitude
Maintenant, si ça fonctionne en pas à pas, et pas en direct il peut s'agir d'enchainements trop rapides. Essayer en insérant une tempo après fermeture du classeur1 et/ou une autre après sa ré-ouverture.
eric
J'y ai pensé aussi et j'ai essayé de mettre un Application.Wait
mais sa ne fonctionne pas :/
Pour moi le problème viens du fais que :
1 - Je lance la macro via mon classeur principal
2 - La macro créé un ClasseurX avec une "sous-macro" a l'intérieur qui s’exécute ensuite
3 - Dans cette sous-macro, je demande à fermer le classeur principal
4 - Vue que le classeur ayant lancé l'exécution de cette macro viens d'être fermé, alors le code s'interrompt
pas exactement, je n'ai pas compris à quoi ça sert ?
moi aussi je serais curieux de connaitre l'intérêt et la finalité.
Il y a peut-être des méthodes plus orthodoxes pour atteindre le but.
J'ai bien dit que c'était du bricolage xDDD
Bon alors c'est tout bête (je résume pas mal) :
A l'ouverture d'un fichier extrait de l'un de nos logiciels, il est formater et des infos d'autres classeurs sont rapprochés pour être près à l'envoie à l'un de nos clients.
Donc je passe par un Private Sub App_WorkbookOpen(ByVal Wb As Excel.Workbook)
pour détecter l'ouverture d'un classeur et des boucles, des si, des ouvertures et fermetures de classeur pour mettre tous sa en forme.
Sa marche impec' mais uniquement pour le premier fichier qui va s'ouvrir
Pour les autres, je suis obligé de fermer et d'ouvrir à nouveau le classeur.
Donc le problème c'est que la détection de l'ouverture d'un classeur ne se fais plus après la première ouverture.
Le code en question :
Option Explicit
Public WithEvents App As Application
Private Sub Workbook_Open()
Set App = Application
End Sub
Private Sub App_WorkbookOpen(ByVal Wb As Excel.Workbook)
MsgBox "Ouverture de fichier"
End Sub
Et j'ai déjà tenter de relancer la variable App mais sa ne marche pas non plus :
Sub xxx
Set App = Application
End Sub
Voilà pourquoi je voulais procéder à l'ouverture & fermeture du fichier par macro :p
Merci d'avance pour vos retours ^^
Commence peut-être par voir pourquoi cet événement App_WorkbookOpen ne se déclenche pas.
Il faut bien sûr qu'il ait fini le boulot avant d'en ouvrir un autre.
Mais pourquoi utiliser cet événement ? C'est plus simple d'avoir un fichier qui fait les traitements et qui demande à l'utilisateur quel fichier il veut (avec un GetOpenFilename au besoin) au fur et à mesure non ?
eric
Re-
Commence peut-être par voir pourquoi cet événement App_WorkbookOpen ne se déclenche pas.
Il faut bien sûr qu'il ait fini le boulot avant d'en ouvrir un autre.
Oui oui il a bien fini le boulot sur le premier fichier avant de traiter le deuxième
Mais pourquoi utiliser cet événement ? C'est plus simple d'avoir un fichier qui fait les traitements et qui demande à l'utilisateur quel fichier il veut (avec un GetOpenFilename au besoin) au fur et à mesure non ?
eric
Sans doute plus simple mais pas adapté à la demande :
En l'état, sans macro, mes collègues font cette tâche manuellement dès l'extraction du fichier depuis le logiciel, le nomme, le joigne à un mail à destination d'un client, puis le mette dans un dossier d'archive selon le nom de la Cie et l'année en-cours puis l'oublie.
Avec une méthode tel que GetOpenFilename
il faudrait qu'elles extraient tout leurs fichiers et qu'elles les enregistrent sans les formater et avec un nom différent pour ensuite retourner les chercher manuellement via le GetOpenFilename
sans en oublier un seul.
Donc bon, je préfère largement le formatage à l'ouverture.
Faut juste que je comprenne pourquoi l’événement ne se déclenche plus :/
Je ne comprend toujours pas.
Ils s'ouvrent tout seuls ?
Euh bah sur le logiciel on indique les critères (numéro Cie & numéro Police) et on appuie sur un bouton "extraction" et un fichier Excel s'ouvre automatiquement qu'il faut alors formater pour être prêt à l'envoi
Il s'ouvre dans une nouvelle session ou dans celle ouverte ?
Si c'est dans celle ouverte tu peux garder le fichier de traitement ouvert en réduit, et appeler ta macro de mise en forme par un raccourci clavier.
Tu la fais pour qu'elle traite le fichier actif après qq contrôles pour s'assurer du type de fichier.
Il faudra juste penser à l'ouvrir quand tu as ce type de traitement.
Tu peux aussi l'enregistrer en macro complémentaire *.xlam
Le fichier sera ouvert en même temps qu'excel et toujours dispo. Par contre raccourci clavier obligatoire, un xlam reste invisible.
A toi de voir
eric
Bonjour!
Il s'ouvre dans une nouvelle session ou dans celle ouverte ?
Il s'ouvre dans une nouvelle session
Si c'est dans celle ouverte tu peux garder le fichier de traitement ouvert en réduit, et appeler ta macro de mise en forme par un raccourci clavier.
Tu la fais pour qu'elle traite le fichier actif après qq contrôles pour s'assurer du type de fichier.
Il faudra juste penser à l'ouvrir quand tu as ce type de traitement.
Tu peux aussi l'enregistrer en macro complémentaire *.xlam
Le fichier sera ouvert en même temps qu'excel et toujours dispo. Par contre raccourci clavier obligatoire, un xlam reste invisible.
Ce sont des solutions qui sont à explorer en effet (surtout le raccourci clavier qui me plaît pas mal)
Je te remercie pour tes conseils! Je vais essayer de mettre tout sa en place et je reviens vers vous en cas de problème!
Cdt
Bonjour,
s'il s'ouvre dans une nouvelle session et que tu ne veux pas que les utilisateurs aient à ouvrir le fichier macro il faudra le mettre en xlam.
A ce moment là ne prévoit rien sur ses feuilles, elles seront inaccessibles.
eric