Eclater une bdd sur plusieurs onglets du classeur en fonction d'un critere

Bonjour à tous

Je viens solliciter votre aide, ô combien précieuse car je n'y arrive pas !

J'ai une BDD au format .csv que je souhaite conserver en l'état MAIS que je souhaite aussi éclater sur plusieurs onglets en fonction des motifs présents dans la colonne AJ intitulée COL 36 dans mon fichier exemple.

Ensuite, je souhait enregistrer ce fichier dans un répertoire différent (ActiveWorkbook.SaveAs) mais en conservant son nom d'origine (InitialFileName) et en modifiant son extension en .XLSX

Au départ je suis passée par un TCD pour pouvoir éclater la BDD comme je le ferai manuellement mais en VBA je ne sais pas le faire.

Et pour l'enregistrement j'étais pas loin mais j'ai des soucis pour conserver le nom du fichier initial.

Je vous joins un fichier .csv à titre d'exemple.

En espérant qu'une bonne âme voudra bien se pencher sur ma requête pour m'aider à avancer.

Salutations.

J'ai omis de préciser que la base de donnée sera mise "sous forme de tableau"

Bonjour,
Voici un début de proposition avec PowerQuery. Mais je ne suis pas certain d'avoir bien compris votre requête.

Bonjour,
Si j'ai bien compris, il faut éclater la base de données dans des onglets "MOTIF *"

Une proposition en VB :

15test-motifs.xlsm (64.33 Ko)

Bonjour Optimix

Merci beaucoup ! grâce à toi j'avance !

Alors ta proposition fonctionne très bien si ce n'est que le nom de la feuille ne sera jamais le même (la date sera adaptée chaque jour) du coup quand je teste sur un autre fichier avec nom de feuille différent (de par la date qui change chaque jour)

image

Cette partie du code bug dès lors que la feuille est nommée différemment, il faudrait ne pas mettre le nom de la feuille en dur

image

D'autre part, on voit les lignes se copier une à une lors de l’exécution de la macro.

Sais-tu aussi comment je pourrai enregistrer le fichier csv de base au format excel en gardant son nom d'origine dans un autre répertoire ?

en fait j'arrive à enregistrer sous au format excel mais je ne parviens pas à conserver le nom initial.

Bonjour Fcyspm30

Merci de ta proposition mais ce n'est pas ce que je cherche.

Bien cordialement.

Bon, j'ai ajouté Application.ScreenUpdating = False en entrée et Application.ScreenUpdating = True en sortie et c'est OK, je ne vois plus la copie des lignes une à une.

Par contre toujours un problème avec le nom de la feuille qui est variable et donc ne peut pas être inscrit en dur

+ mon souci d’enregistrement

Cordialement

Bonjour Marinekali,

Ce problème est très facile à régler si on connaît le n° d'ordre de l'onglet dans le classeur.
Dans l'exemple que je vous ai donné, l'onglet n° 1 (donc le plus à gauche) s'appelle "Accueil". Le 2 a pour nom "20240822-test-motifs-xlp".
Il faut donc remplacer :

Set wS1 = Sheets("20240822-test-motifs-xlp")

par :

Set wS1 = Sheets(2)

Vous seul connaissez la position de cette feuille, il faudra mettre son numéro d'ordre réel à la place du "2".

Vous avez bien utilisé Application.ScreenUpdating = False pour masquer la cuisine interne de votre macro.

Testez cette version :

12micmac.xlsm (30.94 Ko)

Bonjour

Bonjour à tous

Une variante

15essai.xlsm (22.15 Ko)

Bye !

Bonjour Messieurs Optimix et gmb

j'ai tardé à revenir vers vous et je m'en excuse.

j'ai regardé avec attention vos deux propositions.

Les deux fonctionnent SAUF que les motifs figurant dans la colonne AJ, colonne 36 ne seront pas nommés Motif 1, Motif 2, etc....

