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

VBA Read Text File dans Excel — Line Input vs Input #, et la boucle EOF qui ne perd aucune ligne

|

VBA Read Text File dans Excel — Line Input vs Input #, et la boucle EOF qui ne perd aucune ligne

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 que Write # a produits). Input(LOF(f), #f) lit le fichier entier d'un coup. Bouclez avec Do Until EOF(f) — vérifiez EOF avant 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 de Write # (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 que Write # écrit. C'est le jumeau exact de Write #.
  • 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 fichiers Write # → c'est le jumeau de Write # et il se brouille sur un CSV ordinaire avec des virgules non protégées ou des guillemets égarés.
  • Vérifiez EOF en 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