Microsoft 365 Importer certaines données d'un ou plusieurs fichiers txt dans des cellules d'une feuille Excel

FCMLE44

XLDnaute Impliqué
Supporter XLD
Bonjour

J'ai un ou plusieurs fichiers txt dans un répertoire.
Je souhaiterais ouvrir ces fichier et récupérer certaines données pour les mettre dans une feuille d'un fichier excel
Je sais que ca peut se faire en créant une boucle mais je vous avoue que je sèche un peu n'ayant jamais travaillé avec des fichiers txt

Je vous mets un exemple excel en pièce jointe
Je dois remonter le numéro de Sécu, les noms et prénoms et le montant

Quelqu'un aurait il une idée ?

Merci
 

Pièces jointes

  • Classeur2.xlsx
    44.4 KB · Affichages: 9

chris

XLDnaute Barbatruc
RE

Tes fichiers sont pourris dès le départ où tu as travaillé comme un cochon en supprimant des retours à la ligne ?

Le montant c'est toujours Prestation complementaire ? Sinon il faudrait être plus précis...

Il y a toujours 3 personnes dans les txt ?
 

job75

XLDnaute Barbatruc
Bonsoir FCMLE44, chris,

Téléchargez les fichiers joints dans le même dossier (le bureau).

Ouvrez le fichier .xlsm et exécutez la macro affectée au bouton :
VB:
Sub Importer()
Dim chemin$, fichier$, n%, a(), x%, texte$, p%
chemin = ThisWorkbook.Path & "\"
fichier = Dir(chemin & "*.txt") '1er fichier txt du dossier
While fichier <> ""
    n = n + 1
    ReDim Preserve a(1 To 3, 1 To n)
    x = FreeFile
    Open chemin & fichier For Input As #x 'ouverture en lecture séquentielle
    Line Input #x, texte '1ère ligne
    p = InStr(texte, " ")
    a(2, n) = Mid(texte, p + 1)
    While Not EOF(x)
        Line Input #x, texte
        p = InStr(texte, "SS :")
        If p Then a(1, n) = Trim(Mid(texte, p + 4))
        If IsNumeric(texte) Then a(3, n) = CDbl(texte)
    Wend
    Close #x
    fichier = Dir 'fichier suivant
Wend
'---restitution---
With ActiveSheet 'à adapter
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    With .[A2]
        If n Then .Resize(n, 3) = Application.Transpose(a) 'fonction limitée à 65536 lignes
        .Offset(n).Resize(Rows.Count - n - .Row + 1, 3).ClearContents 'RAZ en dessous
    End With
    .Columns.AutoFit 'ajustement largeurs
End With
End Sub
Bonne nuit.
 

Pièces jointes

  • Classeur(1).xlsm
    19.2 KB · Affichages: 19
  • fichier txt v1.txt
    1.2 KB · Affichages: 12
  • fichier txt v2.txt
    1.2 KB · Affichages: 11
  • fichier txt.txt
    1.2 KB · Affichages: 9

FCMLE44

XLDnaute Impliqué
Supporter XLD
Bonsoir FCMLE44, chris,

Téléchargez les fichiers joints dans le même dossier (le bureau).

Ouvrez le fichier .xlsm et exécutez la macro affectée au bouton :
VB:
Sub Importer()
Dim chemin$, fichier$, n%, a(), x%, texte$, p%
chemin = ThisWorkbook.Path & "\"
fichier = Dir(chemin & "*.txt") '1er fichier txt du dossier
While fichier <> ""
    n = n + 1
    ReDim Preserve a(1 To 3, 1 To n)
    x = FreeFile
    Open chemin & fichier For Input As #x 'ouverture en lecture séquentielle
    Line Input #x, texte '1ère ligne
    p = InStr(texte, " ")
    a(2, n) = Mid(texte, p + 1)
    While Not EOF(x)
        Line Input #x, texte
        p = InStr(texte, "SS :")
        If p Then a(1, n) = Trim(Mid(texte, p + 4))
        If IsNumeric(texte) Then a(3, n) = CDbl(texte)
    Wend
    Close #x
    fichier = Dir 'fichier suivant
Wend
'---restitution---
With ActiveSheet 'à adapter
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    With .[A2]
        If n Then .Resize(n, 3) = Application.Transpose(a) 'fonction limitée à 65536 lignes
        .Offset(n).Resize(Rows.Count - n - .Row + 1, 3).ClearContents 'RAZ en dessous
    End With
    .Columns.AutoFit 'ajustement largeurs
