Création de fichier à partir de données filtrées - macro

chasseur44

XLDnaute Occasionnel
Bonjour à tous
J'aurais besoin d'un coup de main sur une macro
à partir du fichier classeur.xls (joint), à partir des champs 6 et 7, je souhaite créée un (ou des) fichier supplémentaire en fonction des valeurs du champs 7 et des onglets à partir du champs 6.
En fait je veux obtenir un fichier pour chaque champs 7 (j'utiliserai le nom de la valeur de champ pour enregistrer) et à l'intérier de ce fichier x onglets avec comme nom d'onglet les valeur du champs 6.
Merci de votre aide à tous
 

Pièces jointes

  • Classeur1.xls
    21 KB · Affichages: 38
  • Classeur1.xls
    21 KB · Affichages: 42
  • Classeur1.xls
    21 KB · Affichages: 42

Robert

XLDnaute Barbatruc
Repose en paix
Re : Création de fichier à partir de données filtrées - macro

Bonjour Chasseur, bonjour le forum,

En pièce jointe ton fichier avec le code ci-dessous :
Code:
Sub Macro1()
Dim ch As String 'déclare la variable ch (CHemin d'accès)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim pl As Range 'déclare la variable pl (PLage)
Dim d As Object 'déclare la variable d (Dictionaire)
Dim tp6 As Variant 'déclare la variable tp6 (TemPoraire champ 6)
Dim tp7 As Variant 'déclare la variable tp7 (TemPoraire champ 7)
Dim i As Long 'déclare la variable i (Incrément)
Dim j As Long 'déclare la variable j (incrément)

ch = ThisWorkbook.Path 'définit le chemin d'accès ch
With Sheets("Feuil1") 'prend en compte l'onglet "Feuil1")
    dl = .Cells(Application.Rows.Count, 7).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 7 (=G)
    If dl = 1 Then Exit Sub 'si aucune données de champ 7, sort de la procédure
    Set pl = .Range("G2:G" & dl) 'définit la plage pl
    Set d = CreateObject("Scripting.Dictionary") 'définit le dictionnaire d
    For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
        d(cel.Value) = "" 'alimente le dictionnaire
    Next cel 'prochaine cellule de la boucle
    tp7 = d.keys 'récupère les valeurs uniques (sans doublon) du champ 7 dans le tableau temporaire tp7
    dl = .Cells(Application.Rows.Count, 6).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 6 (=F)
    Set pl = .Range("F2:F" & dl) 'définit la plage pl
    Set d = CreateObject("Scripting.Dictionary") 'définit le dictionnaire d
    For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
        d(cel.Value) = "" 'alimente le dictionnaire
    Next cel 'prochaine cellule de la boucle
    tp6 = d.keys 'récupère les valeurs uniques (sans doublon) du champ 6 dans le tableau temporaire tp6
End With 'fin de la prise en compte de l'onglet "Feuil1"
For i = 0 To UBound(tp7) 'boucle 1 : sur tous les éléments du tableau tp7
    Application.SheetsInNewWorkbook = UBound(tp6) + 1 'définit le nombre d'onglets pour les nouveau classeurs
    Workbooks.Add 'ajoute un classeu
    For j = 0 To UBound(tp6) 'boucle 2 : sur toutes les valeurs du tableau tp6
        Sheets(j + 1).Name = tp6(j) 'renomme les onglets du nouveau classseur par rapport au valeurs uniques du champs 6
    Next j 'prochaine valeur de la boucle 2
    ActiveWorkbook.SaveAs Filename:=ch & "\" & tp7(i) & ".xls" 'renomme le classeur par rapport au tableau tp7
    'ActiveWorkbook.Close SaveChanges = True 'ne sachant pas si tu désirais garder le classeur ouvert ou le fermer j'ai commenter cette ligne...
Next i 'prochaine vlaeur de la boucle 1
Application.SheetsInNewWorkbook = 3 'rétablit à 3 le nombre d'onglets par défaut dans les nouveaux classeurs
End Sub

Le fichier :
 

Pièces jointes

  • Chasseur44_v01.xls
    42.5 KB · Affichages: 40

chasseur44

XLDnaute Occasionnel
Re : Création de fichier à partir de données filtrées - macro

