Fermer un document Excel une fois qu'il s'est ouvert

Bonjour,

j'utilise un code VBA qui me permet d'exécuter SAP, me connecter et ensuite lance un script enregistré sur sap pour extraire une base de donnée au format excel.

à la fin de l'export, j'ai donc une fenêtre excel qui s'ouvre et qui est enregistré à chaque fois sous le même nom dans le même dossier. Je souhaiterai que ce fichier se ferme automatiquement une fois que l'export est complété. (qu'il s'ouvre et qu'il se ferme tout de suite, ou après quelques secondes).

j'ai essayé avec application.wait now et pleins d'autres choses mais rien n'a faire... j'ai juste une ligne "workbooks ("...xlsx").close qui se met en erreur car évidemment lorsque je lance ma macro, le fichier n'est pas encore ouvert... (j'ai mis une apostrophe pour le moment).

Sub Export_articles_PRD()
Shell "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe", 4
Set wshshell = CreateObject("WScript.Shell")
Do Until wshshell.AppActivate("SAP Logon ")
    Application.Wait Now + TimeValue("0:00:01")
Loop
Set SapGui = GetObject("SAPGUI")
Set Appl = SapGui.GetScriptingEngine
Set Connection = Appl.Openconnection("PRD-ECC-Production", True)
Set session = Connection.Children(0)

    session.findById("wnd[0]/usr/txtRSYST-LANGU").Text = "FR"

Do Until wshshell.AppActivate("SAP Easy Access")
    Application.Wait Now + TimeValue("0:00:01")
Loop

Shell "wscript ""U:\9 Contrôle FM-SAP\SAP\Scripts export sap\Export_articles_PRD.vbs"""

'workbooks("03-Export articles PRD.xlsx").Close

End Sub

je vous met mon code actuel en copie et vous merci de votre aide !!!

Bonjour,

Essayez avec :

chemin = "C:\...\nomfichier.xlsx"

'appactivate "Microsoft Excel" 'si besoin <<< rendre cette ligne active car Excel n'est plus peut-être plus l'application active
activeworkbook.close savechanges:=true, filename:=chemin

Cdlt,

Bonjour 3GB

Merci pour votre réponse !!

j'ai une erreur car le fichier que je demande de fermer n'est pas encore ouvert. Le script d'export SAP ne l'a pas encore généré, je pense qu'il faut mettre un loop ou un wait jusqu'à ce que SAP ne soit plus activé par exemple. Car à la fin du script la session se ferme. C'est à dire, attendre que la session soit sap soit terminée (à ce moment là le fichier excel sera ouvert) et ensuite fermer le fichier.

Merci !!!

image

Ah oui, si le fichier n'existe pas encore, c'est pas facile de le fermer !

Ce sera difficile pour moi de vous aider en ce qui concerne SAP malheureusement... Comment ça marche habituellement ? Le fichier s'ouvre à la fermeture de la session ?

Alors ça se passe comme ça :

Sub Export_articles_PRD()
Shell "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe", 4
Set wshshell = CreateObject("WScript.Shell")
Do Until wshshell.AppActivate("SAP Logon ")
    Application.Wait Now + TimeValue("0:00:01")
Loop
Set SapGui = GetObject("SAPGUI")
Set Appl = SapGui.GetScriptingEngine
Set Connection = Appl.Openconnection("PRD-ECC-Production", True)
Set session = Connection.Children(0)

    session.findById("wnd[0]/usr/txtRSYST-LANGU").Text = "FR"

Do Until wshshell.AppActivate("SAP Easy Access")
    Application.Wait Now + TimeValue("0:00:01")
Loop

cette partie de code me permet simplement de me connecter à la session de sap,

Shell "wscript ""U:\9 Contrôle FM-SAP\SAP\Scripts export sap\Export_articles_PRD.vbs"""

et cette partie de code est le script éxecuté par SAP pour générer le fichier. il fait plusieurs manipulations et à un moment, sur la base de donnée sap, je fais extraire le tableau en format excel. à ce moment là après un moment de calcul mon fichier excel s'ouvre.

La session SAP se ferme via le script vbs, pas via vba. et donc à la fin de la procédure il me reste mon fichier excel fraichement généré et mon fichier excel dans lequel se situe le code vba (et dans lequel je traite les données extraites par cet export. je récupère les données via power query).

il faudrait quelque chose du genre

do until workbook filename = chemin is open

workbook.wait now + timevalue ("0:00:01")

loop

activeworkbok.close filename:=chemin

quelque chose qui ressemblerait à ça..

attendre jusqu'à ce que le fichier spécifié soit ouvert et le fermer d'une fois qu'il s'est ouvert

Oui, de mon côté, j'ai essayé avec workbooks.count (si le nombre de classeur = 2) mais apparemment, le classeur nouvellement créé n'est pas reconnu dans la collection.

J'ai essayé avec windows.count, idem...

Mais je pense qu'il faut examiner cette piste, en comptant les fenêtres... D'ailleurs, je me souviens d'un code de ce genre qu'il faudrait que je retrouve.

l'idéal serait de pouvoir dire "attend que le fichier spécifique soit actif, et une fois qu'il est actif, le fermer sans enregistrer" (car il a déjà été enregistré au préalable avec le script sap)

ce que j'ai peut-être pas précisé et qui peut avoir son importance, c'est que le fichier généré écrase à chaque fois un fichier déjà existant. même dossier, même nom. le but étant de mettre à jour la base de donnée pour un fichier de comparaison jour après jour

Bonjour,

qq chose comme ça, ça va ?

    Dim t As Single
    t = Timer
    Do
        DoEvents
    Loop Until (Timer - t) > 60 Or Workbooks(Workbooks.Count).Name = "03-Export articles PRD.xlsx"

comme j'ai prévu une tempo de sortie, teste éventuellement si ton fichier est bien apparu dans les temps.
eric

Bonjour eriiic,

super, c'est exactement ce qu'il me fallait !!! merci beaucoup ça fonctionne à merveille, dire que j'ai passé 2 jour à chercher la solution... merci !!! et bonne année à tous !!

Rebonjour Eriiic,

bon je pensais que si ça fonctionnait pour une macro ça fonctionnerait pour les autres aussi...

si j'utilise le même code pour d'autres fichiers qui n'ont pas le même nom, ça ne le trouve pas, vous avez une idée ?

t = Timer
Do
DoEvents
Loop Until (Timer - t) > 60 Or Workbooks(Workbooks.Count).Name = "04-Stock utilisation libre.xlsx"

Workbooks("04-Stock utilisation libre.xlsx").Close
ThisWorkbook.RefreshAll

dans ce code j'ai ("04-stock....xlsx") au lieux de ("03-Export.....xlsx")

Merci !

c'est tout bon, l'extension .xlsx n'est pas toujours en minuscule. du coup ça ne reconnaissait pas le fichier. j'ai mis l'extension dans la casse correspondante et mnt c'est bon

alors en plus joli (et maniable) :

Sub test()
    If Not fermer("03-Export articles PRD.xlsx", 60) Then MsgBox "y'a eu un os"
    Debug.Print fermer("04-Stock utilisation libre.xlsx", 15) ' sans message
End Sub

Function fermer(fich As String, tempo As Long) As Boolean
    ' ferme le dernier fichier ouvert s'il correspond
    Dim t As Single
    t = Timer
    Do
        DoEvents
        fermer = LCase(Workbooks(Workbooks.Count).Name) = LCase(fich)
    Loop Until fermer Or (Timer - t) > tempo
    If fermer Then Workbooks(fich).Close
End Function

j'ai ajouté pour ne pas tenir compte des MAJ/min
eric

je crois que je vais rester à votre première proposition haha elle fonctionne très bien pour moi. Maintenant à voir si ça va jouer pour mon collègue qui génère trois fichiers en même temps dans le même script, si on peut fermer en même temps les trois fichiers une fois que le dernier a été généré... je verrai lundi ;) en tout cas un tout grand merci pour votre aide très précieuse. j'ai trouvé des solutions à mes "problèmes" dans 90% des cas grâce à ce super forum !!! Merci !! =D

Ah non, ils seront fermés séquentiellement, dans l'ordre où la suppression a été demandée.
Cependant, si plusieurs sont demandés en parallèle et qu'un arrive avant son tour, il deviendra dernier tôt ou tard à la suppression des autres en cours, et sera supprimé sans attente à ce moment là.
Globalement on peut donc estimer le délai total à celui du plus long.

Rechercher des sujets similaires à "fermer document fois ouvert"