Importation de fichiers .txt

Imer2007

XLDnaute Occasionnel
Bonjour à tous,

On m'a récemment donné une mission à effectuer et je sens que je vais avoir besoin de vos lumières car je ne sais pas comment procéder.

J'ai plusieurs fichiers texte (.txt) que je dois importer dans un fichier Excel.
Les fichiers sont de la forme suivante:
cmr23-fmess-nok(date AAMMJJ).txt
fano-ddif(date AAMMJJ).txt (exemple fano-ddif080923.txt)
fdece(date AAMMJJ).txt
fdiff(date AAMMJJ).txt
finco(date AAMMJJ).txt
fliste(date AAMMJJ).txt
fratt(date AAMMJJ).txt
frejet(date AAMMJJ).txt
fs58rsi(date AAMMJJ).txt
spoc90(date AAMMJJ).txt

Ces fichiers arrivent quotidiennement dans un dossier de notre serveur, et contiennent chacun plusieurs lignes de données, chaque donnée étant séparée par des points virgules.

Le principe est que je souhaite importer via macro les données de ces fichiers
dans un fichier excel et qu'une fois le traitement effectué ces fichiers texte se déplacent dans un dossier (genre "tâches effectuées").

Pourriez-vous m'aiguiller ?

Merci d'avance !:)
 

tototiti2008

XLDnaute Barbatruc
Re : Importation de fichiers .txt

ça ne mettra un peu de temps que la première fois, puisqu'une fois importé il ne les réimporte plus. mais il y a un autre soucis : tu m'avais dit que certains fichiers n'avaient pas le même séparateur ? pour ceux-là une macro différente sera indispensable.
je te prépare déjà la macro pour tout ceux qui ont le séparateur ";"
 

tototiti2008

XLDnaute Barbatruc
Re : Importation de fichiers .txt

essaye, je n'ai pas pu tester :

Code:
Sub Import()
    Dim SourceWkb As Workbook, NbLignes As Long, NbColonnes As Long, FS As FileSearch, DerColonne As Long
    Dim Liste, i As Long, j As Long
    Liste = Array("fdece", "cmr23-fmess-nok", "fano-ddif") 'à toi de compléter
    For j = LBound(Liste) To UBound(Liste)
        DerColonne = ThisWorkbook.Worksheets(Liste(j)).Range("IV1").End(xlToLeft).Column
        Set FS = Application.FileSearch
        With FS
            .LookIn = "C:\Documents and Settings\Desktop\XL\XL"
            .Filename = Liste(j) & "*.txt"
        End With
        If FS.Execute(msoSortByLastModified, msoSortOrderAscending) > 0 Then
            For i = 1 To FS.FoundFiles.Count
                If Application.WorksheetFunction.CountIf(ThisWorkbook.Worksheets(Liste(j)).Range(ThisWorkbook.Worksheets(Liste(j)).Cells(1, DerColonne), ThisWorkbook.Worksheets(Liste(j)).Cells(65536, DerColonne)), CLng(Mid(FS.FoundFiles(i), Len(FS.FoundFiles(i)) - 9, 6))) = 0 Then
                    Workbooks.OpenText Filename:=FS.FoundFiles(i), Origin:= _
                        xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote _
                        , ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, Comma:= _
                        False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1) _
                        , Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), _
                        Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array( _
                        16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), Array(21, 1)), _
                        TrailingMinusNumbers:=True
                    Set SourceWkb = ActiveWorkbook
                    NbColonnes = SourceWkb.ActiveSheet.Range("IV1").End(xlToLeft).Column
                    NbLignes = SourceWkb.ActiveSheet.Range("A65536").End(xlUp).Row
                    With SourceWkb.ActiveSheet
                        .Range(.Cells(1, NbColonnes + 1), .Cells(NbLignes, NbColonnes + 1)).Value = Mid(FS.FoundFiles(i), Len(FS.FoundFiles(i)) - 9, 6)
                        .Range(.Cells(1, 1), .Cells(NbLignes, NbColonnes + 1)).Copy Destination:=ThisWorkbook.Worksheets(Liste(j)).Range("A65536").End(xlUp).Offset(1, 0)
                    End With
                    SourceWkb.Close False
                End If
            Next i
        End If
    Next j
End Sub
 

Imer2007

XLDnaute Occasionnel
Re : Importation de fichiers .txt

Bonjour le forum, Tototiti,

Je me permets de réouvrir ce sujet car mon boss m'a demandé de l'améliorer.
Pour résumer le principe était d'importer plusieurs fichiers texte de noms différents dans excel.

J'aimerais savoir s'il est possible de l'améliorer selon le critère suivant:
- on rentre une "date de début" (format AAMMJJ) dans une cellule
- on rentre une "date de fin" (format AAMMJJ) dans une autre cellule, et lorsqu'on valide, Excel importe les fichiers dont les dates sont comprises entre les deux valeurs.

Exemple, je rentre 081001 en date de début, 081030 en date de fin, et lorsque je valide, ca m'importe tous les fichiers txt (fdece, finco, fratt, etc.) dont la date est comprise entre ces deux valeurs.

Pourriez-vous m'aider ?

D'avance merci.
 

tototiti2008

XLDnaute Barbatruc
Re : Importation de fichiers .txt

Bonjour Imer2007,

Dans quelles cellules de quelle feuille veux tu mettre les dates de début et de fin ?

que veux-tu dire par : "dont la date est comprise entre ces deux valeurs" ?
date de modification des fichiers ?
date comprise dans le nom ?
 

Imer2007

XLDnaute Occasionnel
Re : Importation de fichiers .txt

Bonjour Tototiti,

