[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

Rechercher des sujets similaires à "vba bricolage fermer ouvrir classeur actif"