Merci Robert
Je me suis legérement trompé dans mon intitulé (excuse moi) c'est sur les champs 5 et 6
J'ai essayé de renommé tes variables mais je n'y arrive pas.
En fait à partir de ces deux champs je souhaite créer des fichiers avec les données correspondantes exemple si je prends la première valeur existante du champs 6 "CD01", je souhaite que la macro crée un fichier CD01 avec trois onglets (ds ce cas) 1C, 2C, 3C ainsi que les données des autres champs correspondant au criètres des champs 5 et 6 et ainsi de suite !
Merci de ton appui (je joint le fichier)
 

Pièces jointes

  • Chasseur44_v01(1).xls
    42.5 KB · Affichages: 34

Robert

XLDnaute Barbatruc
Repose en paix
Re : Création de fichier à partir de données filtrées - macro

Bonjour Chasseur, bonjour le forum,

Ton fichier adapté (la version 02) avec le code ci-dessous :
Code:
Sub Macro1()
Dim ch As String 'déclare la variable ch (CHemin d'accès)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim pl As Range 'déclare la variable pl (PLage)
Dim d1 As Object 'déclare la variable d1 (Dictionaire 1)
Dim d2 As Object 'déclare la variable d2 (Dictionaire 2)
Dim tp5 As Variant 'déclare la variable tp5 (TemPoraire champ 5)
Dim tp6 As Variant 'déclare la variable tp6 (TemPoraire champ 6)
Dim i As Long 'déclare la variable i (Incrément)
Dim j As Long 'déclare la variable j (incrément)

ch = ThisWorkbook.Path 'définit le chemin d'accès ch
With Sheets("Feuil1") 'prend en compte l'onglet "Feuil1"
    dl = .Cells(Application.Rows.Count, 6).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 6 (=F)
    If dl = 1 Then Exit Sub 'si aucune données de champ 6, sort de la procédure
    Set pl = .Range("F2:F" & dl) 'définit la plage pl
    Set d1 = CreateObject("Scripting.Dictionary") 'définit le dictionnaire d1
    For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
        d1(cel.Value) = "" 'alimente le dictionnaire d1
    Next cel 'prochaine cellule de la boucle
    tp6 = d1.keys 'récupère les valeurs uniques (sans doublon) du champ 6 dans le tableau temporaire tp6
    For i = 0 To UBound(tp6) 'boucles 1 : sur toutes les valeurs du tableau tp6
        Set d2 = CreateObject("Scripting.Dictionary") 'définit le dictionnaire d2
        .Range("A1").AutoFilter Field:=6, Criteria1:=tp6(i) 'filtre le champ 6 en fonction du critère tp6(i)
        For Each cel In pl.Offset(0, -1).SpecialCells(xlCellTypeVisible) 'boucle 2 : sur toutes les cellules visibles de la colonne E
            d2(cel.Value) = "" 'alimente le dictionnaire d2
        Next cel 'prochaine cellule de la boucle 2
        tp5 = d2.keys 'récupère les valeurs uniques (sans doublon) du champ 5 filtré dans le tableau temporaire tp5
        .Range("A1").AutoFilter 'annule le filtre automatique
        Application.SheetsInNewWorkbook = UBound(tp5) + 1 'définit le nombre d'onglets pour les nouveau classeurs
        Workbooks.Add 'ajoute un classeu
        For j = 0 To UBound(tp5) 'boucle 3 : sur toutes les valeurs du tableau tp5
            Sheets(j + 1).Name = tp5(j) 'renomme les onglets du nouveau classeur par rapport au valeurs uniques du tableau tp5
        Next j 'prochaine valeur de la boucle 3
        ActiveWorkbook.SaveAs Filename:=ch & "\" & tp6(i) & ".xls" 'renomme le classeur par rapport au tableau tp6
        ActiveWorkbook.Close SaveChanges = True 'ferme le classeur créé (à commenter si tu veux le garder ouvert)
        Erase tp5 'vide les tableau temporaires tp5
    Next i 'prochaine valeur de la boucle 1
End With 'fin de la prise en compte de l'onglet "Feuil1"
Application.SheetsInNewWorkbook = 3 'rétablit à 3 le nombre d'onglets par défaut dans les nouveaux classeurs
End Sub

