VBA - Import fichier texte

Bonjour,

Je suis actuellement un exercice VBA pour importer des fichiers textes. Je rencontre un soucis quant à la détection des lignes.

En effet, après avoir repris plusieurs fois la procédure indiqué je m'aperçois que chaque fichier texte ilmporté dans la feuille "Import" est importé sur une ligne entière dans celle-ci.

Dans le code on se sert de la position du ";" déterminée par la fonction InStr et dès que celle-ci est égale à 0 cela doit signifier que l'on se trouve à la fin de la ligne.

Mais comme on peut le voir dans le fichier texte si les points-virgules il y en aura de détecté jusqu'à la fin de la variable texte. Visuellement il n'y en a plus sur la ligne mais si je demande de regarder ce que j'ai chargé dans la variable texte, le seul moment où InStr va indique "0" comme position pour le ";" c'est à la fin du fichier..

Ce que je ne comprends pas c'est que dans la video de la formation tout fonctionne correctement une fois qu'on teste le code via F5. Et j'ai recopié le code à l'identique ligne pour ligne ....

Je me dis que j'ai du faire une erreur ou un oubli sur un détail quelque part ... mais je vois pas du tout où ....

Je vous joins le fichier avec un fichier texte utillisé pour l'import

j'y ai passé 3 4 heures hier et pareil ce matin, je ne vois vraiment pas ....

28clients-facturation2.txt (294.00 Octets)

Je viens d'avoir la preuve qu'il y a un soucis avec le LINE INPUT

celui-ci ne charge pas une ligne du fichier mais tout son contenu dans la variable texte

capture d ecran 2021 01 30 143448

Bonjour,

line input lit une ligne qui est terminée par les caractères CR et LF (carriage return et line feed) (format windows)

ton fichier est au format unix et chaque ligne est terminée par LF uniquement (format unix). VBA ne détecte pas ce caractère unique comme une fin de ligne.

il faut soit adapter le fichier, soit adapter ta macro.

Bonjour H2so4

Merci pour ta réponse. D'accord d'où la fin de ligne non repérée...

Et saurais-tu me dire comment effectuer ces deux procédures? J'imagine que change le format du fichier ça doit se trouver sur moteur de recherche mais adapter le code VBA ça vraiment ... Et en plus ça s'avérera utile de le savoir !

En te remerciant,

Pour le fichier je viens tout simplement de faire un copier/coller du contenu dans un nouveau fichier texte.

Je suis curieux de savoir si je peux éditer le type de séparateur de ligne depuis mon système afin de l'optimiser pour un autre système.

Et bien sûr comment adapter mon code pour soit, lui permettre de détecter le retour ligne si c'est du LF, ou bien, lui permettre de corriger le texte avec les types retour ligne transformer en CR..

Bonjour

Comment tu lances la macro lecture?

ci joint ma solution

A+ François

bonjour,

pour modifier le/les caractères de fin de ligne, tu peux faire cela via Notepad++, il y a une option de gestion de la fin de ligne.

tu peux aussi utiliser les possibilités offertes en standard par excel (import fichier texte, powerquery, ...)

sinon une proposition de modification de ton code pour gérer des fichiers avec CRLF ou LF

Private Sub lecture(fichier As String)
    Dim depart As Integer, position As Integer
    Dim texte As String, tampon As String, lignefichier as String, tabtexte

    Open fichier For Input As #1
    Do While Not EOF(1)
        Line Input #1, lignefichier
        tabtexte = Split(lignefichier, vbLf)
        For i = LBound(tabtexte) To UBound(tabtexte)
            texte = tabtexte(i)
            depart = 1: position = 1

            Do While (position <> 0)
                position = InStr(depart, texte, ";", 1)
                If position = 0 Then
                    tampon = Mid(texte, depart)
                    Sheets("Import").Cells(ligne_enCours, colonne_enCours).Value = tampon
                    Exit Do
                Else
                    tampon = Mid(texte, depart, position - depart)
                End If

                Sheets("Import").Cells(ligne_enCours, colonne_enCours).Value = tampon
                depart = position + 1
                colonne_enCours = colonne_enCours + 1
            Loop

            colonne_enCours = colonne_debut
            ligne_enCours = ligne_enCours + 1
        Next i
    Loop
    Close #1

