Concaténer plusierus fichiers .000 sur Excel en VBA

richert90

XLDnaute Occasionnel
Bonjour à tous

Contexte:

J'aimerais sur Excel concaténer plusieurs fichiers: c'est à dire avoir chaque fichier à la suite sur Excel.
Ces fichiers sont dans un répertoire et sont de type: JDB.000, JDB.001, JDB.002 etc...

Souhait:

Je voudrais donc en VBA avoir une boucle qui me permette de boucler les fichiers du répertoire (en se basant je pense sur l'incrémentation de l'extension 001,002,etc.. ): A chaque boucle dès qu'il y a un fichier, je l'importe sur Excel (c'est comme si c'est un fichier .csv en terme de manière d'import)

Travail réalisé auparavant:
J'ai un code qui marche mais qui est n'est pas assez automatisé. Il permet à l'utilisateur de choisir un fichier dans ce répertoire puis j'importe ce fichier, ensuite on pose la question à l'utilisateur pour savoir s'il veut en importer un autre etc...jusqu'a ce que l'utilisateur ne veut plus importer de fichier.... Le problème c'est que ça peut vite devenir long surtout si il faut importer 30 fichiers.. Voici le code malgré tout:

Code:
Sub import()

    Dim nom_fichier As String
    Dim compteur As Integer
    
    compteur = 0
    
     Do
            
        'On regarde d'abord où se situe la limite dans la première feuille pour importer les données a la suite
        Sheets(1).Select
        Do
            compteur = compteur + 1
        Loop Until Cells(compteur, 1) = ""
    
        ChDrive dir_csv: ChDir dir_csv 'dir_csv est la variable globale qui contient le chemin du répertoire où on se place à l'ouverture
        filetoopen = Application.GetOpenFilename("(*.*), *.*")  'FileToOpen contiendra le chemin du fichier qu'a choisi d'importer l'utilisateur
        'Filetoopen contient le chemin du fichier qu'on importe + son nom + son extension
        If filetoopen = False Then
            MsgBox ("You have not selected file") 'Dans le cas où il n'y a pas de fichier choisi.
            Exit Sub
        End If
            
        fichier_jdbprod = filetoopen 'chemin + nom + extension
        nom_fichier = Split(Mid$(filetoopen, InStrRev(filetoopen, "\") + 1), ".")(0)  'Nom du fichier sans son extension
            
        If filetoopen <> False Then
            With ActiveSheet.QueryTables.Add(Connection:= _
                    "TEXT;" & filetoopen _
                    , Destination:=Range("$A$" & compteur))
                    .FieldNames = True
                    .RowNumbers = False
                    .FillAdjacentFormulas = False
                    .PreserveFormatting = True
                    .RefreshOnFileOpen = False
                    .RefreshStyle = xlInsertDeleteCells
                    .SavePassword = False
                    .SaveData = True
                    .AdjustColumnWidth = True
                    .RefreshPeriod = 0
                    .TextFilePromptOnRefresh = False
                    .TextFilePlatform = 932
                    .TextFileStartRow = 1
                    .TextFileParseType = xlDelimited
                    .TextFileTextQualifier = xlTextQualifierDoubleQuote
                    .TextFileConsecutiveDelimiter = False
                    .TextFileTabDelimiter = False 'Tabulation
                    .TextFileSemicolonDelimiter = True 'Point virgule
                    .TextFileCommaDelimiter = False 'Virgule
                    .TextFileSpaceDelimiter = False 'espace
                    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
                    .TextFileDecimalSeparator = "." 
                    .TextFileTrailingMinusNumbers = True
                    .Refresh BackgroundQuery:=False
            End With
        End If
reponse = MsgBox("Do you want to concatenate another file with the same format ?", vbYesNo)
       
    Loop Until reponse = vbNo

Voila donc le mode d'import est le même mais il me faut juste une technique me permettant de boucler tous les fichiers dans le répertoire et pour chaque fichier je le met sur Excel (à la suite des précédents importés)

Voila merci d'avance de m'aider pour réaliser cette tâche :p
 
G

Guest

Guest
Re : Concaténer plusierus fichiers .000 sur Excel en VBA

Bonjour,

Peut-être quelque chose comme ceci:
( changement de la récupération du numéro de ligne disponible.)

Code:
Sub import()
    Dim nom_fichier As String
    Dim compteur As Long
    
    compteur = 0
        'On regarde d'abord où se situe la limite dans la première feuille pour importer les données a la suite
        Sheets(1).Select
        compteur = .Cells(Rows.Count, 1).End(xlUp)(2).Row
    
    'Initialiser le listage des fichiers
        
    filetoopen = Dir(dir_csv & "\*.txt")
    
    'Boucler tant qu'on n'a un nom de fichier
     Do While filetoopen <> ""
        
        'ouvrir uniquement les fichiers commençant par JDB. suivi de 3 chiffres et l'extension .txt (comparaison en minuscules)
        If lcase(filetoopen) Like "jdb.###.txt" Then
            filetoopen = dir_csv & "\" & filetoopen
            With ActiveSheet.QueryTables.Add(Connection:= _
                    "TEXT;" & filetoopen _
                    , Destination:=Range("$A$" & compteur))
                    .FieldNames = True
                    .RowNumbers = False
                    .FillAdjacentFormulas = False
                    .PreserveFormatting = True
                    .RefreshOnFileOpen = False
                    .RefreshStyle = xlInsertDeleteCells
                    .SavePassword = False
                    .SaveData = True
                    .AdjustColumnWidth = True
                    .RefreshPeriod = 0
                    .TextFilePromptOnRefresh = False
                    .TextFilePlatform = 932
                    .TextFileStartRow = 1
                    .TextFileParseType = xlDelimited
                    .TextFileTextQualifier = xlTextQualifierDoubleQuote
                    .TextFileConsecutiveDelimiter = False
                    .TextFileTabDelimiter = False 'Tabulation
                    .TextFileSemicolonDelimiter = True 'Point virgule
                    .TextFileCommaDelimiter = False 'Virgule
                    .TextFileSpaceDelimiter = False 'espace
                    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
                    .TextFileDecimalSeparator = "."
                    .TextFileTrailingMinusNumbers = True
                    .Refresh BackgroundQuery:=False
            End With
        End If
        'Passer au suivant
        filetoopen = Dir
    Loop
End Sub

A+
[edit]Hello titiborregan
 
Dernière modification par un modérateur:

titiborregan5

XLDnaute Accro
Re : Concaténer plusierus fichiers .000 sur Excel en VBA

Bonjour richert, le forum,


pour répertorier les fichiers (qui contiennent "JDB") d'un dossier j'utilise le code suivant:
Code:
Sub reCup_liste()
rePertoire = ThisWorkbook.Path & "\"
 With Sheets(1)
 .Columns("a").ClearContents 'efface la colonne A de la feuille récup
 i = 2
 nf = Dir(rePertoire & "*JDB*.xls")  ' premier fichier
 Do While nf <> ""
 .Cells(i, 1) = nf 'écrit le nom du fichier
 nf = Dir ' suivant
 i = i + 1
 Loop
 End With
 End Sub

ensuite je boucle sur la liste qui vient de se créer et peut rapatrier la feuille qui m'intéresse (ici la T1):
Code:
Sub reCup_T1()
With Sheets(1)
On Error Resume Next
For i = 2 To .Range("a65000").End(xlUp).Row 'pour tous les fichiers présents
n = .Cells(i, 1) 'nom du fichier
nc = rePertoire & .Cells(i, 1) 'chemin & nom du fichier
nbf = ThisWorkbook.Sheets.Count 'compte le nombre de feuilles dans le classeur
Application.DisplayAlerts = False 'masque les alertes
Application.AskToUpdateLinks = False 'ne pas demander les mises à jour des liens
Workbooks.Open (nc) 'ouvre le classeur


Workbooks(n).Sheets("T1").Copy after:=ThisWorkbook.Sheets(nbf) 'copie la feuille T1 dans ce classeur après la dernière feuille

Workbooks(n).Close 'ferme le classeur du service
Next
Application.DisplayAlerts = True
Application.AskToUpdateLinks = True
End With

en espérant que ça t'aide!!! classeur avec macro à mettre dans le même répertoire que là où sont tes fichiers!
Edit: hello Hasco!
 

richert90

XLDnaute Occasionnel
Re : Concaténer plusierus fichiers .000 sur Excel en VBA

Merci Hasco et titiborregan5 pour vos réponses
J'étais parti sur la solution de Hasco (mais je vais aussi voir celle de titiborregan5 ;)) et j'ai une erreur pour l'instruction:
Code:
compteur = .Cells(Rows.Count, 1).End(xlUp)(2).Row
PHP:
Erreur de compilation :reference incorrecte ou non qualifiée

Sinon le problème c'est que tu mets
Code:
filetoopen = Dir(dir_csv & "\*.txt")
mais ce ne sont pas des fichiers textes (d'ou mon pb aussi) mais des fichiers d'extension bizar .000, .001 etc ...
en fait
Code:
'ouvrir uniquement les fichiers commençant par JDB. suivi de 3 chiffres et l'extension .txt (comparaison en minuscules)
        If LCase(filetopen) Like "jdb.###" Then
est juste sauf l'extension .txt

J'ai essayer en faisait quelques modifs (mais sans succès):

Code:
Sub import()
    Dim nom_fichier As String
    Dim compteur As Long
   Dim dir_csv As String
   
        compteur = 0
        'On regarde d'abord où se situe la limite dans la première feuille pour importer les données a la suite
        Sheets(1).Select
        compteur = Cells(Rows.Count, 1).End(xlUp)(2).Row
   
    'Initialiser le listage des fichiers
  filetoopen = Dir(dir_csv & "\*.")
   
    'Boucler tant qu'on n'a un nom de fichier
     Do While filetoopen <> ""
       
        'ouvrir uniquement les fichiers commençant par JDB. suivi de 3 chiffres et l'extension .txt (comparaison en minuscules)
        If LCase(filetopen) Like "jdb.###" Then
            filetopen = dir_csv & "\" & filetoopen
            With ActiveSheet.QueryTables.Add(Connection:= _
                    "TEXT;" & filetoopen _
                    , Destination:=Range("$A$" & compteur))
                    .FieldNames = True
                    .RowNumbers = False
                    .FillAdjacentFormulas = False
                    .PreserveFormatting = True
                    .RefreshOnFileOpen = False
                    .RefreshStyle = xlInsertDeleteCells
                    .SavePassword = False
                    .SaveData = True
                    .AdjustColumnWidth = True
                    .RefreshPeriod = 0
                    .TextFilePromptOnRefresh = False
                    .TextFilePlatform = 932
                    .TextFileStartRow = 1
                    .TextFileParseType = xlDelimited
                    .TextFileTextQualifier = xlTextQualifierDoubleQuote
                    .TextFileConsecutiveDelimiter = False
                    .TextFileTabDelimiter = False 'Tabulation
                    .TextFileSemicolonDelimiter = True 'Point virgule
                    .TextFileCommaDelimiter = False 'Virgule
                    .TextFileSpaceDelimiter = False 'espace
                    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
                    .TextFileDecimalSeparator = "."
                    .TextFileTrailingMinusNumbers = True
                    .Refresh BackgroundQuery:=False
            End With
        End If
        'Passer au suivant
        filetoopen = Dir
    Loop
End Sub

J'ai essayé la solution de titiborregan5 mais là c'est au même point que je suis bloqué: pour l'instruction:
Code:
nf = Dir(rePertoire & "*JDB*.xls")  ' premier fichier
, ce n'est pas fichier d'extension .xls mais variable et qui peut avoir comme extension :001,002... et je dois concaténer tous ces fichiers à la suite
c'est la que c'est compliqué je penses...
 
Dernière édition:
G

Guest

Guest
Re : Concaténer plusierus fichiers .000 sur Excel en VBA

Bonsoir,

Alors en 1 pour l'erreur de compilation: il manque la feuille de références.

Code:
compteur= Sheets(1).Cells(........

Pour
Code:
Dir(dir_csv & "\*.txt")

Il te suffit d'adapter :
Code:
Dir(dir_csv & "\*.*")
d'ailleurs si tes fichiers commencent par jdb tu peux ecrire:
Code:
Dir(dir_csv & "\JDB*.*")

Pour le reste cela semble correcte, à toi d'adapter en fonction ou alors nous faire un zip avec quelques fichiers.### et le fichier excel qui contient la macro. Que nous puissions tester.

Vois les corrections apportées également à "filetoopen" parfois je l'ai écrit avec un seul o parfois deux, erreurs que m'a signalées mon ami JC (....arf et re hihihihihi JC;););) )

A+
 

richert90

XLDnaute Occasionnel
Re : Concaténer plusierus fichiers .000 sur Excel en VBA

Re,

Voilà, après quelques adaptations j'ai réussi à faire marcher la code. Voici quelques modifications apportées (Hasco ton code permettait en effet d'importer un fichier mais lors du 2ieme import ça écrasait le fichier importé précédemment) donc du coup j'ai inclus
Code:
compteur = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
dans la boucle
Code:
do while
. Voici le code:

Code:
Sub import()

    Dim nom_fichier As String
    Dim compteur As Long
    Dim dir_csv As String
    
    'Initialisation
    compteur = 0
    
    'On regarde d'abord où se situe la limite dans la première feuille pour importer les données a la suite
    Sheets(1).Select
    compteur = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
   
    'Initialiser le listage des fichiers
    filetoopen = Dir(dir_csv & "\JDBPROD*.*")
   
    'Boucler tant qu'on n'a un nom de fichier
     Do While filetoopen <> ""

       compteur = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row

       If Cells(compteur, 1) <> "" Then
        compteur = compteur + 1
        End If

        'ouvrir uniquement les fichiers commençant par JDB. suivi de 3 chiffres et l'extension .txt (comparaison en minuscules)
        If LCase(filetoopen) Like "jdbprod.###" Then
            filetoopen = dir_csv & "\" & filetoopen
            With ActiveSheet.QueryTables.Add(Connection:= _
                    "TEXT;" & filetoopen _
                    , Destination:=Range("$A$" & compteur))
                    .FieldNames = True
                    .RowNumbers = False
                    .FillAdjacentFormulas = False
                    .PreserveFormatting = True
                    .RefreshOnFileOpen = False
                    .RefreshStyle = xlInsertDeleteCells
                    .SavePassword = False
                    .SaveData = True
                    .AdjustColumnWidth = True
                    .RefreshPeriod = 0
                    .TextFilePromptOnRefresh = False
                    .TextFilePlatform = 932
                    .TextFileStartRow = 1
                    .TextFileParseType = xlDelimited
                    .TextFileTextQualifier = xlTextQualifierDoubleQuote
                    .TextFileConsecutiveDelimiter = False
                    .TextFileTabDelimiter = False 'Tabulation
                    .TextFileSemicolonDelimiter = True 'Point virgule
                    .TextFileCommaDelimiter = False 'Virgule
                    .TextFileSpaceDelimiter = False 'espace
                    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
                    .TextFileDecimalSeparator = "."
                    .TextFileTrailingMinusNumbers = True
                    .Refresh BackgroundQuery:=False
            End With
        End If
        'Passer au suivant
        filetoopen = Dir
    Loop
End Sub
La on les a bien à la suite
La dernière chose que je vais devoir faire c'est supprimer l’étiquette des lignes qui apparaît à chaque fois que l'on importe un fichier; Je vais juste la garder en toute première ligne et puis c'est tout .

Voila

En tout cas merci beaucoup Hasco et titiborregan5 pour votre aide!
 

Discussions similaires

Réponses
19
Affichages
2 K

Statistiques des forums

Discussions
312 239
Messages
2 086 494
Membres
103 234
dernier inscrit
matteo75654548