IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Lecture donnee fichier txt vers feuille excel [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut Lecture donnee fichier txt vers feuille excel
    Bonjour au forum,

    Je viens ici car je suis confronté à une diffculté d’agencement de donnée dans un fichier texte (format ANSI)

    Exemple du contenu fichier txt:

    Date/region =11/04/2023 Paris
    Nom. = dupont
    Environnement severe. =fort

    [habitation][propriétaire/locataire][bilan][dpe][statut]
    Resultat . . . Ok
    Maison Propriétaire E ok


    Les données sont décalées visuellement dans le fichier *.txt

    Je voudrais que chaque «*bloc*» de lignes du txt soient remplis dans chaque colonne du ficher excel fermé
    C’est à dire
    A1 B1 C1
    Date/région = 11/04/2023
    A2 B2 C2
    Nom = Dupont
    A3 B3 C3
    Environnement severe. = Fort
    A4 B4 C4

    A5 B5 C5. D5 E5
    [habitation] [proprietaire/locataire]. [bilan]. [dpe] [statut]

    A6 B6 C6 D6 E6
    Resultat . . . Ok




    J’ai fait des conditions pour les 3 premieres lignes ou il y a un egale c’est à dire avec un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Dim tbtxt() as string
    Dim strligne as string
    Dim Compteur as integer
    ’j’ouvre le fichier txt avec textstream et tant que je n’arrive pas à la fin du fichier continue par
    Strligne=.readline
    If compteur<3
    Tbtxt(0) = left(strligne,mid(strligne,"=",1)-1)
    Tbtxt(1)= "="
    Tbtxt(2)= right(strligne,len(strligne)-mid(strligne,*"=",1))
    Compteur=compteur+1
     
    End if
    If strligne like*"*" & "[" & "*" then «*’ filtre le premier bloc avec un left puis le second par mid etc…
    Tbtxt(3) = left…
    End if
    En fait je ne peux pas faire de condition pour chaque cas 😞
    J’ai pensé sinon à dupliquer mon fichier txt en prenant que la,partie qui m’intéresse
    Puis faire un copier coller du txt vers la feuille du excel fermé mais comment fait on ?

    Sur le site de jacques gontier il fait .range(«*a1:a5000*»).value=tableau sauf que dans mon cas au vu de la structure des données ça ne marche pas 😕

    Si vous pouviez m’aider ça serait gentil

    Merci

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Salut,
    A la lecture de tes exemples, moi je comprends que tout ce qui est séparé par des espaces est considéré comme un "bloc" même s'il ne s'agit que d'un point par exemple. Voici ce que j'obtiens avec ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    Sub ImporterDonnees()
        ' Déclaration des variables
        Dim tbtxt() As String
        Dim strligne As String
        Dim Compteur As Integer
        Dim FichierTexte As String
        Dim FichierExcel As String
        Dim objExcel As Object
        Dim objWorkbook As Object
        Dim objWorksheet As Object
        Dim fso As Object
        Dim ts As Object
        Dim i As Integer
     
        ' Initialisation des variables
        Compteur = 1
     
        ' Chemin d'accès aux fichiers texte et Excel
        FichierTexte = "C:\Chemin\vers\fichier\Texte.txt"
        FichierExcel = "C:\Chemin\vers\fichier\Excel.xlsx"
     
       ' Vérification de l'existence des fichiers texte et Excel
        Set fso = CreateObject("Scripting.FileSystemObject")
     
        If Not fso.FileExists(FichierTexte) Then
            MsgBox "Le fichier texte n'existe pas", vbCritical
            Exit Sub
        End If
     
        If Not fso.FileExists(FichierExcel) Then
            MsgBox "Le fichier Excel n'existe pas", vbCritical
            Exit Sub
        End If
     
        ' Ouverture du fichier texte
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set ts = fso.OpenTextFile(FichierTexte, 1)
     
        ' Création d'un objet Excel et ouverture du fichier Excel
        Set objExcel = CreateObject("Excel.Application")
        Set objWorkbook = objExcel.Workbooks.Open(FichierExcel)
        Set objWorksheet = objWorkbook.Worksheets(1)
     
        ' Lecture des lignes du fichier texte et traitement des données
        Do While Not ts.AtEndOfStream
            strligne = ts.ReadLine
     
            ' Séparation des éléments de la ligne
            tbtxt = Split(strligne, " ")
     
            ' Écriture des données dans le fichier Excel
            For i = 0 To UBound(tbtxt)
                objWorksheet.Cells(Compteur, i + 1).NumberFormat = "@"
                objWorksheet.Cells(Compteur, i + 1).Value = tbtxt(i)
            Next i
     
            Compteur = Compteur + 1
        Loop
     
        ' Fermeture du fichier texte et du fichier Excel
        ts.Close
        Set ts = Nothing
        Set fso = Nothing
     
        objWorkbook.Close True
        Set objWorksheet = Nothing
        Set objWorkbook = Nothing
        Set objExcel = Nothing
     
        MsgBox "Traitement terminé", vbInformation
     
    End Sub
    Avant d'écrire dans une cellule du classeur, je la mets au format texte (c'est la sub qui s'en charge), sinon une date est transformée en nombre, et un mot suivi de égal donne une erreur dans la cellule puisque ce n'est pas une formule. Je ne sais plus quand est apparue la fonction split que j'utilise, si tu ne l'as pas il faudra réécrire le code en conséquence.
    Images attachées Images attachées  

  3. #3
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut
    Bonjour Franc,
    D’abord merci de te pencher sur mon cas.
    J’ai obtenu a qqchose pret la meme chose que toi.
    Sauf par exemple pour la 1ere,ligne le «*=«* doit etre séparé de la date. Tous les lignes comportant un egal doivent être séparés/isolés du terme qui les suivent.

    J’ai regardé un peu du coté querytables.add => j’essayerai demain
    Et aussi sur des echanges sur ce site sur l’idee d’utiliser l’enregistreur de macro :
    -ouvrir mon fichier texte
    -sélectionner le passage qui m’intéresse
    -copier
    -coller dans une feuille
    -regarder le code qui s’en dégage

    Mais je vais regarder ta solution mais déjà comme je le dis les = sont «*seuls dans une colonne*». Mais vous avez bien compris mon problème en tout cas

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Essaie en remplacant la ligne split par celle-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tbtxt = Split(Replace(strligne, "=", " = "), " ")

  5. #5
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut
    J’essayerai demain.
    Par contre si j’ai ceci:

    Date/region =11/04/2023 Paris
    (On notera beaucoup d’espace entre date/region et le =11/04/2023 Paris, disons 23 espaces au pif)


    Je fais ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    If strligne like "*" & "=" & "*" then
    Tbtxt=split(replace(strligne,*"="," = ")," ")
    Else
    Tbtxt=split(Strligne," ")
    End if
     
    ’puis écrire dans le fichier excel…
    Je n’ai pas de pc pour tester chez moi, quid:
    Cas ou j’ai beaucoup d’espace entre «*2 mots*» ? J’aurai autant de colonne que d’espace ? 😳
    Cas ou les mots avec crochets ne sont pas espacés ? Dans une colonne j’aurai tous mes mots avec crochets ? 😨

  6. #6
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Effectivement, je me sers de l'espace comme séparateur, donc ce qui se trouve entre 2 espaces sera considéré comme un bloc et tu auras des cellules vides.
    Ajoute ceci après la ligne split:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            ' Suppression des éléments vides du tableau tbtxt
            For i = UBound(tbtxt) To 0 Step -1
                If tbtxt(i) = "" Then
                    tbtxt(i) = Null
                End If
            Next i
            tbtxt = Filter(tbtxt, Null, False)
    Pour ta deuxième question, s'il n'y a pas d'espace, tout est considéré comme un bloc.
    Pour diviser un texte en blocs, il faut déterminer un séparateur. Si une fois c'est un espace, une autre fois une virgule, ou alors un point, ce sont tous des tests à ajouter et on n'en finit pas de rallonger le code. En me basant sur l'exemple que tu as donné, l'espace me paraissait le plus approprié mais ça ne couvrira probablement pas tous les cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] lecture et redirection de données d'un fichier .txt vers une feuille Excel
    Par Max_F dans le forum Excel
    Réponses: 1
    Dernier message: 30/10/2014, 22h46
  2. ouvrir fichier txt dans feuille excel
    Par Timber_Kennedy dans le forum Excel
    Réponses: 4
    Dernier message: 14/06/2012, 18h02
  3. [VBA Excel] Extraction de données fichier txt vers Excel et mise en forme
    Par newcodeur dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 23/05/2008, 11h45
  4. Lecture fichier txt vers tableau alloué
    Par yeboum dans le forum Fortran
    Réponses: 3
    Dernier message: 27/11/2007, 09h31
  5. [Excel - VBA] lecture de fichier txt
    Par simstef dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 15/06/2007, 16h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo