🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Close Workbook dans Excel — SaveChanges, l'invite qui bloque votre macro, et fermer sans enregistrer

|

VBA Close Workbook dans Excel — SaveChanges, l'invite qui bloque votre macro, et fermer sans enregistrer

TL;DRwb.Close sur un classeur comportant des modifications non enregistrées affiche la boîte de dialogue modale « Voulez-vous enregistrer les modifications ? » — ce qui fige une macro sans surveillance pour toujours. Répondez-y en code avec l'argument SaveChanges :

Sub CloseWithoutPrompt()
    Dim wb As Workbook
    Set wb = Workbooks.Open("C:\Reports\March.xlsx")
    ' ... lisez ce dont vous avez besoin ...
    wb.Close SaveChanges:=False    ' repondre a l'invite en code - aucune boite, aucun blocage
    Set wb = Nothing               ' la reference est morte apres Close
End Sub

La fermeture, c'est là qu'une macro par lots qui a tourné parfaitement toute la nuit est retrouvée le lendemain matin encore coincée sur une boîte de dialogue, après avoir traité un fichier sur deux cents. wb.Close ne se contente pas de fermer un classeur — il pose une question, et si vous n'y répondez pas en code, Excel la pose à l'utilisateur, et l'utilisateur n'est pas là. Ce guide repose sur cette seule idée : SaveChanges est votre réponse, et chaque bug de fermeture est une variante de l'oubli de la fournir.

Ce que vous allez apprendre

  • Le modèle mental — Close demande « enregistrer les modifications ? » ; l'argument SaveChanges est votre réponse en code
  • Le blocage numéro un — fermer un classeur modifié sans SaveChanges fige une macro sans surveillance
  • Le danger miroir — SaveChanges:=False abandonne en silence, alors décidez délibérément
  • Pourquoi la variable objet est morte à l'instant où vous fermez, et la lire provoque une erreur
  • wb.Close (un classeur) contre Application.Quit (tout Excel), et le piège de l'EXCEL.EXE invisible
  • Pourquoi la fermeture-avec-enregistrement hérite de chaque piège de Save

Le modèle mental : Close pose une question — répondez-y en code

Quand un classeur comporte des modifications non enregistrées, wb.Close ne peut pas simplement le fermer — Excel ne sait pas si vous voulez conserver ces modifications. Alors il fait ce qu'il fait pour un humain : il fait apparaître la boîte de dialogue « Voulez-vous enregistrer les modifications ? » et attend. C'est parfait quand une personne est assise là. Dans une macro, c'est vous qui devez répondre, et vous répondez avec l'argument SaveChanges :

