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

VBA FreeFile & l'instruction Open dans Excel — obtenir un numéro de fichier, ouvrir un fichier texte (pas un classeur)

|

VBA FreeFile & l'instruction Open dans Excel — obtenir un numéro de fichier, ouvrir un fichier texte (pas un classeur)

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éro n est une poignée à laquelle chaque Print #n et Close #n ultérieur se réfère — prenez-le de FreeFile, ne codez jamais #1 en dur. Deux fichiers avec #1 codé en dur lèvent l'error 55, For Output vide un fichier existant, et un canal que vous ne fermez jamais avec Close reste 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 — FreeFile vous remet un numéro de canal ; saisissez-le dans une variable
  • Pourquoi coder #1 en dur lève l'error 55 dè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 Open n'est pas Workbooks.Open
  • Pourquoi un canal que vous ne fermez jamais avec Close verrouille le fichier jusqu'à la fermeture d'Excel
  • Le motif de nettoyage On Error qui 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 existant For Output supprime 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 avec Dir.
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 durn = FreeFile une fois, puis utilisez #n partout. Un #1 littéral est une error 55 latente.
  • Connaissez votre modeFor Append fait grossir un fichier ; For Output le vide d'abord ; For Input a besoin que le fichier existe.
  • L'instruction n'est pas la méthodeOpen ouvre un canal texte ; Workbooks.Open ouvre un classeur.
  • Fermez toujours → placez Close #n dans un gestionnaire On Error pour 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