Créer une macro qui découpe un fichier Excel en plusieurs fichiers différents

cbenali

XLDnaute Nouveau
Bonjour,

C'est ma 1ère demande dans ce forum :)

Pourriez-vous m'aider sur un problème svp?

Je souhaite créer une macro qui permet de découper un fichier Excel en plusieurs fichiers selon un critère défini.
Le critère de génération de chaque nouveau fichier est le changement de contenu d'une colonne (dans le fichier de départ ci-joint, ma 3ème colonne s'appelle SOCGL. chaque valeur s'y trouvant se répète plusieurs fois. Je veux qu'à chaque changement de valeur dans cette colonne, un nouveau fichier soit crée avec toutes les lignes correspondant à cette valeur). (cf. fichier de départ ci-joint)

Le nom des colonnes des fichiers générés doit être celui du fichier exemple du fichier voulu (cf. 'fichier cible ci-joint).

Pour chaque fichier, je souhaite insérer un total dans la colonne 17 (la ligne du total doit s'appeler [ S/T CLE = *valeur de la colonne 3* ] ...Ce nom est donné par la colonne 1 du fichier de départ!

Merci beaucoup de votre aide.
 

Pièces jointes

  • fichier cible.xlsx
    10.1 KB · Affichages: 56
  • fichier cible.xlsx
    10.1 KB · Affichages: 37
  • fichier de départ.xlsx
    26.5 KB · Affichages: 55
  • fichier de départ.xlsx
    26.5 KB · Affichages: 48

Modeste

XLDnaute Barbatruc
Re : Créer une macro qui découpe un fichier Excel en plusieurs fichiers différents

Bonjour cbenali,

Le problème est sans doute que le sujet a été souvent abordé ... Tu as déjà fait une recherche? Tenté de comprendre une des solutions proposées, de l'adapter?

Le contenu de ton "fichier cible" ne semble pas correspondre à ce qu'un simple filtre automatique appliqué à ton "fichier de départ" donne comme résultat :confused:
 

cbenali

XLDnaute Nouveau
Re : Créer une macro qui découpe un fichier Excel en plusieurs fichiers différents

Bonjour modeste,

Oui j'ai déjà fait des recherches et trouvé quelques exemples qui m'ont permis d'éclater mon fichier de départ en plusieurs fichiers (c'est déjà pas mal). Pour l'exemple donné en fichier cible, il s'agit bien du résultat escompté (ne pas prendre en compte le contenu donné car c'est juste un exemple mais le format final est bien celui-là)

Par contre, il me reste à nommer les colonnes comme dans le fichier cible. Et puis sauvegarder automatiquement les classeurs ainsi générés dans un répertoire désigné dans la macro (j'ai essayé une solution que j'ai trouvé justement sur le forum, sans succès)

Comme c'est la 1ère fois que ça m'arrive de faire du VBA, alors tout ne me parait pas évident car je dois partir de loin...

Merci encore
 
Dernière modification par un modérateur:

Modeste

XLDnaute Barbatruc
Re : Créer une macro qui découpe un fichier Excel en plusieurs fichiers différents

Re,

Pas trop de temps aujourd'hui pour fignoler, mais regarde déjà à la pièce jointe:
- les filtres automatiques doivent être activés (on peut le faire au début du code)
- ajouté une feuille Modèle (avec les titres de colonnes de ton fichier cible) ... mais je ne sais pas quelles colonnes de l'un correspondent à quelles colonnes de l'autre. J'ai donc considéré qu'elles étaient dans le même ordre dans les deux tableaux?
- le chemin (au début du code) sera à adapter
- pas compris ce que tu voulais utiliser comme nom de fichier (j'ai repris le SOCGL, en attendant)
- je ne me suis pas occupé non plus du sous-total ... que fait-on des sous-totaux "intercalés" (dans les C06, notamment)??

Je te laisse le soin de découvrir ... et d'adapter. Je repasserai voir en fin de journée.
 

Pièces jointes

  • Splitter (cbenali).xlsm
    37 KB · Affichages: 184

cbenali

XLDnaute Nouveau
Re : Créer une macro qui découpe un fichier Excel en plusieurs fichiers différents

Re bonjour Modeste,

ton code fonctionne très bien. J'ai juste quelques remarques:

- quand je renseigne mon chemin où les fichiers seront enregistrés, la macro me les mets dans le dossier parent pas dans le dossier spécifié !! je comprends pas pourquoi

- pour le nom de fichier j'avais oublié de le préciser (désolé): il faut que les fichiers générés soient nommés comme suit "ces_extrait_impots_cesximpo_code société de la colonne C"

- Pour le sous-total il faut le laisser dans le fichier et le récupérer à la fin de chaque fichier (pour le c06, aucun changement aussi. je veux les faire apparaître comme dans le fichier de départ)


Merci beaucoup Modeste
 

Modeste

XLDnaute Barbatruc
Re : Créer une macro qui découpe un fichier Excel en plusieurs fichiers différents

Bonsoir,

quand je renseigne mon chemin où les fichiers seront enregistrés, la macro me les mets dans le dossier parent pas dans le dossier spécifié !! je comprends pas pourquoi
À la fin du chemin, le dernier caractère est bien un '\' (antislash ou backslash)?

pour le nom de fichier j'avais oublié de le préciser (désolé): il faut que les fichiers générés soient nommés comme suit "ces_extrait_impots_cesximpo_code société de la colonne C"
Modifie la ligne où le fichier est sauvegardé comme suit:
Code:
ActiveWorkbook.SaveAs chemin & "ces_extrait_impots_cesximpo_" & k & ".xlsx"

Pour le sous-total il faut le laisser dans le fichier et le récupérer à la fin de chaque fichier (pour le c06, aucun changement aussi. je veux les faire apparaître comme dans le fichier de départ)
Posée autrement (et pour ne pas "alourdir" la macro) ma question serait: comme je filtre les données sur chaque nom de société, ne peut-on pas filtrer en plus sur les "vides" en colonne A? De cette manière, on garderait les sous-totaux du fichier initial, mais ils ne seraient pas copiés dans le fichier résultat?
S'il faut les garder dans ce dernier, peut-on simplement faire la somme de la colonne Q et ... diviser par 2? (ceci implique qu'il n'y ait jamais d'erreurs dans les sous-totaux "intermédiaires")?
Le résultat doit-il être une formule ou une constante?
 

cbenali

XLDnaute Nouveau
Re : Créer une macro qui découpe un fichier Excel en plusieurs fichiers différents

Bonjour Modeste,

désolé pour la petite absence :)

- Pour le chemin, c'est bon réglé!

- Pour le nom des fichiers, réglé aussi!

- Pour le sous total, même si j'ai pas compris pourquoi t'as dû filtrer sur les colonnes (d'ailleurs peut-on le faire sans filtrer?), le résultat est bien là (j'ai les sous-totaux) --> pour si le résultat devait être une formule ou une constante? en fait même si la formule devrait en principe donner le même résultat, je préfère que ce soit une constante, comme ça on est sûr de recopier ce qui est dans le fichier de départ.

- J'ai une dernière demande stp! En l'état la macro me génère la ligne du total global dans un fichier à part (dernière ligne du fichier de départ. peut-on ignorer cette ligne dans la macro ?

Merci encore :)
 

Modeste

XLDnaute Barbatruc
Re : Créer une macro qui découpe un fichier Excel en plusieurs fichiers différents

Bonjour,

Ravi de te retrouver :)

