Fusionner x classeur en un même fichier

Bonjour,

Je viens vers vous car j'ai testé un code que j'ai construit qui fusionne chaque classeur Excel en un même fichier, mais je rencontre une erreur 400

Au début j'avais l'erreur 1004 que j'ai réussi à corriger, mais j'en rencontre une deuxième

Le premier classeur à fusionner s'effectue, mais au moment ou le deuxième souffre, l'erreur se produit

Voici le code construit qui est sans aucun doute à revoir :

Sub FusionnerClasseur()
    Dim wbDest As Workbook
    Dim wbSource As Workbook
    Dim wsSource As Worksheet
    Dim wsDest As Worksheet
    Dim derLigne As Long
    Dim cheminDossier As String
    Dim fichier As String

    ' Spécifie le chemin du dossier contenant les fichiers Excel
    cheminDossier = "C:\CDE\" ' Modifie ce chemin
    fichier = Dir(cheminDossier & "*.xls*") ' Pour récupérer tous les fichiers Excel

    ' Créer un nouveau classeur pour les données fusionnées
    Set wbDest = Workbooks.Add
    Set wsDest = wbDest.Sheets(1) ' Utiliser la première feuille comme destination

    ' Boucle pour chaque fichier Excel dans le dossier
    Do While fichier <> ""
        ' Ouvrir le classeur source
        On Error Resume Next
        Set wbSource = Workbooks.Open(cheminDossier & fichier)
        On Error GoTo 0

        If Not wbSource Is Nothing Then
            ' Boucle pour chaque feuille dans le classeur source
            For Each wsSource In wbSource.Sheets
                ' Trouver la dernière ligne non vide dans la feuille de destination
                derLigne = wsDest.Cells(wsDest.Rows.Count, 1).End(xlUp).Row + 1

                ' Copier le contenu de la feuille source dans la feuille de destination
                wsSource.UsedRange.Copy Destination:=wsDest.Cells(derLigne, 1)

            Next wsSource

            ' Fermer le classeur source
            wbSource.Close SaveChanges:=False
        End If

        ' Passer au fichier suivant
        fichier = Dir
    Loop

    ' Afficher un message de confirmation
    MsgBox "Tous les classeurs ont été fusionnés avec succès !"
End Sub

Ce que j'ai essayé de construit c'est de créer un classeur qui va prendre le premier classeur excel, copier les données de la feuille, fermer le classeur qui a été copier, ouvrir le suivant copier et coller sur la dernière cellule vide, le fermer et vis vers ça

Si vous avez une idée de mon erreur s'il vous plait :/

En vous remerciant

Bonjour à tous !

Si VBA n'est pas un horizon indépassable, Power Query (nativement intégré dans Excel depuis 2016) est l'outil idoine pour ce type de tâche.

Au besoin, joignez un classeur source anonymisé mais représentatif.

Bonjour,

C'est très étrange je dois bien avouer que je ne vois aucune erreur dans votre code…

Pouvez-vous lancer la macro suivante et vous assurer que tous les fichiers cibles apparaissent bien dans le terminal ?

Sub LoopThroughFiles()
    Dim StrFile As String
    StrFile = Dir("C:\CDE\*.xls*")
    Do While Len(StrFile) > 0
        Debug.Print StrFile
        StrFile = Dir
    Loop
End Sub

Je viens de voir la réponse de JFL, que je ne saurais assez appuyer. PowerQuery est bien plus adapté à ce type de taches que VBA.

Merci pour vos réponses !

Je vous avoue qu'à par Excel je n'ai pas la moindre idée de comment s'est présenter Power Query '^^

Je vais me pencher la dessus alors, mais du coup Power Query se combine avec Excel ?

Je vais essayer ce que tu m'as écris Saboh

Merci à vous

Hmm, hé bien je n'ai pas de réaction suite à ton code

Je sais pas si ça change quelque chose, mais je suis assez frustré d'avoir la version 2016, alors si jamais ça pose problème à cause de la version, je comprends