de plus je ne récupère pas mes vrais intitulés de colonne quand je l’exécute sur le vrai fichier (j'ai en dur COL1, COL2, etc..)

Dans la proposition de gmb, j'ai le même souci et en plus ça me crée un nouveau classeur avec les différents onglets sans garder la base de données d'origine.

Je me dit que j'ai peut-être mal exprimé le besoin au départ :

Sur le fichier joint en exemple je souhaite pouvoir exécuter une macro qui :

1- doit conserver la base de données d'origine; à savoir la Feuil1

2- mettre "sous forme de tableau" la base de données Feuil1

2- puis filtrer la colonne AJ soit la colonne 36 sur l'ensemble des valeurs présentent une à une

3- copier-coller les lignes correspondantes aux filtres effectués (selon le nombre de valeur) sur d'autres feuilles du classeur Feuil2, Feuil3, Feuil4, etc....(autant de feuilles qu'il y a de valeurs différentes dans la colonne filtrée)

4- nommer chaque feuille nouvellement créée par la valeur du filtre appliqué (les valeurs réelles présentent dans mon fichier sont longues et peuvent dépasser le nombre de caractère autorisé pour le nommage des feuilles mais c'est pas très grave)

Merci du temps que vous consacrez sur ce site pour aider des gens comme moi.

Bien cordialement.

Nouveau fichier exemple en pièce jointe avec d'autres exemples de motifs" à rallonge...

(colonne AJ, 36)

Bo n,our

Bonjour à tous

Nouvelle version

Bye !

Gmb bonsoir et encore merci pour ton retour.

Je viens de tester sur le fichier test et ça tourne du feu de dieu !

Toutefois dès que je l’exécute sur mon fichier pourtant de structure identique au fichier test ça plante ici : ActiveSheet.Name = Left(tablo(i, 36), 31)

image

Aussi il faudrait qu'une fois les données éclatées sous plusieurs onglets, l'ensemble des tableaux soient présentés "sous forme de tableau". Aussi je me demandais si je pouvais déplacer la partie du code que tu as mis à la fin dès le début de la macro de sorte à ce que soit aussi copié la mise en forme..car dans ta proposition seul le tableau de la feuille d'origine est mis en forme. Les autres ne le sont pas.

image

Salutations Gmb

Je suis admirative tant cela à l'air d'être un jeu d'enfant pour vous.

Est-ce que cela peut venir du nombres de caractères de certains des motifs sur lesquels le filtre s'applique et créé les feuilles correspondantes ?

En effet le minimum de caractères est de 21 et 81 au maximum !

il devrait prendre les 31 premiers caractères de la chaine de valeur à minima, non ? Je ne comprends pas ce qui pose problème. Décidément c'est pas simple !

Je suis en train de me dire que le problème vient surement du fait que quelques un des motifs à éclater comportent des caractères spéciaux tels que / ou (), je pense qu'ils n'arrivent pas à nommer les feuilles sur ce genre de motifs ! c'est la cata !

il devrait prendre les 31 premiers caractères de la chaine de valeur à minima, non ? Je ne comprends pas ce qui pose problème

Peut-êtrre y a -t-il dans le nom un caractère interdit tel que : / \ ? * [ ou encore : ]

Sinon, je ne vois pas non plus...

Bye !

Oui c'est ce que j'ai écrit dans mon dernier message. J'ai recherché et supprimé les caractères spéciaux et ça fonctionne très bien.

Juste pouvez vous me dire comment mettre sous forme de tableau tous les tableaux une fois éclatés. Seule la BDD d'origine est mise en forme.

Je vous remercie grandement pour votre aide.

Bonjour

Nouvelle version

Si on savait quels sont ces caractères spéciaux que tu as enlevés vraisemblablement à la main, on pourrait essayer d'inclure cette manip dans la macro...

Bye !

Gmb, un grand merci.

Pour les caractères spéciaux, je vous l'avais indiqué plus haut, il s'agit de parenthèses () et de slash / présents dans la colonne AJ, 36

Je devrai pouvoir m'en sortir enfin j'espère.

Belle journée à vous.

image
Rechercher des sujets similaires à "eclater bdd onglets classeur fonction critere"