Le Fichier :
 

Pièces jointes

  • Chasseur44_v02.xls
    46 KB · Affichages: 52

chasseur44

XLDnaute Occasionnel
Re : Création de fichier à partir de données filtrées - macro

Merci Robert pour ton aide
pourquoi je n'ai aucun enregistrement dans les fichiers découpés ?
Enregistrements correspondants aux différents critères du champs 6 (pour le fichier) et du champs 5 pour les onglets.
Merci
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Création de fichier à partir de données filtrées - macro

Bonjour Chasseur, bonjour le forum,

En pièce jointe la version 03 avec le code ci-dessous :
Code:
Sub Macro1()
Dim ch As String 'déclare la variable ch (CHemin d'accès)
Dim lt As Variant 'déclare la varialbe lt (Ligne éTiquettes)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim pl As Range 'déclare la variable pl (PLage)
Dim ple As Range 'déclare la variable pla (PLage Entière)
Dim d1 As Object 'déclare la variable d1 (Dictionaire 1)
Dim d2 As Object 'déclare la variable d2 (Dictionaire 2)
Dim tp6 As Variant 'déclare la variable tp6 (TemPoraire champ 6)
Dim tp5 As Variant 'déclare la variable tp5 (TemPoraire champ 5)
Dim i As Long 'déclare la variable i (Incrément)
Dim j As Long 'déclare la variable j (incrément)
Dim tb() As Variant 'déclare le tableau de variables indéxées tb (TaBleau)

ch = ThisWorkbook.Path 'définit le chemin d'accès ch
With Sheets("Feuil1") 'prend en compte l'onglet "Feuil1"
    lt = .Range("A1:K1") 'définit la ligne d'étiquettes lt
    dl = .Cells(Application.Rows.Count, 6).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 6 (=F)
    If dl = 1 Then Exit Sub 'si aucune données de champ 6, sort de la procédure
    Set pl = .Range("F2:F" & dl) 'définit la plage pl
    Set ple = .Range("A2:K" & dl) 'définit la plage entière ple
    Set d1 = CreateObject("Scripting.Dictionary") 'définit le dictionnaire d1
    For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
        d1(cel.Value) = "" 'alimente le dictionnaire d1
    Next cel 'prochaine cellule de la boucle
    tp6 = d1.keys 'récupère les valeurs uniques (sans doublon) du champ 6 dans le tableau temporaire tp6
    For i = 0 To UBound(tp6) 'boucles 1 : sur toutes les valeurs du tableau tp6
        Set d2 = CreateObject("Scripting.Dictionary") 'définit le dictionnaire d2
        .Range("A1").AutoFilter Field:=6, Criteria1:=tp6(i) 'filtre le champ 6 en fonction du critère tp6(i)
        For Each cel In pl.Offset(0, -1).SpecialCells(xlCellTypeVisible) 'boucle 2 : sur toutes les cellules visibles de la colonne E
            d2(cel.Value) = "" 'alimente le dictionnaire d2
        Next cel 'prochaine cellule de la boucle 2
        tp5 = d2.keys 'récupère les valeurs uniques (sans doublon) du champ 5 filtré dans le tableau temporaire tp5
        ReDim tb(UBound(tp5))  'redimensionne le tableau de variables indexée tb
        For j = 0 To UBound(tp5) 'boucle 3 : sur toutes les valeurs du tableau tp5
            .Range("A1").AutoFilter Field:=5, Criteria1:=tp5(j) 'filtre le champ 5 en fonction du critère tp5(j)
            tb(j) = ple.SpecialCells(xlCellTypeVisible) 'définit la variable indéxée tb(j)
            .Range("A1").AutoFilter Field:=5 'supprime le filtre sur le champ 5
        Next j 'prochaine valeur de la boucle 3
        .Range("A1").AutoFilter 'annule le filtre automatique
        Application.SheetsInNewWorkbook = UBound(tp5) + 1 'définit le nombre d'onglets pour les nouveau classeurs
        Workbooks.Add 'ajoute un classeur
        For j = 0 To UBound(tp5) 'boucle 3 : sur toutes les valeurs du tableau tp5
            Sheets(j + 1).Name = tp5(j) 'renomme l'onglet du nouveau classeur par rapport au valeurs uniques du tableau tp5
            Sheets(j + 1).Range("A1").Resize(1, 11) = lt 'ajoute la ligne d'étiquettes
            Sheets(j + 1).Range("A2").Resize(UBound(tb(j), 1), 11) = tb(j) 'ajoute les données correspondantes
        Next j 'prochaine valeur de la boucle 3
        ActiveWorkbook.SaveAs Filename:=ch & "\" & tp6(i) & ".xls" 'renomme le classeur par rapport au tableau tp6
        ActiveWorkbook.Close SaveChanges = True 'ferme le classeur créé (à commenter si tu veux le garder ouvert)
        Erase tp5: Erase tb 'vide les tableaux tp5 et tb
    Next i 'prochaine valeur de la boucle 1