Re,

PowerQuery est intégré à Excel. On y accède via l'onglet "Données".

image

Pour ce qui est de VBA aucune différence entre la version 2016 et plus modernes. A part les fonctions, rien de spécial. Je n'ai peut etre pas été assez clair mais le sub proposé n'écrit pas dans le classeur, il faut aller dans l'éditeur VBA et regarder dans la fenetre "immédiat", en bas par défaut (sinon appuyer sur Ctrl+G pour la faire apparaitre).

Je viens de voir oui que c'était intégré, merci pour l'information, je n'avais jamais utilisé

D'accord c'est déjà ça alors

Concernant la fenêtre d'exécution "immédiat" c'est malheureusement trop compliqué pour moi, je ne savais même pas qu'il était possible de faire ça, et comprendre son fonctionnement tout de suite c'est compliqué, je suis allée regardé un peu ce que c'était et j'avoue que je ne comprends pas trop. Mais je garde en tête ce procédé qu'il faudra que je me penche un peu plus dessus

En faite je cherchais à faire une fusion de fichiers excel parce que j'en ai 253, de base en PDF que j'ai transformé en Excel et ça m'embêter un peu de devoir copier un par un chaque excel à la main... '^^

Oui bien entendu. En attendant la proposition PQ de JFL, lancez la macro suivante et dite moi si dans votre classeur vous retrouvez bien la liste de tous fichiers à parcourir

Sub LoopThroughFiles()
    Dim StrFile As String
    StrFile = Dir("C:\CDE\*.xls*")
    Do While Len(StrFile) > 0
        Selection.value = StrFile
        Selection.Offset(1, 0).Select
        StrFile = Dir
    Loop
End Sub

Oui cela fonctionne, j'ai bien tous les noms des classeurs, par contre je vois pas pourquoi ils sont pas rangé dans l'ordre, ce n'est pas grave mais je comprends pas comment il s'est débrouillé pour arriver à ça

Par contre je viens de tester Power Query, et j'ai pu récupérer toutes les lignes de chaque classeur !

Ah parfait, alors n'hésitez pas à marquer le fil en résolu. Vous voyez, il existe des outils très pratiques pour gérer les données, plus accessibles ET rapides que le VBA.

Pour répondre à votre question concernant l'ordre, c'est "tout bete". En réalité les fichiers ne sont pas triés par ordre alphabétique sur votre disque. Quel intéret ? Ils sont simplement affichés par ordre alphabétique pour que nous nous y retrouvions plus aisément.

La fonction Dir en VBA ne prend pas cette précaution, elle itère sur tous les fichiers du dossier sans se soucier de savoir si l'un est avant ou après un autre, puisqu'en réalité cette question n'a pas vraiment de sens d'un point de vue purement informatique.

Tout de meme je m'interroge sur la raison du bug de votre code. Je suspecte qu'il essaie d'ouvrir un nouveau fichier avant de fermer l'autre. Peut etre qu'ajouter "DoEvents" avant "Loop" corrigerait le problème.

Oui ahah, effectivement c'est plus simple que de créer un code alors qu'il y a déjà une option pour faire tout ça en 3s xD

Oui oui je comprends ça, mais sur le moment je pensais qu'il faisait par ordre de lecture, vu que c'est trié comme dans dans l'ordinateur, je pensais qu'il allait prendre le premier puis continuer dans l'ordre actuel

Mais je comprends qu'il lit autre chose par rapport à l'informatique, après trié ou pas dans le classeur, je m'en fiche, du moment que j'ai les informations dans la même colonne ça me va ahah ^^

Alors la pour mon code j'en ai mais aucune idée, dans le procédé, il crée le classeur, copie toute la feuille du premier classeur à extraire, il ferme ce classeur et dès qu'il ouvre le deuxième classeur il me met l'erreur 400, et effectivement il me dit pas où se trouve le problème

Rechercher des sujets similaires à "fusionner classeur meme fichier"