Macro - Concatener plusieurs fichiers qui ont la même structure

Bonjour à vous,

Je viens vers vous car j'ai cherché un sujet apparent mais je n'ai pas trouvé.

J'ai dans un même dossier 3 fichiers qui ont la même structure voir pj : Fichier1.xlsx, Fichier2.xlsx, Fichier3.xlsx

Dans ces 3 fichiers j'ai une colonne A "référence", une colonne B "Désignation" et une colonne F "Quantité retournée" qui se trouvera toujours à la ligne 6 quelque soit le fichier.

Je souhaiterai savoir s'il est possible via une macro de compiler toutes les lignes qui ont des quantités dans un fichier 4.xlsx qui serait créé par la macro et qui serait un fichier recap de toutes les quantités de la colonne F.

Je suis partie sur un exemple de 3 fichiers mais je peux avoir 100 ou 200 fichiers dans le même dossier mais avec la même structure.

Avez-vous une idée de comment compiler ces fichiers ? Je vous remercie par avance pour m'aider à avancer sur ce sujet.

Merci

Stéphanie

78fichier1.xlsx (76.23 Ko)
26fichier2.xlsx (78.83 Ko)
28fichier3.xlsx (78.66 Ko)

Bonjour,

Voici un premier essai avec un code à exécuter. Il faut que les fichiers soient dans le même dossier (dont il faudra adapter le nom dans le code) et fermés au moment de l'exécution.

Les données sont cherchées dans la feuille 1 à chaque fois et collées dans la feuille 1 de destination. On ajoute les données à la suite des précédentes.

On ne prend que les colonnes 1, 2, 6.

On enregistre le nouveau fichier dans le répertoire du fichier exécutant.

Sub Compiler()

tcol = array(1, 2, 6)
set wb = workbooks.add
dossier = "C:\...\" '<<<<<<
fichier = dir(dossier & "*.xlsx")
while fichier <> ""
    n = 0
    with workbooks.open(dossier & fichier)
        with .sheets(1).usedrange.resize(, 6)
            t = .offset(6, 0).value
            for i = lbound(t) to ubound(t)
                if t(i, 6) > 0 then
                    n = n + 1
                    for k = lbound(tcol) to ubound(tcol)
                        t(n, k + 1) = t(i, tcol(k))
                    next k
                end if
            next i
        end with
        .close true
    end with
    with wb.sheets(1)
        nvl = .cells(.rows.count, 1).end(xlup).row + 1
        if n > 0 then .cells(nvl, 1).resize(n, 3) = t
    end with
    fichier = dir
wend

wb.saveas thisworkbook.path & "\recap " & format(date, "YYMMDD") & ".xlsx", 51
wb.close true

end sub

Cdlt,

Bonjour,

Merci pour votre réponse rapide.

Pouvez-vous me dire où je dois enregistrer la macro pour l'exécuter ? dans un des fichiers ?

Merci pour vos précisions.

Cdlt,

Vous avez parlé de créer un fichier 4 donc il faut mettre ce code dans un fichier tiers différent des fichiers manipulés (et surtout situé dans un autre répertoire que les fichiers sources).

Sinon, ça aurait été mieux, on aurait pu créer le fichier 4 et y placer le code pour avoir l'exécution depuis le fichier de destination.

Dans ce cas, il faudrait que j'apporte des petites modifications.

Cdlt,

Bonjour à toutes et tous, steph42300, 3GB,

J'ai suivi ce fil car je suis intéressé.

Bon j'ai une remarque et une question pour 3GB.

Il y a une coquille sur cette ligne de code:

wb.saveas thisworkbook.path & "\recap " & format(date, "YYMMDD") & ".xslx", 51

Il faut remplacer .xslx par xlsx

wb.saveas thisworkbook.path & "\recap " & format(date, "YYMMDD") & ".xlsx", 51

La question: je n'arrive pas à trouver à quoi sert 51 sur la ligne de code ?

Merci par avance pour ta réponse

Cdlt

Salut mdo100 !

Merci, je vais modifier mon code alors !

le 51 est un des arguments possibles du paramètre fileformat de la méthode .saveas :

https://docs.microsoft.com/fr-fr/office/vba/api/excel.workbook.saveas

