Ventiler une base en feuilles et onglets - VBA

Lilma

XLDnaute Nouveau
Bonjour à tous,

Débutant en VBA, je me lance dans mon 1er gros projet. J’ai beau éplucher les forums je ne trouve pas la solution

Mon problème : Je dispose d’une base de données (TEST). Je souhaiterais :

- Étape 1 : Ventiler la base TEST sur plusieurs classeurs sur la base du champ CRITERE 1 (colonne N). Ces feuilles doivent être les mêmes que la base de données sur la forme et le fond (maintien des formules entre autre). Idéalement le classeur prendrait le nom du critère.

- Étape 2 : Sur l nouveau classeur crée, en plus du 1er onglet qui reprendrait toutes les données du CRITERE 1, il faudrait ventiler ce 1er onglet sur plusieurs autres onglets sur la base du CRITERE 2 (colonne O). Idem maintien du tableau tel qu’il est et attribution d’un nom à l’onglet sur la base du critère 2.

Cela fait 2 jours que je fais des tests dans tous les sens mais rien à faire, aucune de mes macros ne fonctionnent.

Merci par avance pour votre aide.

Lilma
 

Pièces jointes

  • Test Fichiers sources - v12.xlsm
    16 KB · Affichages: 58

Staple1600

XLDnaute Barbatruc
Re

Pour le coup, j'ai bossé un chouia moi aussi ;)
Ci-dessous la version qui créé N classeurs
(Mais faudrait pas lancer la macro deux fois de suite)
VB:
Sub EclaterClasseursV3()
'archive :JM | 2013
'auteur macro d'origine: JoeMo - avril 2013
Dim lR&, vA As Variant, d As Object, JT As Variant, Wsht As Worksheet, wb As Workbook
Dim Chemin As String
Chemin = ThisWorkbook.Path & "\"
Set Wsht = Sheets("TEST")
If Wsht.AutoFilterMode Then Wsht.Range("A9").AutoFilter
lR = Wsht.Range("N" & Rows.Count).End(xlUp).Row
vA = Wsht.Range("N10", "N" & lR).Value
Set d = CreateObject("Scripting.dictionary")
d.RemoveAll
For i = LBound(vA, 1) To UBound(vA, 1)
    If Not d.exists(vA(i, 1)) Then d.Add vA(i, 1), i
Next i
JT = d.keys
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For i = LBound(JT) To UBound(JT)
    With Wsht
        .Range("A9").AutoFilter field:=14, Criteria1:=JT(i)
        Wsht.UsedRange.Copy
        Set wb = Workbooks.Add(xlWBATWorksheet)
        With wb.Sheets(1)
            .Name = JT(i)
        With .Range("A1")
            .PasteSpecial Paste:=xlPasteColumnWidths
            .PasteSpecial Paste:=xlPasteAllUsingSourceTheme
        End With
        wb.SaveAs Chemin & wb.Sheets(1).Name & ".xlsx", 51
        wb.Close True
        Application.CutCopyMode = False
        Wsht.Select
        End With
    End With
Next i
If Wsht.AutoFilterMode Then Wsht.Range("A9").AutoFilter
Application.DisplayAlerts = True
End Sub
 

Lilma

XLDnaute Nouveau
Top ça fonctionne bien!
Du coip, pour le dispatch des nouveaux classeurs en onglets (étape 2 ), je ne sais pas si j'ai la bonne logique mais si:
-On adosse ton 1er code en début de discussion au code actuel
-On change le critère N en O,
Cela devrait permettre d’éclater les lignes non ?
 

Staple1600

XLDnaute Barbatruc
Re

Ici, il n'y a de bêtise. Il peut y avoir des erreurs.
Mais comme dit
img.php

"Le meilleur des maîtres, l'échec être "
;)

Appliquer le traitement avant de fermer, oui.
Mais pas avec le code tel qu'il est écrit.

Je laisse infuser mon thé (et la question) pour le moment.

J'y reviendrai plus tard.

D'ici là, normalement (mais rien n'est moins sûr), d'autres membres du forum auront peut-être pris le relais pour te filer un coup de main.
 
Dernière édition:

Lilma

XLDnaute Nouveau
Bonjour à tous,

Effectivement j'ai posté sur plusieurs forum. Est ce un crime ? A priori le multipostage est mal vu, je ne le savais pas. Sur le fond si j'ai besoin d'un diagnostique médical et qu'un médecin ne me recontacte pas, bien évidemment que je vais en appeler un second...Je suppose que chaque "univers" à ses règles...

En tout cas merci beaucoup pour votre aide!
 

Staple1600

XLDnaute Barbatruc
Re

@Lilma
Ce n'est pas un crime.
Simplement le signaler par un lien permet de ne pas proposer une solution qui existerait déjà sur l'un ou l'autre des forums.
Cela évite redondance et perte de temps.

Par exemple, dans le cas présent, ton problème est résolu sur l'autre forum.
Pourquoi ne pas l'avoir signalé ici?
 

Lilma

XLDnaute Nouveau
RE
Ok je comprends l'aspect pratique!
Je ne l'ai pas signalé parce que je ne l'avais pas vu. Tu auras remarqué que je n'ai rien répondu suite aux différents post contrairement à ici.
Et c'est quoi un MDI des TJ pour que je ne termine pas bête ?
 

Staple1600

XLDnaute Barbatruc
Re

Oh, c'est juste un trait d'humour (tel que souvent je les pratique sur ce forum)
Puisque tu as la curiosité de demander voici la réponse
un MDI des TJ
C'est un Membre Discourtois et Ignorant des Temps Jadis ;)
Mais rassures-toi, je viens de t'intégrer dans une nouvelle catégorie:
Tu es désormais un MDCCMN des TP
ou si tu préfères:
un Membre Désormais Courtois qui Connait le Multipostage et la Netiquette des Temps Présents.
 

Discussions similaires