Dans mon fichier RNIAM.xls, j'ai une feuille de menu dans laquelle j'aurai deux cellules qui seront pour les dates de début (D17) et date de fin (D18).

Les fichiers à importer seront ceux dont le nom contient la date:
Exemple :
Date de début : 081001
Date de fin : 081030
Fichiers importés : fdece081005.txt, finco081016.txt, etc.

Est-ce plus clair ?
 

Pièces jointes

  • rniam.jpg
    rniam.jpg
    54.5 KB · Affichages: 62

tototiti2008

XLDnaute Barbatruc
Re : Importation de fichiers .txt

à tester :

je suis parti du principe que D17 et D18 contiennent des vraies dates plutôt que 080101

Code:
Sub Import()
    Dim SourceWkb As Workbook, NbLignes As Long, NbColonnes As Long, FS As FileSearch, DerColonne As Long
    Dim Liste, i As Long, j As Long, DateDeb As Date, DateFin As Date, k As Long, DateText As String, DateFic As Date
    Application.ScreenUpdating = False
    Liste = Array("fdece", "cmr23-fmess-nok", "fano-ddif") 'à toi de compléter
    DateDeb = ThisWorkbook.Worksheets("Menu général").Range("D17").Value ' à adapter
    DateFin = ThisWorkbook.Worksheets("Menu général").Range("D18").Value ' à adapter
    For j = LBound(Liste) To UBound(Liste)
        For k = DateDeb To DateFin
            DerColonne = ThisWorkbook.Worksheets(Liste(j)).Range("IV1").End(xlToLeft).Column
            Set FS = Application.FileSearch
            With FS
                .LookIn = "C:\Documents and Settings\Desktop\XL\XL"
                .Filename = Liste(j) & "*.txt"
            End With
            If FS.Execute(msoSortByLastModified, msoSortOrderAscending) > 0 Then
                For i = 1 To FS.FoundFiles.Count
                DateText = Mid(FS.FoundFiles(i), Len(Liste(j)) + 1, 6)
                DateFic = DateSerial(2000 + CLng(Left(DateText, 2)), CLng(Mid(DateText, 3, 2)), CLng(Right(DateText, 2)))
                If DateFic >= DateDeb And DateFic <= DateFin Then
                    If Application.WorksheetFunction.CountIf(ThisWorkbook.Worksheets(Liste(j)).Range(ThisWorkbook.Worksheets(Liste(j)).Cells(1, DerColonne), ThisWorkbook.Worksheets(Liste(j)).Cells(65536, DerColonne)), CLng(Mid(FS.FoundFiles(i), Len(FS.FoundFiles(i)) - 9, 6))) = 0 Then
                        Workbooks.OpenText Filename:=FS.FoundFiles(i), Origin:= _
                            xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote _
                            , ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, Comma:= _
                            False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1) _
                            , Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), _
                            Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array( _
                            16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), Array(21, 1)), _
                            TrailingMinusNumbers:=True
                        Set SourceWkb = ActiveWorkbook
                        NbColonnes = SourceWkb.ActiveSheet.Range("IV1").End(xlToLeft).Column
                        NbLignes = SourceWkb.ActiveSheet.Range("A65536").End(xlUp).Row
                        With SourceWkb.ActiveSheet
                            .Range(.Cells(1, NbColonnes + 1), .Cells(NbLignes, NbColonnes + 1)).Value = Mid(FS.FoundFiles(i), Len(FS.FoundFiles(i)) - 9, 6)
                            .Range(.Cells(1, 1), .Cells(NbLignes, NbColonnes + 1)).Copy Destination:=ThisWorkbook.Worksheets(Liste(j)).Range("A65536").End(xlUp).Offset(1, 0)
                        End With
                        SourceWkb.Close False
                    End If
                End If
                Next i
            End If
        Next k
    Next j
    Application.ScreenUpdating = True
End Sub
 

Imer2007

XLDnaute Occasionnel
Re : Importation de fichiers .txt

J'ai testé ton code et j'obtiens une erreur 13 : incompatibilité de type.
Je te joins la copie d'écran.
 

Pièces jointes

  • Pas de nom.jpg
    Pas de nom.jpg
    27 KB · Affichages: 50
  • erreur13.jpg
    erreur13.jpg
    11 KB · Affichages: 63
  • erreurdebog.jpg
    erreurdebog.jpg
    51 KB · Affichages: 52

tototiti2008

XLDnaute Barbatruc
Re : Importation de fichiers .txt

pour trouver la date du fichier, je prend les 6 derniers caractères de son nom (sans compter l'extension). Si la fin du nom de ton fichier n'est pas interprétable en date, ça ne fonctionne pas. tu as aussi des fichiers C23-dc200080101 ?
 

Imer2007

XLDnaute Occasionnel
Re : Importation de fichiers .txt

Les fichiers s'écrivent de la facon suivante :
fdeceAAMMJJ.txt
fdiffAAMMJ.txt
fincoAAMMJJ.txt
etc. et se trouvent dans un repertoire de notre serveur et donc non, ils ne s'écrivent pas de cette façon :C23-dc200080101
 

tototiti2008

XLDnaute Barbatruc
Re : Importation de fichiers .txt

désolé, j'avais oublié que foundfiles renvoyait le chemin complet...

remplace la ligne :

Code:
DateText = Mid(FS.FoundFiles(i), Len(Liste(j)) + 1, 6)

par

Code:
DateText = Mid(Right(FS.FoundFiles(i), Len(FS.FoundFiles(i)) - InStrRev(FS.FoundFiles(i), "\")), Len(Liste(j)) + 1, 6)
 

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 206
Messages
2 086 210
Membres
103 158
dernier inscrit
laufin