Fussionner plusieurs .csv en un seul

  • Auteur de la discussion Aboutblank
  • Date de début

Aboutblank

Habitué
Salut,

je voudrais fusionner des fichiers csv ( du même format) en un seul fichier csv. Puis supprimer ces fichiers csv avant de sauvegarder le fichier fusionné dans un répertoire.

En soit c'est tout simple, j'ai trouvé quelques exemples de codes mais aucun ne fonctionne...

J'ai une base mais ça ne fonctionne pas:

Code:
Sub FusionCSV()

Dim newCSVDesarchivage As Object

Set newCSVDesarchivage = CreateObject("Excel.Sheet") 'Créé un objet pour fusionner tous les .csv

newCSVDesarchivage.Sheets(1).Range("A1").Select 'sélectionner la cellule de début
Chemin = "S:\GS-PF\Sécurisation du désarchivage\test" 'Chemin ou se trouvent les fichiers CSV
Fichier = Dir(Chemin & "*.csv") ' Premier fichier

Do While Fichier <> ""

     Workbooks.Open Filename:=Chemin & Fichier
     Range("bd_export").Copy
     ThisWorkbook.Activate
     ActiveSheet.Paste
     Windows(Fichier).Activate
     Application.CutCopyMode = False
     ActiveWorkbook.Close savechanges:=False
     ThisWorkbook.Activate
     Range("A65536").End(xlUp).Offset(1, 0).Select
     Fichier = Dir ' Fichier suivant
 
Loop

newCSVDesarchivage.SaveAs Filename:="S:\GS-PF\Sécurisation du désarchivage\test\Demande de Desarchivage du.csv", FileFormat:=xlCSV, Local:=True
Set newCSVDesarchivage = Nothing

End Sub

Je pensais que se serait tout bidon à faire mais au final..
Si quelqu'un a déjà travaillé la dessus, je suis preneur d'un petit coups de main. ^^
 

drul

Obscur pro du hardware
Staff
Oula, c'est quoi tout ces immondes select et activate !
Il me semble qu'il manque un "\" à la fin dans ton chemin
C'est quoi l'erreur/le problème ?
Tu n'as que des fichiers csv dans ton répertoire test ?


Fichier = Dir(Chemin & "*.csv") ' Premier fichier
Pas sûr que cela fonctionne ... Dir demande un path pas un fichier ...
Edit: a ben si, ça marche, mybad
 

Aboutblank

Habitué
Salut drul ^^

Oui, je n'ai que des fichier csv du même format dans le dossier \test\

Et l'erreur c'est que ça ne copie rien dans le fichier qui lui se créé bien. J'ai copier la partie qui est censé copier le contenue des fichiers csv sur internet et j'ai ajouté ce qui save le fichier créé.

En faisant un .bat dans le dossier ca marche très bien et en 2 secondes:
Code:
copy *.csv S:\GS-PF\SecurisationDesarchivage\DemandesDesarchivagedu%date:~0,2%%date:~3,2%%date:~6,4%.csv
del *.csv

Mais le lancement du .bat dans mon module déconne:
Code:
Shell "S:\GS-PF\SecurisationDesarchivage\test\FusionDesCSV.bat"

Le batch ne se lance pas mais le module vba ne décèle aucune erreur.

Et c'est beaucoup moins propre que de passer seulement par le module VBA.
Je voudrais juste un module VBA qui fait pareil que le .bat du dessus.
 

drul

Obscur pro du hardware
Staff
Rajoute le "\" ça devrait déjà aller mieux ...
 

Aboutblank

Habitué
Oui, j'avais déjà tenté de mettre un \ à la fin du chemin et ça retourne l'erreur:

"Erreur:La méthode range de l'objet _global a échoué"

Code:
Sub FusionCSV()

Dim newCSVDesarchivage As Object

Set newCSVDesarchivage = CreateObject("Excel.Sheet") 'Créé un objet pour fusionner tous les .csv