j'ai pas compris pourquoi t'as dû filtrer sur les colonnes
C'est la technique que j'utilise dans la macro pour générer les différents fichiers: pour chaque nom de société présent en colonne C, je filtre la liste, je copie les données résultantes dans un nouveau fichier et ainsi de suite.

Pour la somme dans chaque feuille tu n'as pas dit si je pouvais sommer toute la colonne et diviser par deux. C'est donc la manip que j'ai choisi d'utiliser ... tu verras bien si ça convient

Pour le fichier créé avec le TOTAL, la solution la plus simple serait d'effacer la mention en colonne C (puisque déjà présente en A) avant d'exécuter la macro. Dans le code ci-dessous, j'ai utilisé une autre technique (commentée) ... ici aussi, c'est toi qui doit vérifier si ça conviendra dans tous les cas!

Vérifie aussi le texte en colonne A de chaque fichier généré, à hauteur du total par société.

Copie-colle ces lignes de code à la place des précédentes:
VB:
Sub extraire()
chemin = "'C:\monDossier\monSousDossier\" 'à adapter!
Set src = ThisWorkbook.Sheets("cseximpo")
Set liste = CreateObject("scripting.dictionary")
Application.ScreenUpdating = False
For lig = 2 To src.Cells(Rows.Count, 3).End(xlUp).Row - 1 '-1 si TOTAL est toujours en toute dernière position en colonne C
    liste(src.Cells(lig, 3).Value) = ""
Next lig

