Après la fonction permettant de charger le contenu d'un fichier texte en VBA, voici le code VBA qui vous permettra de lire un fichier texte ligne par ligne.
Il suffit d'indiquer le chemin complet (chemin & nom) du fichier texte qui doit être traité et le code effectuera une itération (Loop
) dans le contenu du fichier en vous laissant facilement accéder à chaque ligne séparément. Ce code VBA est prêt à l'emploi – il suffit de le copier / coller dans votre Projet VBA et vous n'aurez qu'à ajouter votre code à exécuter pour chaque ligne (comptage, vérifications, copie des lignes spécifiques,…).
Ceci peut être très utile par exemple dans le cas où vous avez un fichier de données (.csv) et vous voulez travailler seulement avec certaines lignes. Le code VBA que je vous propose peut, entre autre, servir de base pour trier les données avant de les copier vers une Feuille Excel ou même avant d'en créer un nouveau fichier texte…
Lire et traiter un fichier texte ligne par ligne en VBA
Le code suivant est assez explicite et peut facilement être transformé en une fonction. Votre code VBA pour gérer les lignes doit être placé à l'endroit indiqué dans les commentaires (lignes: 18-19).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Sub LireFichierTexteParLigne() 'par: https://excel-malin.com Application.ScreenUpdating = False On Error GoTo CodeErreur Dim IndexFichier As Integer Dim MonFichier As String Dim ContenuLigne As String MonFichier = "C:\MonDossier\MonFichier.txt" '<-- mettez ici le nom du fichier à lire IndexFichier = FreeFile() Open MonFichier For Input As #IndexFichier 'ouvre le fichier While Not EOF(IndexFichier) Line Input #IndexFichier, ContenuLigne ' lecture du fichier ligne par ligne: la variable "ContenuLigne" contient le contenu de la ligne active 'ajoutez ici votre code à appliquer pour chaque ligne '... Wend Close #IndexFichier ' ferme le fichier Application.ScreenUpdating = True Exit Sub CodeErreur: MsgBox "Une erreur s'est produite..." Application.ScreenUpdating = True End Sub |
Comme c'est indiqué dans les commentaires dans le code, le texte de la ligne se trouve dans la variable ContenuLigne
. C'est donc avec cette variable que vous devez travailler pour récupérer le texte de la manière que vous souhaitez.
Si vous voulez par exemple d'ajouter certaines lignes sur une Feuille du Classeur, je vous conseille d'utiliser un compteur qui vous facilitera l'ajout des lignes dans la Feuille.
EXEMPLE: Si vous souhaitez extraire toutes les lignes plus longues que 10 caractères du fichier "D:\TEST\test.txt" et les ajouter sur la Feuille "Resultat", vous pouvez le faire de manière suivante:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
Sub LireFichierTexteParLigne_Exemple() 'par: https://excel-malin.com Application.ScreenUpdating = False On Error GoTo CodeErreur Dim IndexFichier As Integer Dim MonFichier As String Dim ContenuLigne As String Dim i As Single MonFichier = "D:\TEST\test.txt" i = 0 IndexFichier = FreeFile() Open MonFichier For Input As #IndexFichier 'ouvre le fichier While Not EOF(IndexFichier) Line Input #IndexFichier, ContenuLigne If Len(ContenuLigne) > 10 Then i = i + 1 ThisWorkbook.Sheets("Resultat").Cells(i, 1).Value = ContenuLigne Else End If Wend Close #IndexFichier ' ferme le fichier MsgBox "Terminé..." Application.ScreenUpdating = True Exit Sub CodeErreur: MsgBox "Une erreur s'est produite..." Application.ScreenUpdating = True End Sub |
Remarques pratiques sur la lecture des fichiers texte en VBA
Voici quelques remarques concernant l'utilisation de ce code:
- Le "fichier texte", ne veut pas nécessairement dire un fichier avec suffixe
.TXT
. Il s'agit de tout fichier dont le contenu a la forme du texte lisible. Il peut donc s'agir des fichiers de données (comme per exemple.CSV
), des pages web (.PHP
ou.HTML
), des fichiers journaux (.LOG
ou autre) ou encore des fichiersXML
… - Pour éviter des erreurs lors de l'exécution de ce code, il peut être utile d'y ajouter la vérification si le fichier texte en question existe. Vous pouvez consulter ce tutoriel: VBA: Vérifier si le fichier existe
- Ce code utilise le mode
For Input
pour accéder au contenu du fichier (plus sur la page Microsoft dédiée à ce sujet). Cela a deux avantages:- vous pouvez lire le contenu même d'un fichier qui est déjà ouvert (par vous ou par un autre utilisateur)
- vous ne bloquez pas le fichier aux autres applications et / ou utilisateurs. Vous pouvez donc lire par exemple un fichier log sans craindre de le bloquer. Il peut continuer à être utilisé malgré que vous le lisiez…
Plus sur la gestion des textes en VBA
Voici quelques autres articles sur Excel-Malin.com qui concernent le travail avec des données textuelles qui pourraient vous être utiles:
- VBA: Sauvegarder un texte dans un fichier
- Extraire une chaîne de caractères délimitée
- Comment vérifier si une chaîne de caractères représente un nombre?
- Fonction VBA InStr() – vérifier la présence d'un texte dans un autre et de sa position
Pour aller plus loin en VBA
Et pour finir, quelques autres articles pratiques pour votre travail en VBA…
- Liste de toutes les fonctions disponibles en VBA
- Utiliser RECHERCHEV en VBA directement – c'est simple et bien plus rapide qu'une boucle!
- Calculer une SOMME en VBA
- Protéger son code VBA
- Visibilité des Feuilles d'un Classeur Excel
9 commentaires sur “VBA: lire un fichier texte ligne par ligne”
attention il manque un exit sub mais sinon très bien
Bonjour Adrien,
merci pour votre remarque! C'est corrigé!
Bien à vous, Martin
Bonjour,
Un grand merci pour ce code! Assez bizarrement, le contenu de mon fichier texte initial contenait toujours un saut de ligne supplémentaire, avec une ligne vide, ce qui me faisait repasser une nouvelle fois dans la boucle. Le fichier était écrit via le presse-papier, bizarre.
J'ai finalement résolu cela avec le code suivant: If (ContenuLigne "") Then…
Encore merci!
Bonjour,
J'ai voulu utiliser cette fonction sur un fichier et il s'avère que j'ai un soucis au niveau du ligne par ligne. Pas cohérent avec les données à l'ouverture du fichier sur excel.
Il me donne une valeur :
a b c d
Sur excel et wordpad j'ai :
a
b
c
d
Mais si j'ouvre avec le bloc j'ai :
a b c d
Le problème vient il de mon fichier ou bien d'une option de cette fonction ?
En vous remerciant par avance.
Cordialement,
Jérémy
Bonjour Jérémy,
il faudrait voir quel caractère se trouve entre les lettres.
Normalement, le plus correct ce que vous pouvez voir, c'est dans le Notepad – il ne fait aucune "interprétation" du contenu et il l'affiche tel qu'il est exactement.
Excel & Wordpad travaillent avec des formats et peuvent afficher le fichier "comme le plus correct leur semble" (peut-être c'est un caractère entre les lettres que Excel/Wordpad considère comme un retour à la ligne).
Ma fonction travaille sur le même principe que le Notepad donc il est normal qu'elle affiche la même chose que ce que vous voyez en Notepad.
Pour en avoir le cœur net, vous pouvez essayer d'ouvrir votre fichier dans un autre éditeur de texte pur (par exemple le Notepad++ qui est gratuit).
Ou bien j'ai une autre idée. Changez le suffixe de votre fichier (.txt ou celui que vous utilisez) en ".html". Ensuite, ouvrez le fichier en double-cliquant dessus dans l'Explorateur de fichiers. Il va l'ouvrir dans le navigateur internet (Firefox, Chrome,…) et vous verrez ce qu'il affiche comme contenu…
J'espère vous avoir aidé. Cordialement, Martin
Bonjour,
Merci pour votre réponse et en effet je pense que vous m'avez bien aidé, je m'explique :
Après avoir parcourus les milliers de lignes et fais de nombreux tests, j'ai trouvé la réponse (enfin je crois) en répondant a votre message il m'est venu une idée. En tapant le code suivant, j'arrive à avoir mais ligne indifféremment les une des autres comme dans WordPad.
Open Fichier For Input As #1
Input #1, Test
SplitTest = Split(Test, vbLf)
Close #1
Il y a un caractère que je pourrais qualifier d'invisible dans le bloc note qui correspond à un vbLf (saut de ligne).
Du coup, peut-on lire un fichier avec open en fonction de ce "vbLf" ? un peu comme du séquentiel.
En vous remerciant encore pour votre aide.
Cordialement, Jérémy
Bonjour,
Je reviens vers vous car j'ai solutionné (contourné ? :D) mon problème. Cependant, et comme à chaque fois d'ailleurs, j'en rencontre un nouveau (en même temps on attends que cela pour s'amuser un peu non ?).
Lorsque je lance une boucle jusqu'a la fin de fichier (type "While Not EOF"), il rencontre ce caractère "→" (qui donne ceci sur cette page "") et la boucle s'arrête considérant que c'est la fin de fichier malgré les milliers de lignes qu'il reste.
Je suis arriver au bout de mes connaissances d'autodidacte la…
Pourriez-vous m'aider ?
Cordialement,
Jérémy
Merci pour le partage !
Super, je viens de tomber sur votre code, et ça marche du premier coup. Merci