newCSVDesarchivage.Sheets(1).Range("A1").Select 'sélectionner la cellule de début

Chemin = "S:\GS-PF\SecurisationDesarchivage\test\" 'Chemin ou se trouvent les fichiers CSV

Fichier = Dir(Chemin & "*.csv") ' Premier fichier

    Do While Fichier <> ""
    
         Workbooks.Open Filename:=Chemin & Fichier
         Range("bd_export").Copy
         ThisWorkbook.Activate
         ActiveSheet.Paste
         Windows(Fichier).Activate
         Application.CutCopyMode = False
         ActiveWorkbook.Close savechanges:=False
         ThisWorkbook.Activate
         Range("A65536").End(xlUp).Offset(1, 0).Select
         Fichier = Dir ' Fichier suivant
    
    Loop

newCSVDesarchivage.SaveAs Filename:="S:\GS-PF\SecurisationDesarchivage\test\DemandedeDesarchivagedu.csv", FileFormat:=xlCSV, Local:=True
Set newCSVDesarchivage = Nothing
 

End Sub
 

drul

Obscur pro du hardware
Staff
C'est bon signe, au moins il passe dans ta boucle maintenant ;)
 

drul

Obscur pro du hardware
Staff
Plus sérieusement:

Code:
Sub FusionCSV()

 
Dim newCSVDesarchivage As Object
Dim SourceWb As Workbook
Dim destCell As Range

 
Set newCSVDesarchivage = CreateObject("Excel.Sheet") 'Créé un objet pour fusionner tous les .csv

 
Set destCell = newCSVDesarchivage.Sheets(1).Range("A1") 'sélectionner la cellule de début

 
Chemin = "S:\GS-PF\SecurisationDesarchivage\test\" 'Chemin ou se trouvent les fichiers CSV

 
Fichier = Dir(Chemin & "*.csv") ' Premier fichier

 
    Do While Fichier <> ""

 
         Set SourceWb = Workbooks.Open(Chemin & Fichier)

         SourceWb.Range("bd_export").Copy destCell

         SourceWb.Close savechanges:=False

         Set destCell = newCSVDesarchivage.Sheets(1).Range(newCSVDesarchivage.Rows.Count, 1).End(xlUp).Offset(1, 0)

         Fichier = Dir ' Fichier suivant

 
    Loop

 
newCSVDesarchivage.SaveAs Filename:="S:\GS-PF\SecurisationDesarchivage\test\DemandedeDesarchivagedu.csv", FileFormat:=xlCSV, Local:=True

Set newCSVDesarchivage = Nothing
Set SourceWb = Nothing
 
 
End Sub

On évite les activate, les selects et autres bouse du style ... et on laisse le presse papier tranquille.

Y a plus qu'a effacer les fichiers csv ...
 

Aboutblank

Habitué
Erreur 438 " Propriété ou méthode non géré par cette objet" sur la ligne: SourceWb.Range("bd_export").Copy destCell

Après pour ce qui est de les effacer je rajouterais une ligne pour supprimer le fichier csv en cours de traitement dans la boucle.
 

Aboutblank

Habitué
J'ai une autre erreur sur la même ligne, décidément, elle ne veut pas passer ^^
Erreur d'execution '-2147221080 (800401a8)'
Erreur Automation
 

magellan

Modérâleur
Staff
Par curiosité, ne serait-il pas plus simple de faire un .bat tout bête pour procéder à cette fusion ?
 

Aboutblank

Habitué
C'est exactement ce que j'ai fait quand je n'ai pas trouvé de module VBA et ca m'a pris 5 secondes du coups mais je n'arrive pas à lancer correctement le .bat à partir du module VBA. >< ( Pourtant, en cherchant un " Shell ***.bat" est censé fonctionner mais je pense que j'ai un problème de vérification de sécurité pour le lancer)