End Sub

Salut h2so4

le problème c'est

1 la macro lecture n'était pas lu

2 ligne_encours et colonne_encours ne sont pas affecté

A+ François

bonjour,

@fanfan38, sorry je n'ai pas vu ton message, je répondais à SHTOUR

Bonsoir Fanfan38, H2so4,

Merci à vous !

@Fanfan38 : La procédure lecture se lance à partir de la procédure exporter, tout comme traitement et écriture. Dans l'exercice il a été choisit de fluidifier la présentation de exporter.

Par contre j'ai vu que tu les avais supprimé du coup, peut être pour ça que je n'ai pas réussi à me servir de ta proposition. Je vais m'y pencher un peu plus longuement demain. ;)

@H2so4 : Merci à toi ça fonctionne nickel ;) . Petite question; Pourquoi as tu invoqué une variable différente de texte pour le Line Input?

D'ailleurs je suis assez étonné car elle n'est pas déclaré mais ça ne créé pas d'erreur ??? tout comme tabtexte. Leur utilisation permet un affranchissement de déclaration et dimensionnement ?

Merci beaucoup :)

Bonsoir,

Variables pas définies : une paresse de ma part. J'ai adapté le code pour ajouter leur définition. Il n'y a pas de message d'erreur si tu n'as indiqué qu'il fallait en générer pour des variables non définies (option explicit à mettre en début de module).

Variable différente : ton code de découpe de ligne fonctionne avec la variable texte. Je ne voulais pas toucher à cette partie du code.

j'ai ajouté une nouvelle variable pour lire une ligne du fichier texte (qui peut selon la nature du fichier être un fichier dont les lignes se terminent par CRLF ou LF tout cours.

si c'est LF, il faut découper la ligne lue en autant de lignes qu'il y a de LF (c'est le but de l'instruction split, qui charge ces lignes dans un tableau VBA)

on exploite ensuite chacune des lignes de ce tableau VBA en les mettant dans ta variable texte et en déroulant la suite de ton code

si c'est CRLF, la ligne lue est une ligne qui ne contiendra pas de LF. Le tableau VBA contiendra une seule ligne et sera exploité de la même manière qu'un tableau contenant plusieurs lignes.

Bonjour,

Merci pour ton retour.

C'est curieux car les variables texte et tampon, elles, semblent devoir être déclarées car, lorsque je supprime leur déclaration et typage je reçois un message d'erreur de VBA.

Pourtant "tampon" apparaît un peu de la même manière que "tabtexte" par exemple

tampon = Mid(texte, depart)

tabtexte = Split(lignefichier & vbLf, vbLf)

bonjour,

Je n'ai pas de problème avec ce code (sans déclaration de variables). Si une variable n'est pas déclarée elle est par défaut de type variant, et VBA essaie de déterminer un type en fonction du contenu au moment de l'exécution de l'instruction qui y fait référence.

Private Sub lecture(fichier As String)

    Open fichier For Input As #1
    Do While Not EOF(1)
        Line Input #1, lignefichier
        tabtexte = Split(lignefichier, vbLf)
        For i = LBound(tabtexte) To UBound(tabtexte)
            texte = tabtexte(i)
            depart = 1: position = 1

            Do While (position <> 0)
                position = InStr(depart, texte, ";", 1)
                If position = 0 Then
                    tampon = Mid(texte, depart)
                    Sheets("Import").Cells(ligne_enCours, colonne_enCours).Value = tampon
                    Exit Do
                Else
                    tampon = Mid(texte, depart, position - depart)
                End If

                Sheets("Import").Cells(ligne_enCours, colonne_enCours).Value = tampon
                depart = position + 1
                colonne_enCours = colonne_enCours + 1
            Loop

            colonne_enCours = colonne_debut
            ligne_enCours = ligne_enCours + 1
        Next i
    Loop
    Close #1

End Sub

oOw effectivement pas de soucis non plus car j'avais tout simplement supprimé la déclaration de tampon mais en laissant une virgule derrière "Dim texte As String"

Ce qui fait que ça faisait une erreur de syntaxe avec un nom de variable à typer en attente ^^

Merci en tout cas pour ce code que je vais bien étudier :)

Rechercher des sujets similaires à "vba import fichier texte"