End With 'fin de la prise en compte de l'onglet "Feuil1"
Application.SheetsInNewWorkbook = 3 'rétablit à 3 le nombre d'onglets par défaut dans les nouveaux classeurs
End Sub

Le fichier :
 

Pièces jointes

  • Chasseur44_v03.xls
    52.5 KB · Affichages: 47

chasseur44

XLDnaute Occasionnel
Re : Création de fichier à partir de données filtrées - macro

Robert t'es un dieu;)
J'ai appliqué et adapté ta métodho sur mon fichier : Résultat impeccable et rapide
Si tu étais à proximité ; c'est direct une terrasse de café avec une bonne bière bien Fraiche !
Merci énormément et vive le forum
 

chasseur44

XLDnaute Occasionnel
Re : Création de fichier à partir de données filtrées - macro

Heu Robert j'ai parlé trop vite ! mais tu es toujours un dieu :)
sur mon vrai fichier j'ai un paquet de ligne et à chaque fois la création des fichiers et onglets marchent parfaitement mais j'ai qu'un enregistrement à chaque fois ?
dans l'exemple je suis resté light mais comment sélectionner toutes les données en fonction des filtrages effectuées pour les transférer la ou il faut ?

Sheets(j + 1).Range("A2").Resize(UBound(tb(j), 1), 44) = tb(j) 'ajoute les données correspondantes

Comment lui dire de prendre toutes les données correspondant aux critères car j'ai (dans la vrai vie) plusiures lignes correspondant à ces critères (25000 lignes) !

Merci robert
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Création de fichier à partir de données filtrées - macro

Bonjour Chasseur, bonjour le forum,

En pièce jointe la version 04 qui semble bien fonctionner, sur quelques lignes... À tester sur ton fichier original. Le code :
Code:
Sub Macro1()
Dim ch As String 'déclare la variable ch (CHemin d'accès)
Dim lt As Variant 'déclare la varialbe lt (Ligne éTiquettes)
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim pl As Range 'déclare la variable pl (PLage)
Dim ple As Range 'déclare la variable ple (PLage Entière)
Dim d1 As Object 'déclare la variable d1 (Dictionaire 1)
Dim d2 As Object 'déclare la variable d2 (Dictionaire 2)
Dim tp6 As Variant 'déclare la variable tp6 (TemPoraire champ 6)
Dim tp5 As Variant 'déclare la variable tp5 (TemPoraire champ 5)
Dim i As Long 'déclare la variable i (Incrément)
Dim j As Long 'déclare la variable j (incrément)
Dim tb() As Range 'déclare le tableau de variables (plages) indéxées tb (TaBleau)