End With
End Sub
Bonne nuit.
Merci ca fonctionne mais uniquement avec ces fichiers pour lequel j'ai supprimé des lignes par confidentialitéet je peux avoir plétore de fichier du même genre
 

chris

XLDnaute Barbatruc
Bonjour à tous

As tu pu réusssir avec Power Query ? Si oui je suis preneur de l'explication
Encore merci

Dans la mesure où sur une même ligne on a plusieurs infos mais que manifestement tes 3 fichiers sont le même bricolé donc pas vraiment représentatif, j'attendais d'avoir un peu plus d'infos que tes réponses sibyllines...

Pour l'instant j'ai cela, si on part du principe qu'on ne restitue que les lignes avec montant

1660740835538.png
 
Dernière édition:

FCMLE44

XLDnaute Impliqué
Supporter XLD
Bonjour à tous



Dans la mesure où sur une même ligne on a plusieurs infos mais que manifestement tes 3 fichiers sont le même bricolé donc pas vraiment représentatif, j'attendais d'avoir un peu plus d'infos que tes réponses sibyllines...

Pour l'instant j'ai cela

Regarde la pièce jointe 1147513
Le truc c'est que dans les fichiers réels et globaux il y a énormément de lignes avec plusieurs indivdus
En tout cas semble etre celui que je souhaite
 

chris

XLDnaute Barbatruc
RE
Le problème n'est pas le nombre d'individus mais les cas de lignes portant plusieurs infos

Ici on 2 cas
  • Nom avec information Arrêt de travail
  • Adhésion avec N°SS
Cela laisse supposer d'autres cas et il faut donc une analyse précise des cas...
 

job75

XLDnaute Barbatruc
Bon j'ai mieux regardé vos fichiers, testez ce fichier (2) avec cette macro :
VB:
Option Compare Text 'la casse est ignorée

Sub Importer()
Dim chemin$, fichier$, x%, montant As Boolean, texte$, civ, p%, n&, a(), deb%, fin%
chemin = ThisWorkbook.Path & "\"
fichier = Dir(chemin & "*.txt") '1er fichier txt du dossier
While fichier <> ""
    x = FreeFile
    Open chemin & fichier For Input As #x 'ouverture en lecture séquentielle
    montant = False
    While Not EOF(x)
        Line Input #x, texte
        texte = Replace(Replace(Replace(texte, "é", "é"), "è", "è"), "ê", "ê") 'épuration
        '---récupération du Montant à passer---
        If montant Then montant = False: If IsNumeric(texte) Then a(4, n) = CDbl(texte)
        '---nom---
        For Each civ In Array("Monsieur", "Madame", "Mademoiselle")
            p = InStr(texte, civ)
            If p Then
                n = n + 1
                ReDim Preserve a(1 To 4, 1 To n)
                a(1, n) = fichier
                deb = p + Len(civ)
                fin = InStr(texte, "Arrêt")
                If fin Then fin = fin - 1 Else fin = Len(texte)
                a(3, n) = Trim(Mid(texte, deb, fin - deb + 1))
                Exit For
            End If
        Next
        '---N°SS---
        p = InStr(texte, "SS :")
        If p Then
            deb = p + 4
            fin = Len(texte)
            a(2, n) = Trim(Mid(texte, deb, fin - deb + 1))
        End If
        '---Montant à passer---
        If texte = "Prestation complementaire" Then montant = True 'repérage
    Wend
    Close #x
    fichier = Dir 'fichier suivant
Wend
'---restitution---
With ActiveSheet 'à adapter
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    With .[A2]
        If n Then .Resize(n, 4) = Application.Transpose(a) 'fonction limitée à 65536 lignes
        .Offset(n).Resize(Rows.Count - n - .Row + 1, 4).ClearContents 'RAZ en dessous
    End With
    .Columns.AutoFit 'ajustement largeurs
End With
End Sub
 

Pièces jointes

  • Classeur(2).xlsm
    21 KB · Affichages: 5
  • fichier txt v1.txt
    1.2 KB · Affichages: 3
  • fichier txt v2.txt
    1.2 KB · Affichages: 3
  • fichier txt.txt
    1.2 KB · Affichages: 2

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16