XL 2019 VBA importer 1 à 1 des fichiers csv d'un repertoire pour lancer une macro

sive91

XLDnaute Junior
Bonjour,

Je dispose d'un fichier de traitement,
je cherche le moyen que pour chaque fichier csv d'un répertoire donné, il importe sont contenu dans la page commande dans les colonne A à E, afin que je puisse lancer mes macros de traitement).
 

Pièces jointes

  • Import.xlsm
    73.4 KB · Affichages: 22
Solution
Bonsoir à tous,
En reprenant le principe de @job75 , vous pouvez utiliser ce code adapté à votre demande:
VB:
Private Sub CommandButton1_Click()
Dim Fso As Object, Sourcefile As Object
Dim Rep As String, Fic As String
Dim Target As Range
Dim Tbl
    Rep = "Dossier des fichiers Csv"
    Fic = Dir(Rep)
    Set Fso = CreateObject("Scripting.FileSystemObject")
        Do While Fic <> ""
            ActiveSheet.Columns("A:E").Clear
            Set Target = ActiveSheet.[A1]
            Set Sourcefile = Fso.OpenTextFile(Rep & Fic, 1)
            Do While Not Sourcefile.AtEndOfStream
                Tbl = Split(Replace(Sourcefile.readline, """", ""), ";")
                Target.Resize(, UBound(Tbl) + 1) = Tbl
                Set Target =...

job75

XLDnaute Barbatruc
Bonjour sive91, Roblochon, fanch55,

Pour déposer ici un fichier CSV il suffit de le zipper.

Téléchargez les fichiers zippés joints dans le même dossier et voyez le code de la feuille "Commande" :
VB:
Private Sub CommandButton1_Click()
Dim chemin$, fichier$, ncol%, resu(), num&, lig&, x, texte, n&, s, ub%, col%, xx
chemin = ThisWorkbook.Path & "\"
fichier = Dir(chemin & "*.csv")
ncol = 5 '5 colonnes
ReDim resu(1 To Rows.Count, 1 To ncol)
While fichier <> ""
    num = num + 1
    lig = 0
    x = FreeFile
    Open chemin & fichier For Input As #x 'lecture séquentielle du fichier CSV
    While Not EOF(1) 'EndOfFile: fin du fichier
        lig = lig + 1
        Line Input #x, texte 'récupère la ligne
        If num = 1 And lig = 1 Or lig > 1 Then 'les en-têtes ne sont copiées qu'une fois
            s = Split(texte, ";")
            ub = IIf(UBound(s) < ncol - 1, UBound(s), ncol - 1)
            n = n + 1
            For col = 1 To ub + 1
                xx = s(col - 1)
                If col = 4 Then If IsDate(xx) Then xx = CDate(xx)
                resu(n, col) = xx
            Next col
        End If
    Wend
    Close #x 'fermeture du fichier CSV
    fichier = Dir
Wend
'---restitition---
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A1] '1ère cellule de destination, à adapter
    .Resize(n, ncol) = resu
    .Offset(n).Resize(Rows.Count - n - .Row + 1, ncol).ClearContents 'RAZ en dessous
End With
Columns(1).Resize(, ncol).AutoFit 'ajustemrnt largeurs
End Sub
A+
 

Pièces jointes

  • Dossier.zip
    53.7 KB · Affichages: 8

fanch55

XLDnaute Barbatruc
Bonsoir à tous,
En reprenant le principe de @job75 , vous pouvez utiliser ce code adapté à votre demande:
VB:
Private Sub CommandButton1_Click()
Dim Fso As Object, Sourcefile As Object
Dim Rep As String, Fic As String
Dim Target As Range
Dim Tbl
    Rep = "Dossier des fichiers Csv"
    Fic = Dir(Rep)
    Set Fso = CreateObject("Scripting.FileSystemObject")
        Do While Fic <> ""
            ActiveSheet.Columns("A:E").Clear
            Set Target = ActiveSheet.[A1]
            Set Sourcefile = Fso.OpenTextFile(Rep & Fic, 1)
            Do While Not Sourcefile.AtEndOfStream
                Tbl = Split(Replace(Sourcefile.readline, """", ""), ";")
                Target.Resize(, UBound(Tbl) + 1) = Tbl
                Set Target = Target.Offset(1)
            Loop
            Sourcefile.Close
            Set Sourcefile = Nothing
            ActiveSheet.Columns.AutoFit
            MsgBox Fic & vbLf & " A traiter"
                Stop ' ci_dessous tout le traitement à faire
                ......
            Fic = Dir
        Loop
    Set Fso = Nothing
End Sub
 

sive91

XLDnaute Junior
Je te remercie job75, cependant j'ai du mal m'expliquer et je m'en excuse, je cherche a ouvrir les fichier csv 1 par 1 pour que chaque fichier soit traiter par une macro puis il ferme le fichier passe au suivant, et ainsi de suite.

Merci
 

patricktoulon

XLDnaute Barbatruc
Je te remercie job75, cependant j'ai du mal m'expliquer et je m'en excuse, je cherche a ouvrir les fichier csv 1 par 1 pour que chaque fichier soit traiter par une macro puis il ferme le fichier passe au suivant, et ainsi de suite.

Merci
bonjour et pourquoi ne pas traiter tout les csv d'un coup après les avoir cumulé
a moins que ce ne soit pas la même macro pour tout les csv ou que les csv n'ai pas la même architecture au quel cas l'automatisation sera bien compliqué peut être même pas possible
 

sive91

XLDnaute Junior
Bonjour Patrick,

je vais essayé de le faire le plus clair possible, si tu regarde mon fichier, dans la feuille commande, la partie gauche est l'emplacement d'import du fichier CSV, à droite j'ai un premier traitement qui me permet de mettre en forme mes données pour l'execution de mes macros, à savoir générer 4 fichiers csv entetes lignes messages et logs
La première ligne de la feuille "Commande" correspond à mon entete et les lignes du dessous à mes lignes de commandes
 

sive91

XLDnaute Junior
Donc ce que je cherche a faire,
Un répertoire contient plusieurs fichiers csv
mon Excel
Ouvre un fichier excel
Execute mes macros
ferme le fichier csv ou le supprime ou le déplace
puis ouvre le second fichier csv et recommence

Merci encore
 

job75

XLDnaute Barbatruc
Re sive91, salut patricktoulon,

Il vaudrait mieux revoir votre façon de faire, ouvrir les fichiers CSV 1 par 1 prendra beaucoup de temps.

Sauf si vous en avez peu bien sûr, dans ce cas ouvrez-les, il y a de nombreux exemples sur XLD.

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 182
dernier inscrit
moutassim.amine