ch = ThisWorkbook.Path 'définit le chemin d'accès ch
With Sheets("Feuil1") 'prend en compte l'onglet "Feuil1"
    lt = .Range("A1:K1") 'définit la ligne d'étiquettes lt
    dl = .Cells(Application.Rows.Count, 6).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 6 (=F)
    If dl = 1 Then Exit Sub 'si aucune données de champ 6, sort de la procédure
    Set pl = .Range("F2:F" & dl) 'définit la plage pl
    Set ple = .Range("A2:K" & dl) 'définit la plage entière ple
    Set d1 = CreateObject("Scripting.Dictionary") 'définit le dictionnaire d1
    For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
        d1(cel.Value) = "" 'alimente le dictionnaire d1
    Next cel 'prochaine cellule de la boucle
    tp6 = d1.keys 'récupère les valeurs uniques (sans doublon) du champ 6 dans le tableau temporaire tp6
    For i = 0 To UBound(tp6) 'boucles 1 : sur toutes les valeurs du tableau tp6
        Set d2 = CreateObject("Scripting.Dictionary") 'définit le dictionnaire d2
        .Range("A1").AutoFilter Field:=6, Criteria1:=tp6(i) 'filtre le champ 6 en fonction du critère tp6(i)
        For Each cel In pl.Offset(0, -1).SpecialCells(xlCellTypeVisible) 'boucle 2 : sur toutes les cellules visibles de la colonne E
            d2(cel.Value) = "" 'alimente le dictionnaire d2
        Next cel 'prochaine cellule de la boucle 2
        tp5 = d2.keys 'récupère les valeurs uniques (sans doublon) du champ 5 filtré dans le tableau temporaire tp5
        ReDim tb(UBound(tp5))  'redimensionne le tableau de plages indexée tb
        For j = 0 To UBound(tp5) 'boucle 3 : sur toutes les valeurs du tableau tp5
            .Range("A1").AutoFilter Field:=5, Criteria1:=tp5(j) 'filtre le champ 5 en fonction du critère tp5(j)
            Set tb(j) = ple.SpecialCells(xlCellTypeVisible) 'définit la plage indéxée tb(j)
            .Range("A1").AutoFilter Field:=5 'supprime le filtre sur le champ 5
        Next j 'prochaine valeur de la boucle 3
        .Range("A1").AutoFilter 'annule le filtre automatique
        Application.SheetsInNewWorkbook = UBound(tp5) + 1 'définit le nombre d'onglets pour les nouveau classeurs
        Workbooks.Add 'ajoute un classeur
        For j = 0 To UBound(tp5) 'boucle 3 : sur toutes les valeurs du tableau tp5
            Sheets(j + 1).Name = tp5(j) 'renomme l'onglet du nouveau classeur par rapport au valeurs uniques du tableau tp5
            Sheets(j + 1).Range("A1").Resize(1, 11) = lt 'ajoute la ligne d'étiquettes
            tb(j).Copy Sheets(j + 1).Range("A2") 'ajoute la plage correspondante à partir de A2
        Next j 'prochaine valeur de la boucle 3
        ActiveWorkbook.SaveAs Filename:=ch & "\" & tp6(i) & ".xls" 'renomme le classeur par rapport au tableau tp6
        ActiveWorkbook.Close SaveChanges = True 'ferme le classeur créé (à commenter si tu veux le garder ouvert)
        Erase tp5: Erase tb 'vide les tableaux tp5 et tb
    Next i 'prochaine valeur de la boucle 1
End With 'fin de la prise en compte de l'onglet "Feuil1"
Application.SheetsInNewWorkbook = 3 'rétablit à 3 le nombre d'onglets par défaut dans les nouveaux classeurs
End Sub


Le fichier :

[Édition]
Garçon ! Deux bières s'il vous plaît...
 

Pièces jointes

  • Chasseur44_v04.xls
    59.5 KB · Affichages: 46

fifidu53

XLDnaute Nouveau
Filtre sur 2 colonnes

Bonjour à tous.

Je suis nouveau sur le forum et je ne sais pas si je suis au bon endroit pour poser ma question, alors merci de m'excuser.

Je souhaiterai faire un filtre sur un tableau excel de tel sorte que je ne puisse afficher, au besoin, que les lignes sur lesquelles soit la colonne H soit la colonne I est renseignée (et par conséquent qu’il ne m’affiche les lignes où les colonnes H et I sont vides)

Je vous joins mon fichier excel afin de mieux comprendre mon problème.

Tri.jpgRegarde la pièce jointe Adhérents.xlsx

Merci de votre aide.
 

Pièces jointes

  • Tri.jpg
    Tri.jpg
    85.2 KB · Affichages: 67
  • Tri.jpg
    Tri.jpg
    85.2 KB · Affichages: 64

Discussions similaires

Statistiques des forums

Discussions
312 329
Messages
2 087 334
Membres
103 520
dernier inscrit
Azise