Ca permet d'indiquer qu'on souhaite enregistrer au format xlsx^^. Et 51, c'est plus rapide que xlOpenXMLWorkbook. Mais je ne suis même pas sûr que ce soit nécessaire ici car c'est peut-être le format par défaut et surtout j'ai précisé l'extension dans le chemin. C'est important de mettre cet argument lorsqu'on enregistre une copie d'un fichier xlsm. Ca le convertit. Mais dans ce cas, il faut désactiver les alertes.

J'aime bien coder sur des ensembles de fichier mais ce n'est pas quelque chose que je pratique à titre personnel donc je n'en sais pas assez.

PS : Et le format xlsm, c'est 52 (xlOpenXMLWorkbookMacroEnabled)

Re 3GB,

Merci pour ta réponse et le lien

En effet , 51 n'est pas nécessaire pour enregistre au format xlsx

J'allais te demander pour le format xlsm mais je vois que tu as rajouté un PS à ton message.

Tu es génial tu réponds aux demandeurs (es) avec cordialité et tu ne manque pas d'explications si nécessaire, je suis souvent tes réponses faites sur le forum, j'y trouve mon compte et j'apprends.

Belle journée à toi.

Merci mdo100 pour ces compliments et pour la confirmation !

Tu sais, je suis loin d'être un pro, je considère que je fais mon apprentissage également. C'est pour ça que j'aime bien expliquer, ça me permet de mieux retenir, c'est la meilleure façon de comprendre.

Très bonne journée à toi aussi et à bientôt sur un fil !

Je viens de tester et j'ai fait ceci :

j'ai créé un fichier Macro.xlsm où j'ai indiqué le dossier où se trouve les fichiers à compiler et j'ai stocké Macro.xlsm à un autre emplacement. (voir fichier en pj)

J'ai exécuté la macro dans Macro.xlsm, le fichier "recap" est bien créé mais il est vide, aucune donnée.

PS : j'ai corrigé le xlsx dans la macro

Pouvez-vous regarder svp ?

Merci à vous.

Stéphanie

141macro.xlsm (12.30 Ko)
58recap-210302.xlsx (7.99 Ko)

Bonjour steph42300,

Je pense qu'il faut que tu ajoute un antislash à la fin de cette ligne.

dossier = "T:\_ECHANGE\smosnier\retours\macro\"

Cdlt

Mais oui merci mdo100 !!! :-) ça fonctionne beaucoup mieux maintenant !

Je vais pousser le bouchon un peu plus loin, si je veux rajouter la colonne E ou F ou les deux, que faut-il modifier dans le code pour les récupérer ?

Merci à vous 2 en tout cas.

Re,

Le but, c'est d'avoir un bon récapitulatif donc il faut donner plus de détails quant aux conditions.

Pour avoir les 2, c'est simple (tant que la vérification de la quantité est toujours en colonne 6) :

tcol = array(1, 2, 5, 6)

Pour le reste, tout dépend si la colonne E ou F est la dernière de son tableau ou s'il faut récupérer les données en fonction d'un critère. C'est à définir !

Qu'est-ce qu'il y a en colonnes E et F ?

Cdlt,

en fait ce sont les données qui se trouvent en colonne 4 et 5.

Colonne 4 = Code barre à 13 chiffres

Colonne 5 = Prix format €

Oui la colonne 6 sera toujours la dernière colonne.

Je veux juste pouvoir récupérer les informations des colonnes 4 et 5.

Merci

Je comprends pas bien ?! Donc tu veux récupérer tout le tableau finalement ? Ce serait plus simple mais sur ton post de départ tu parlais des colonnes A, B et F.

Si tu veux tout le tableau, c'est nickel. Si tu veux certaines colonnes, il faut que je connaisse les conditions précises dans lesquelles les récupérer.

Bonjour 3GB,

Excuse moi pour cette réponse tardive.

Oui je souhaiterai récupérer toutes les colonnes si possible, sinon que les colonnes 1,2,5,6 ou A,B,E,F

Par contre, pour la colonne F pas de changement, je veux que les lignes avec des quantités.

Est-ce possible ?

Merci à toi encore.

Rechercher des sujets similaires à "macro concatener fichiers qui ont meme structure"