wb.Close SaveChanges:=False    ' fermer et ABANDONNER les modifications non enregistrees
wb.Close SaveChanges:=True     ' ENREGISTRER d'abord, puis fermer
wb.Close                       ' aucune reponse - Excel demande a l'UTILISATEUR (l'invite)

Donnez la réponse en code et la boîte de dialogue n'apparaît jamais. Omettez-la sur un classeur modifié et vous revoilà face à l'invite.

Le blocage numéro un : pas de SaveChanges sur un classeur modifié

C'est l'échec derrière « ma macro planifiée n'a jamais fini ». La macro ouvre un fichier, modifie quelque chose — même un recalcul ou un gestionnaire Worksheet_Change marque le classeur comme modifié — et ensuite :

wb.Close      ' classeur modifie, pas de SaveChanges -> boite "enregistrer les modifications ?" -> bloque pour toujours

Il n'y a personne au clavier pour cliquer sur Oui ou Non, donc la macro reste plantée sur cette boîte de dialogue modale indéfiniment. Tout le lot cale derrière elle. Le correctif consiste à toujours passer SaveChanges sur tout Close susceptible de s'exécuter sans surveillance :

wb.Close SaveChanges:=False    ' traitement en lecture seule : abandonner, ne jamais demander

Si vous ne retenez qu'une ligne de cette page, que ce soit wb.Close SaveChanges:=False pour tout ce que vous ne faites que lire.

Le danger miroir : False abandonne en silence

SaveChanges:=False est le remède au blocage, et c'est aussi son propre piège. Il jette les modifications non enregistrées sans annulation possible et sans confirmation. Si la macro a réellement fait un travail que vous vouliez conserver, SaveChanges:=False le supprime en silence. Alors décidez à dessein :

  • Vous ne faites que lire le fichier ? wb.Close SaveChanges:=False — rien à conserver, ne jamais demander.
  • Vous avez écrit des résultats à conserver ? wb.Close SaveChanges:=True — ou wb.Save d'abord, puis wb.Close SaveChanges:=False, ce qui est plus clair car l'enregistrement et la fermeture sont des étapes distinctes et visibles.

L'invite existe pour empêcher un humain de perdre son travail. Quand vous la supprimez avec un argument, c'est vous qui endossez cette responsabilité.

La référence est morte après Close

Une fois que wb.Close s'est exécuté, le classeur a disparu de la mémoire et la variable wb ne pointe plus vers rien. Y toucher provoque une erreur :

wb.Close SaveChanges:=False
MsgBox wb.Name          ' ERREUR - wb ne refere plus a un classeur ouvert

Alors lisez tout ce dont vous avez besoin avant de fermer, et mettez la variable à Nothing ensuite pour rendre l'intention explicite :

Dim finalName As String
finalName = wb.Name              ' capturer AVANT de fermer
wb.Close SaveChanges:=False
Set wb = Nothing                 ' la reference est morte ; dites-le
MsgBox "Closed " & finalName

Fermer un classeur ou quitter Excel — et l'EXCEL.EXE invisible

wb.Close ferme un seul classeur. Application.Quit ferme Excel lui-même. Ils ne sont pas interchangeables, et deux cas limites mordent :

  • ThisWorkbook.Close ferme le classeur dont la macro s'exécute. Tout code après cette ligne risque de ne pas s'exécuter. Fermez les autres classeurs depuis une macro ; fermez le vôtre en dernier, ou pas du tout.
  • Fermer le dernier classeur peut laisser un EXCEL.EXE invisible en cours d'exécution. Si votre code détient encore une référence à un objet Application ou Workbook quand la dernière fenêtre se ferme, Excel ne peut pas s'arrêter complètement et subsiste comme un processus fantôme dans le Gestionnaire des tâches. Libérez vos références (Set wb = Nothing, Set xlApp = Nothing) pour que le processus puisse se terminer. C'est le bug classique derrière « Excel continue de tourner après la fin de ma macro ».

La fermeture-avec-enregistrement hérite de chaque piège de Save

wb.Close SaveChanges:=True exécute un Save en sortant — il hérite donc de chaque piège de VBA Save Workbook :

  • Sur un classeur jamais enregistré, la fermeture-avec-enregistrement n'a pas de chemin et se rabat sur la boîte de dialogue Enregistrer sous (bloque). Donnez-lui d'abord un chemin avec SaveAs, ou fermez avec SaveChanges:=False si vous n'avez pas besoin de le conserver.
  • Sur un classeur à macros enregistré avec le mauvais FileFormat, la fermeture-avec-enregistrement peut relever l'avertissement de suppression des macros. Si le code compte, le fichier est un .xlsm.

Dans le doute, séparez les étapes : wb.Save (ou wb.SaveAs path, format) sur sa propre ligne, puis wb.Close SaveChanges:=False. Deux opérations visibles valent mieux qu'une seule qui fait les deux en silence.

Le verdict honnête : le motif de la boucle par lots

Tout ce qui précède se résume à une seule forme fiable. Dans une boucle de dossier, ouvrez et fermez à l'intérieur de la boucle pour ne jamais accumuler des classeurs ouverts qui retiennent des verrous de fichier :

Dim name As String
name = Dir("C:\Reports\*.xlsx")
Do While name <> ""
    Dim wb As Workbook
    Set wb = Workbooks.Open("C:\Reports\" & name)
    ' ... lisez les totaux ...
    wb.Close SaveChanges:=False       ' repondre en code a chaque iteration
    Set wb = Nothing
    name = Dir                        ' fichier suivant
Loop

SaveChanges:=False est le choix par défaut pour un traitement en lecture seule ; SaveChanges:=True quand vous avez écrit des résultats. Ne comptez jamais sur l'invite, répondez-y toujours, lisez avant de fermer, et libérez la référence. Faites cela et l'étape de fermeture — celle qui fait discrètement caler les tâches sans surveillance — devient la fin ennuyeuse et fiable de chaque fichier que vous ouvrez.

Comment ExcelMaster aide

L'étape de la fermeture est trompeusement dangereuse : oubliez SaveChanges et une macro planifiée se bloque sur une boîte de dialogue ; passez False alors que vous vouliez True et le travail terminé s'évanouit ; conservez une référence traînante et Excel subsiste comme un processus fantôme. Ce sont les bugs qui n'apparaissent qu'à 3 h du matin, quand personne ne regarde.

ExcelMaster écrit la fermeture comme le ferait un ingénieur d'automatisation soigneux. Décrivez la tâche — « traite chaque fichier de ce dossier et ferme-les tous sans enregistrer » — et il ouvre avec Set wb = Workbooks.Open(...), lit ce dont il a besoin avant de fermer, passe un SaveChanges explicite sur chaque wb.Close, libère la référence avec Set wb = Nothing, et ne laisse jamais un classeur ouvert ni un processus Excel fantôme. Aucun blocage, aucune perte de données silencieuse.

Questions fréquentes

Comment fermer un classeur sans enregistrer en VBA ?

Passez SaveChanges:=False : wb.Close SaveChanges:=False. Cela répond à l'invite « enregistrer les modifications ? » en code par « non », si bien que la boîte de dialogue n'apparaît jamais et que le classeur se ferme en abandonnant toute modification non enregistrée. C'est la bonne fermeture pour un traitement en lecture seule où il n'y a rien à conserver.

Pourquoi ma macro se bloque-t-elle quand elle ferme un classeur ?

Parce que vous avez appelé wb.Close sur un classeur comportant des modifications non enregistrées sans argument SaveChanges. Excel affiche la boîte de dialogue modale « Voulez-vous enregistrer les modifications ? » et attend un clic qui ne vient jamais dans une exécution sans surveillance. Passez toujours SaveChanges:=False ou SaveChanges:=True sur toute fermeture qui s'exécute sans personne pour regarder.

Quelle est la différence entre wb.Close et Application.Quit ?

wb.Close ferme un seul classeur et laisse Excel en cours d'exécution. Application.Quit ferme Excel entièrement, y compris tous les classeurs ouverts. Utilisez Close pour en finir avec un fichier dans une boucle ; n'utilisez Quit que lorsque votre code a lancé sa propre instance d'Excel et doit l'arrêter.

Pourquoi Excel continue-t-il de tourner après que ma macro VBA a fermé le classeur ?

Votre code détient encore une référence à un objet Workbook ou Application, donc Excel ne peut pas s'arrêter complètement et subsiste comme un processus EXCEL.EXE invisible. Libérez les références — Set wb = Nothing et Set xlApp = Nothing — après la fermeture, pour que le processus puisse se terminer proprement.

Puis-je lire les propriétés d'un classeur après l'avoir fermé en VBA ?

Non. Une fois que wb.Close s'est exécuté, le classeur est hors mémoire et la variable ne référence plus rien ; wb.Name ou wb.Sheets provoqueront une erreur. Capturez tout ce dont vous avez besoin dans des variables avant d'appeler Close, puis Set wb = Nothing.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 20/08/2026.

Guides associés : VBA Open Workbook · VBA Save Workbook · VBA Workbook_BeforeClose Event · VBA DisplayAlerts · VBA DoEvents