For Each k In liste.keys
    If Dir(chemin & "ces_extrait_impots_cesximpo_" & k & ".xlsx") <> "" Then _
        MsgBox "Un fichier nommé ces_extrait_impots_cesximpo_" & k & vbCr & vbCr & "déjà existant dans " & vbCr & vbCr & "" & chemin & ""
    src.[A1].CurrentRegion.AutoFilter Field:=3, Criteria1:=k
    ThisWorkbook.Sheets("Modèle").Copy
    With ActiveWorkbook
        src.[A1].CurrentRegion.Offset(1, 0).Copy .Sheets(1).Cells(3, 1)
        .Sheets(1).Cells(.Sheets(1).Cells(Rows.Count, 17).End(xlUp).Row + 1, 1) = "S/T CLE=" & k
        .Sheets(1).Cells(Rows.Count, 17).End(xlUp).Offset(1, 0) = Application.Sum(.Sheets(1).Cells(3, 17).Resize(Application.Count(.Sheets(1).[Q:Q]), 1)) / 2
        .SaveAs chemin & "ces_extrait_impots_cesximpo_" & k & ".xlsx"
        .Close
    End With
Next k
src.ShowAllData
Application.ScreenUpdating = True
End Sub
 

cbenali

XLDnaute Nouveau
Re : Créer une macro qui découpe un fichier Excel en plusieurs fichiers différents

Re,

- Pour le total, la solution '-1' fonctionne bien. Je n'ai plus de fichier pour la ligne TOTAL!

- Pour le texte en colonne A, il est bien présent pour chaque fichier à hauteur de la ligne Total

- Par contre, peux-tu m'expliquer l'astuce de la division par 2 ?! il se peut que je manque d'inspiration aujourd'hui mais j'arrive pas à voir pourquoi forcement 2 ? :p

Merci
 

Modeste

XLDnaute Barbatruc
Re : Créer une macro qui découpe un fichier Excel en plusieurs fichiers différents

Re,

En vitesse: je dois partir ...
Comme je le disais précédemment, il y a, pour une même société, des sous-totaux "intermédiaires" La simple somme de toute la colonne donnerait l'addition des valeurs "normales" ET de ces sous-totaux intermédiaires. D'où ma précédente mise en garde quand je proposais de diviser la somme de la colonne par 2:
ceci implique qu'il n'y ait jamais d'erreurs dans les sous-totaux "intermédiaires"

Prends le temps de réfléchir ... Si cette méthode n'est pas sûre, on peut toujours faire autrement!

@ + tard
 

cbenali

XLDnaute Nouveau
Re : Créer une macro qui découpe un fichier Excel en plusieurs fichiers différents

Oui je vois maintenant la logique, c'est efficace!

Par contre, si ce n'est pas fastidieux à faire, je préférerais lire tout simplement le sous total sur la ligne correspondante dans le tableau de départ (il s'agit de données récupérées sur une base de donnée) et c'est juste par précaution que je préfère cette méthode --> dans ce cas là je me pencherais alors vers ta solution initiale de filtrer sur la colonne A

Merci :)
 

Modeste

XLDnaute Barbatruc
Re : Créer une macro qui découpe un fichier Excel en plusieurs fichiers différents

je préférerais lire tout simplement le sous total sur la ligne correspondante dans le tableau de départ

À mon avis on ne se comprend pas: dans ton tableau de départ, il n'y a pas de total pour le SOCGL C06 ... on ne peut donc pas le lire! Par contre il y a un sous-total C0610, un sous-total C0620, C0622, etc. Ce sont ceux-là que j'appelle des sous-totaux intermédiaires (et eux, je ne les recalcule pas, dans la macro).
Quand, dans le fichier C06, créé par la macro, j'ajoute un total global en ligne 85, si je fais le total de toute la colonne, j'additionne les valeurs pour chaque "Centre GL" et le sous-total de chaque "Centre GL" ... Tu me suis? C'est pour ça que je demande si je peux tout additionner et diviser en deux.
Concrètement, pour le fichier C06, le total en Q85 est-il correct? Et le total global en fin de colonne Q de chacun des fichiers générés?

Et si c'est moi qui ne t'ai pas compris, j'en suis désolé ... mais il faudra expliquer plus lentement :eek:
 

cbenali

XLDnaute Nouveau
Re : Créer une macro qui découpe un fichier Excel en plusieurs fichiers différents

Re,

- Le total Q85 de C06 ainsi que tous les totaux des autres fichiers sont corrects!

- En fait, pour la ligne Total global, sa présence ne me fait aucun mal mais elle n'a pas un intérêt particulier non plus (Toutes les entités dérivées de C06 sont des entités indépendantes dans mon analyse, donc pas besoin d'en calculer un total global) --> Ceci dit, gardons-le pour l'instant! Sinon si jamais je souhaitais la supprimer plus tard, pourras-tu me dire ce qu'il faut modifier dans le code pour ce faire ?

Merci encore
 

Discussions similaires

Statistiques des forums

Discussions
312 164
Messages
2 085 875
Membres
103 007
dernier inscrit
salma_hayek