Et il faut avouer que c'est beaucoup plus propre en le faisant directement avec le programme VBA. C'est invisible pour l'utilisateur Et ca évite de trainer un .bat un peu partout. ^^
 

drul

Obscur pro du hardware
Staff
Tu es sûr que tu as une plage nommé "bd_export" dans ton fichier csv ??? je vois mal comment c'est possible en fait ...
 

drul

Obscur pro du hardware
Staff
N.B. jette aussi un oeil ici, deux solutions élégantes:

 

Aboutblank

Habitué
Non, j'en ai pas. Je ne sais pas à quoi ca correspond en fait bd export ><

J'ai essayé de re écrire le code en utilisant la même logique que celle pour le programme avec lequel tu m'avais aidé il y a une semaine mais j'ai quelques erreurs de code TRES Probablement dû a une mauvaise application des fonctions objets sur le mauvais objet.

C'est plus complexe que le code initial mais ça a le mérite d'être plus logique en tout cas pour moi. ^^

Code:
Sub FusionCSV()

    Dim i As Long
    
    Dim newCSVDesarchivage As Object
    
    Dim sourceWb As Workbook
    
    Dim destCell As Range
    
    Dim derLigne As Long
    
    Set newCSVDesarchivage = CreateObject("Excel.Sheet") 'Créé un objet pour fusionner tous les .csv
    
    'Set destCell = newCSVDesarchivage.Sheets(1).Range("A1") 'sélectionner la cellule de début
    
    Chemin = "S:\GS-PF\SecurisationDesarchivage\test\" 'Chemin ou se trouvent les fichiers CSV
    
    Fichier = Dir(Chemin & "*.csv") ' Premier fichier
    
    
    
    
    j = 1
    
    Do While Fichier <> ""
    
            Set sourceWb = Workbooks.Open(Chemin & Fichier)
            'Ca déconne à partir d'ici.
            derLigne = sourceWb.Cells(Application.Rows.Count, "a").End(xlUp).Row
            
            For i = 1 To derLigne
    
                    sourceWb.Sheets(1).Range(sourceWb.Sheets(1).Cells(i, "A"), sourceWb.Sheets(1).Cells(i, "AE")).Copy newCSVDesarchivage.Sheets(1).Range(newCSVDesarchivage.Sheets(1).Cells(j, "A"), newCSVDesarchivage.Sheets(1).Cells(j, "AE"))
                    j = j + 1
            Next
            
            sourceWb.Close
            Fichier = Dir ' Fichier suivant
            
    
    Loop
        
    newCSVDesarchivage.SaveAs Filename:="S:\GS-PF\SecurisationDesarchivage\test\DemandedeDesarchivagedu.csv", FileFormat:=xlCSV, Local:=True
    
    Set newCSVDesarchivage = Nothing
    
    Set sourceWb = Nothing

 
End Sub

Je vais voir les exemples que tu as trouvé.
 

drul

Obscur pro du hardware
Staff
Plus dispo avant lundi ...
Redis moi si tu as encore besoin d'aide d'ici là.
 

Aboutblank

Habitué
Salut, merci pour ta réponse,

j'avais déjà créé un script pour faire cette fusion et il fonctionne. Mais impossible de le lancer via VBA-Excel.

Et je préfèrerais faire cette fusion dans mon programme vba plutôt qu'avec un script que je devrais trimballer un peu partout, si possible. ^^
 

Aboutblank

Habitué
Ca m'a convaincu que je n'ai pas encore compris le principe de la syntaxe VBA. ^^
Pour le lancement du script, je ne comprend pas pourquoi il refuse de se lancer vu que sur internet tout le monde utilise la même commande et ça fonctionne.
Pour ce qui est du programme, j'ai pas arrêté de changer. Je pense que j'ai la même logique que la dernière fois et j'applique une méthode sur un objet qui ne la possède pas.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 125
Messages
6 717 774
Membres
1 586 361
Dernier membre
Florian3549
Partager cette page
Haut