TL;DR — Lire un fichier texte offre trois outils.
Line Input #lit une ligne brute dans une chaîne (c'est vous qui la découpez).Input #analyse les champs délimités directement dans des variables (sûr seulement sur les fichiers queWrite #a produits).Input(LOF(f), #f)lit le fichier entier d'un coup. Bouclez avecDo Until EOF(f)— vérifiezEOFavant chaque lecture, sinon vous dépassez la fin et tombez sur l'error 62.
Dim n As Integer, line As String
n = FreeFile
Open "C:\data.txt" For Input As #n
Do Until EOF(n) ' verifie la fin AVANT de lire
Line Input #n, line ' une ligne brute dans une chaine
Debug.Print line
Loop
Close #n
Une fois un fichier ouvert sur un canal, le relire semble trivial — jusqu'à ce que
les colonnes ressortent brouillées ou que la boucle perde la dernière ligne. Les deux problèmes viennent du
choix du mauvais lecteur. VBA vous en donne trois, et ils ne sont pas interchangeables : l'un vous remet la
ligne brute, l'un tente de l'analyser à votre place, et l'un lit tout d'un coup. Le métier consiste à faire
correspondre le lecteur à la façon dont le fichier a été écrit — et à savoir que Input # et Write #
forment une paire assortie, tout comme Line Input # et Print #.
Ce que vous allez apprendre
- Le modèle mental — trois lecteurs, et choisir le mauvais brouille vos données
Line Input #— la ligne brute que vous découpez vous-même (le choix par défaut sûr)Input #— l'analyseur qui est le jumeau deWrite #(et s'étrangle sur un CSV ordinaire)- La boucle
Do Until EOF(), et le décalage d'un cran qui lève l'error 62 Input(LOF(f), #f)— lire tout le fichier dans une seule chaîne- Quand un CSV vaut mieux ouvert comme un classeur qu'analysé à la main
Le modèle mental : trois lecteurs, un seul convient à votre fichier
L'idée qui prévient la plupart des bugs de lecture : le lecteur doit correspondre à la façon dont le fichier a été écrit.
Line Input #lit une ligne comme une chaîne brute, saut de ligne retiré. Il n'analyse rien — c'est vous qui décidez comment la découper. Prévisible, et il ne se méprend jamais sur vos données.Input #lit une liste analysée de valeurs directement dans des variables, avec les mêmes règles de guillemets-et-virgules queWrite #écrit. C'est le jumeau exact deWrite #.Input(LOF(f), #f)(la fonction, pas l'instruction) lit le fichier entier dans une seule chaîne en un seul appel.
La règle d'appariement tombe donc immédiatement : un fichier écrit avec Write # se lit avec Input # ;
un fichier écrit avec Print # (ou par tout autre programme) se lit avec Line Input # et se découpe par
vous. Croisez les paires — donnez un CSV ordinaire à Input # — et les champs atterrissent dans les
mauvaises variables.
Line Input # : la ligne brute que vous découpez vous-même
Line Input # est le cheval de trait et le choix par défaut sûr. Il lit exactement une ligne dans une
chaîne, et ce que vous en faites ensuite ne dépend que de vous :
Dim parts() As String
Line Input #n, line
parts = Split(line, ",") ' c'est VOUS qui choisissez le delimiteur
Parce qu'il n'analyse jamais, il ne se trompe jamais. La seule chose à surveiller, c'est qu'un Split(line, ",") naïf découpe aussi les virgules situées à l'intérieur d'un champ protégé ("Rome, Italy" devient
deux parties). Si vos données ont des virgules protégées, soit analysez correctement les guillemets, soit —
généralement plus simple — laissez Excel s'en charger, décrit plus bas.
Input # : le jumeau de Write # (et pourquoi il ruine un CSV simple)
Input # lit des valeurs analysées directement dans des variables typées :
Dim name As String, city As String, age As Long
Input #n, name, city, age ' attend "Ann","Rome",42 (format Write #)
Sur un fichier que Write # a produit, c'est parfait et rapide — les guillemets indiquent à Input # où
chaque chaîne commence et s'arrête. Sur un CSV ordinaire (Ann,Rome,42), cela fonctionne généralement
encore, mais cela casse dès qu'un champ contient une virgule non protégée, une apostrophe ou un guillemet
égaré : les champs se décalent, un " ouvre une chaîne qui ne se referme jamais, et le reste de la ligne
atterrit dans les mauvaises variables. Voilà pourquoi Input # n'est sûr que sur les fichiers écrits par
Write #. Pour tout le reste, Line Input # plus votre propre découpage est le choix honnête.
La boucle EOF et le décalage d'un cran qui lève l'erreur 62
Vous ne savez pas combien de lignes un fichier contient, alors vous lisez jusqu'à la fin — et le test de
fin est là où vit le bug classique. Vérifiez EOF avant chaque lecture :
Do Until EOF(n) ' correct : tester, PUIS lire
Line Input #n, line
' ... traiter la ligne ...
Loop
La forme cassée lit d'abord et teste ensuite, si bien qu'elle tente une lecture au-delà de la dernière
ligne et lève l'error 62 Input past end of file :
Do While Not EOF(n)
' ... traiter ...
Line Input #n, line ' au dernier passage cela lit au-dela de la fin -> error 62
Loop
EOF(n) renvoie True une fois la dernière ligne lue. Placez le test EOF en tête de la boucle pour
qu'il se déclenche avant la lecture qui dépasserait. Ce seul ordonnancement corrige le bug « ma boucle perd
ou double la dernière ligne ».
Input(LOF(f), #f) : lire tout le fichier d'un coup
Quand vous voulez le fichier entier comme une seule chaîne — pour le fouiller, compter quelque chose ou le remettre à un analyseur — lisez-le en un seul appel :
Dim whole As String
whole = Input(LOF(n), #n) ' LOF(n) = longueur du fichier en octets
LOF renvoie la longueur du fichier, et Input(length, #n) lit ce nombre de caractères. C'est la façon la
plus rapide de charger un fichier de taille petite à moyenne, au prix de garder l'ensemble en mémoire — très
bien pour quelques mégaoctets, mais du gaspillage pour un journal géant que vous n'avez besoin de parcourir
que ligne par ligne. Pour cela, restez sur la boucle Line Input #.
Quand renoncer à l'analyse et ouvrir plutôt le classeur
Si le fichier est en réalité une feuille de calcul — un .csv que vous voulez sous forme de lignes et de
colonnes, avec les virgules protégées gérées correctement — analyser le texte à la main est la voie
difficile. Workbooks.Open lit un CSV dans une vraie feuille, gère les règles
de guillemets à votre place, et vous laisse lire Cells(r, c) directement :
Dim wb As Workbook
Set wb = Workbooks.Open("C:\data.csv") ' Excel analyse le CSV a votre place
Réservez les lecteurs texte intégrés au vrai travail texte — journaux, fichiers à largeur fixe,
configuration, ou allers-retours VBA-vers-VBA avec Write #/Input #. Pour des données tabulaires
destinées à des cellules, ouvrir le classeur est plus simple et plus correct. Notez que la lecture intégrée
est en ANSI, si bien qu'un fichier UTF-8 avec des caractères accentués exige ADODB.Stream ou le
FileSystemObject pour être lu correctement.
Le verdict honnête : Line Input par défaut, Input # seulement pour les fichiers Write
Trois lecteurs, et le choix n'est pas une affaire de vitesse — c'est une affaire de correspondance avec celui qui écrit :
Line Input #est le choix par défaut → il vous remet la ligne brute et ne se méprend jamais ; c'est vous qui la découpez, donc vous gardez la main.Input #seulement pour les fichiersWrite #→ c'est le jumeau deWrite #et il se brouille sur un CSV ordinaire avec des virgules non protégées ou des guillemets égarés.- Vérifiez
EOFen tête de la boucle → lire-puis-tester dépasse la dernière ligne et lève l'error 62. - Données tabulaires → ouvrez le classeur → laissez Excel gérer les guillemets du CSV au lieu de les analyser à la main.
Le signe le plus clair que vous avez choisi le mauvais lecteur, ce sont des colonnes qui atterrissent dans
les mauvaises variables. Quand cela arrive, vous avez donné à Input # un fichier qu'il n'a pas écrit ;
passez à Line Input # et découpez-le vous-même.
Comment ExcelMaster aide
Relire un fichier, c'est faire correspondre le lecteur à celui qui écrit — Input # pour les fichiers
Write #, Line Input # pour tout le reste — placer le test EOF avant la lecture pour ne pas perdre la
dernière ligne, et savoir quand ouvrir le CSV comme un classeur vaut mieux qu'analyser le texte à la main.
Cela fait beaucoup de jugement pour « lire un fichier ».
ExcelMaster écrit le lecteur qui
correspond à votre fichier. Décrivez la tâche — « importe ce journal dans une feuille », ou « lis chaque
ligne et extrais les lignes d'erreur » — et il produit la boucle Do Until EOF avec Line Input #, le bon
découpage, et un Close, ou ouvre le CSV comme un classeur quand c'est la voie la plus propre — ancré à
ThisWorkbook.Path. Vous décrivez les données dont vous avez besoin ; il écrit le
code qui lit chaque ligne exactement une fois.
Questions fréquentes
Comment lire un fichier texte ligne par ligne en VBA ?
Ouvrez-le For Input, puis bouclez avec Do Until EOF(n) et Line Input #n, line pour lire une ligne
brute à chaque passage, et Close #n quand vous avez terminé. Prenez le numéro de canal de
FreeFile. Placez le test EOF en tête de la boucle, avant la lecture, pour que
la boucle ne tente pas une lecture au-delà de la dernière ligne et ne lève pas l'error 62.
Quelle est la différence entre Line Input # et Input # en VBA ?
Line Input # lit une ligne brute dans une chaîne et vous laisse l'analyse, si bien qu'il ne se méprend
jamais sur vos données. Input # analyse les champs délimités directement dans des variables avec les
règles de guillemets-et-virgules que Write # écrit, si bien qu'il n'est fiable
que sur les fichiers que Write # a produits. Pour un CSV ordinaire, utilisez Line Input # et découpez la
ligne vous-même.
Pourquoi ma boucle de lecture VBA saute-t-elle ou double-t-elle la dernière ligne ?
Parce que le test EOF est au mauvais endroit. Si vous lisez d'abord et testez EOF ensuite, la boucle soit
dépasse la dernière ligne — en levant l'error 62 Input past end of file — soit la gère mal. Utilisez
Do Until EOF(n) en tête de la boucle pour que le test de fin de fichier s'exécute avant chaque
Line Input #.
Comment lire tout un fichier texte dans une seule chaîne en VBA ?
Utilisez la fonction Input avec LOF : whole = Input(LOF(n), #n) après avoir ouvert le fichier
For Input. LOF renvoie la longueur du fichier en octets et Input(length, #n) lit ce nombre de
caractères en un seul appel. C'est la façon la plus rapide de charger un fichier de taille petite à moyenne,
mais il garde le fichier entier en mémoire, alors utilisez la boucle Line Input # pour les très grands
fichiers.
Comment lire un fichier CSV en VBA ?
Si le CSV est constitué de données tabulaires destinées à des cellules, la façon correcte la plus simple est
Workbooks.Open, qui analyse les règles de guillemets et vous donne une vraie
feuille à lire avec Cells(r, c). Si vous devez analyser le texte directement, utilisez Line Input # et
découpez chaque ligne, en gérant vous-même les virgules protégées — et tournez-vous vers ADODB.Stream ou
le FileSystemObject si le fichier est en UTF-8, puisque la lecture
intégrée est en ANSI.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 25/08/2026.
Guides associés : VBA FreeFile & Open · VBA Print # vs Write # · VBA Open Workbook · VBA FileSystemObject · VBA Dir
