TL;DR — Pour lire ou écrire un fichier texte avec le VBA intégré, vous ouvrez un canal numéroté :
Open path For Output As #n. Le numéronest une poignée à laquelle chaquePrint #netClose #nultérieur se réfère — prenez-le deFreeFile, ne codez jamais#1en dur. Deux fichiers avec#1codé en dur lèvent l'error 55,For Outputvide un fichier existant, et un canal que vous ne fermez jamais avecClosereste verrouillé jusqu'à la fermeture d'Excel.
Sub WriteReport()
Dim n As Integer
n = FreeFile ' recupere le prochain numero de canal libre
Open "C:\Reports\out.txt" For Output As #n
Print #n, "Hello" ' chaque ecriture se refere a ce numero
Close #n ' libere toujours le canal
End Sub
Atteindre un fichier texte en VBA ne commence pas par le texte — cela commence par un numéro.
L'instruction Open rattache votre fichier à un canal, et à partir de là, chaque écriture, lecture et
fermeture nomme le canal par son numéro, pas par son chemin. FreeFile existe pour vous remettre un
numéro qu'il est sûr d'utiliser. Saisissez bien cette seule idée et toute l'API de fichiers intégrée
cesse d'être capricieuse ; ratez-la — en choisissant le numéro vous-même — et vous avez écrit un bug qui
ne se manifeste qu'une fois un second fichier ouvert.
Ce que vous allez apprendre
- Le modèle mental —
FreeFilevous remet un numéro de canal ; saisissez-le dans une variable - Pourquoi coder
#1en dur lève l'error 55dès que deux fichiers sont ouverts - Les trois modes —
For Output(vide),For Append(ajoute),For Input(lit) — et lequel efface silencieusement les données - Pourquoi l'instruction
Openn'est pasWorkbooks.Open - Pourquoi un canal que vous ne fermez jamais avec
Closeverrouille le fichier jusqu'à la fermeture d'Excel - Le motif de nettoyage
On Errorqui libère toujours le canal
Le modèle mental : FreeFile vous remet un numéro de canal
L'idée clé, c'est que l'E/S de fichiers intégrée fonctionne à travers un canal, et ce canal est
identifié par un petit entier. Open ... As #n lie votre fichier au numéro n ; ensuite, Print #n,
Input #n et Close #n parlent tous à ce fichier par son numéro. Le chemin apparaît exactement une
fois — dans le Open.
FreeFile renvoie le prochain numéro de canal qui n'est pas actuellement utilisé. La règle qui piège
tout le monde : stockez-le avant d'ouvrir. Tant qu'un fichier n'est pas réellement ouvert sur ce
numéro, FreeFile continue de renvoyer la même valeur, alors vous devez le capturer une fois et
réutiliser la variable :
Dim n As Integer
n = FreeFile ' capturez-le UNE SEULE FOIS
Open "C:\data.txt" For Output As #n
' ... utiliser #n ...
Close #n
Voyez FreeFile comme « donne-moi un canal libre » et n comme le ticket. Vous ne colleriez jamais deux
clients sur le même numéro de ticket ; FreeFile est la façon d'éviter de faire cela avec des fichiers.
Pourquoi coder #1 en dur lève l'erreur 55
Le raccourci quotidien — Open path For Output As #1 — fonctionne parfaitement dans une démo, parce
qu'un seul fichier est jamais ouvert. Il devient un bug à l'instant où une routine ouvre un second fichier
(ou appelle une autre routine qui le fait) alors que #1 est encore ouvert :
Open "a.txt" For Output As #1
Open "b.txt" For Output As #1 ' error 55 - "File already open"
L'error 55 signifie « ce numéro de canal est déjà utilisé ». Des macros imbriquées, un logger qui écrit
pendant que votre routine principale a son propre fichier ouvert, une boucle qui oublie de fermer — tous
entrent en collision sur le numéro codé en dur. FreeFile supprime toute cette catégorie de bug parce
qu'il ne remet jamais un numéro déjà pris :
Dim nA As Integer, nB As Integer
nA = FreeFile: Open "a.txt" For Output As #nA
nB = FreeFile: Open "b.txt" For Output As #nB ' un numero different et libre
À l'instant où vous tapez un #1 littéral, vous avez décidé le numéro de canal à la main — ce qui est
exactement la décision que FreeFile a été conçu pour prendre à votre place.
Les trois modes : Output vide, Append ajoute, Input lit
Open ... For <mode> prend l'un de trois modes pour du texte séquentiel, et choisir le mauvais est la
façon la plus courante de perdre des données :
For Output— crée le fichier s'il est absent, et le vide s'il existe déjà. Ouvrir un fichier existantFor Outputsupprime son contenu avant que vous n'écriviez une seule ligne. C'est le grand classique « mon fichier journal se vide sans cesse ».For Append— crée le fichier s'il est absent, sinon ajoute à la fin. C'est ce que vous voulez pour un journal qui s'accumule.For Input— ouvre un fichier existant en lecture ; un fichier absent lève l'error 53 File not found, alors protégez d'abord avecDir.
Open logPath For Append As #n ' conserve l'historique
Open logPath For Output As #n ' MEME fichier - efface d'abord l'historique
Les deux modes d'écriture se ressemblent presque à l'identique et font des choses opposées à un fichier
existant. Si un fichier doit grossir avec le temps, c'est toujours For Append ; For Output est réservé
à un fichier que vous comptez réécrire de zéro à chaque exécution.
L'instruction Open n'est pas Workbooks.Open
Open est une instruction qui rattache un fichier texte à un numéro de canal. Elle n'a rien à voir
avec le chargement d'une feuille de calcul. Ouvrir un .xlsx avec Open ... For Input vous donne les
octets bruts d'un conteneur zip, pas un classeur dont vous pouvez lire les cellules :
Open "Book.xlsx" For Input As #n ' octets bruts - PAS un classeur utilisable
Pour charger un vrai classeur, vous utilisez la méthode Workbooks.Open,
qui renvoie un objet Workbook avec des feuilles et des cellules. La collision de noms est une source
fréquente de confusion : Open (l'instruction) est pour les canaux texte ; Workbooks.Open (la
méthode) est pour les classeurs. Si votre fichier est un .csv que vous voulez sous forme de lignes
et de colonnes, l'ouvrir comme un classeur est généralement plus simple que d'analyser le texte vous-même.
Pourquoi un canal non fermé verrouille le fichier
Chaque Open doit être associé à un Close. Un canal que vous ne fermez jamais garde le fichier
verrouillé — vous ne pouvez pas le rouvrir, le supprimer avec Kill, ni
l'ouvrir dans Excel — jusqu'à ce que le classeur ou Excel lui-même se ferme. Le piège, c'est une erreur
entre Open et Close : l'erreur saute par-dessus votre ligne Close, et le canal fuit.
La forme robuste place le Close dans un gestionnaire d'erreurs afin qu'il s'exécute que l'écriture
réussisse ou échoue :
Sub SafeWrite(ByVal path As String, ByVal text As String)
Dim n As Integer
n = FreeFile
On Error GoTo Cleanup
Open path For Output As #n
Print #n, text
Cleanup:
Close #n ' s'execute en cas de succes ET d'erreur
End Sub
Close #n libère un seul canal ; un Close nu sans numéro ferme tous les fichiers ouverts d'un
coup, ce qui est un ultime recours utile mais grossier. Voyez On Error pour le
motif complet du nettoyage garanti.
Le verdict honnête : FreeFile, une variable, et un Close garanti
L'API intégrée Open/Close est rapide et sans dépendance — elle vous demande juste de respecter le
canal. Quatre règles en font le tour :
- Ne codez jamais le numéro en dur →
n = FreeFileune fois, puis utilisez#npartout. Un#1littéral est uneerror 55latente. - Connaissez votre mode →
For Appendfait grossir un fichier ;For Outputle vide d'abord ;For Inputa besoin que le fichier existe. - L'instruction n'est pas la méthode →
Openouvre un canal texte ;Workbooks.Openouvre un classeur. - Fermez toujours → placez
Close #ndans un gestionnaireOn Errorpour qu'un échec en cours d'écriture ne puisse pas laisser le fichier verrouillé.
L'unique habitude qui prévient la plupart des bugs de fichier est la première ligne de chaque routine :
n = FreeFile. Choisissez le numéro à la main et vous avez choisi la seule chose que VBA était prêt à
choisir correctement pour vous.
Comment ExcelMaster aide
Écrire un fichier texte en toute sécurité, c'est prendre le numéro de canal de FreeFile au lieu de coder
#1 en dur, choisir For Append plutôt que For Output quand l'historique doit survivre, et garantir un
Close même quand une écriture échoue — trois détails autour d'une instruction qui semble ne devoir
qu'ouvrir un fichier.
ExcelMaster écrit la routine de
gestion de fichier qui ne fuit ni n'efface. Décrivez la tâche — « ajoute chaque exécution à un journal à
côté du classeur », ou « exporte cette plage vers un fichier texte » — et il produit la capture de
FreeFile, le bon mode, et le Close garanti, ancré à ThisWorkbook.Path. Vous
décrivez le fichier que vous voulez ; il écrit le code qui ouvre correctement le canal et le libère
toujours.
Questions fréquentes
Que fait FreeFile en VBA ?
FreeFile renvoie le prochain numéro de canal de fichier qui n'est pas actuellement utilisé, si bien que
vous pouvez ouvrir un fichier sans deviner un numéro. Capturez-le dans une variable avant d'ouvrir le
fichier — n = FreeFile: Open path For Output As #n — car FreeFile continue de renvoyer la même valeur
tant qu'un fichier n'est pas réellement ouvert sur ce numéro. Utiliser FreeFile au lieu d'un #1 codé
en dur évite l'error 55 File already open quand plus d'un fichier est ouvert à la fois.
Comment ouvrir un fichier texte en VBA ?
Utilisez l'instruction Open avec un mode et un numéro de canal : Open "C:\data.txt" For Input As #n,
où n = FreeFile. Utilisez For Output pour créer ou écraser, For Append pour ajouter à la fin, et
For Input pour lire. Associez-la toujours à Close #n quand vous avez terminé. Notez que cela ouvre un
canal texte ; pour charger une feuille de calcul, utilisez plutôt
Workbooks.Open.
Pourquoi VBA donne-t-il l'erreur 55 File already open ?
Parce que le numéro de canal que vous avez passé à Open est déjà utilisé — presque toujours parce que le
code code #1 en dur et qu'un second Open le réutilise avant que le premier ne soit fermé. Remplacez
chaque numéro littéral par n = FreeFile capturé dans sa propre variable, et fermez chaque canal avec
Close #n dès que vous avez fini, afin que les numéros ne soient jamais réservés deux fois.
For Output supprime-t-il le fichier existant en VBA ?
Oui. Ouvrir un fichier existant For Output le vide avant que vous n'écriviez quoi que ce soit — son
ancien contenu est perdu. Si vous voulez conserver le contenu précédent et y ajouter, ouvrez plutôt le
fichier For Append. For Output est réservé aux fichiers que vous comptez réécrire de zéro à chaque
exécution.
Que se passe-t-il si je ne ferme pas un fichier en VBA ?
Le fichier reste verrouillé sur son canal — vous ne pouvez pas le rouvrir, le supprimer avec
Kill, ni l'ouvrir dans Excel — jusqu'à ce que le classeur ou Excel se ferme.
Pour éviter une fuite quand une erreur interrompt une écriture, placez Close #n dans une section de
nettoyage On Error afin qu'il s'exécute que l'écriture réussisse ou échoue.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 25/08/2026.
Guides associés : VBA Print # vs Write # · VBA Read Text File · VBA Open Workbook · VBA FileSystemObject · VBA On Error
