IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Exporter un tableau vers X nouveaux classeurs Excel en filtrant sur une colonne


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Septembre 2019
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Exporter un tableau vers X nouveaux classeurs Excel en filtrant sur une colonne
    Bonjour !

    Je viens vers vous car j'ai un besoin simple mais que je n'arrive pas à combler:

    J'ai un tableau en fichier joint qui doit me permettre de filtrer l'onglet par trigramme dans la colonne "who" puis generer un fichier excel séparé par personne dans la colonne "who" et l'enregistrer.
    Je suis parti du tuto de "Philippe Tulliez" ici: https://philippetulliez.developpez.c...dvancedfilter/

    ça ok j'ai compris.
    Cependant si je tente d'utiliser ce code la en exemple trouvé ici:

    https://www.developpez.net/forums/d1...l/#post7190633


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Sub ExportDataByAdvancedFilter()
     ' Déclaration + Initialisation des variables
     Dim rngList As Range, rngData As Range, rngCriteria As Range, r As Long
     Set rngData = shtData.Range("A1").CurrentRegion
     With shtParam
      Set rngList = .Range("A1"): Set rngCriteria = .Range("C1:C2")
     End With
     ' Etape 1 - Création d'une liste unique basée sur la colonne 1
     With rngData
     .Resize(, 1).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=rngList, Unique:=True
     End With
     ' Etape 2 - Boucle sur la liste avec placement du critère
     '           Création nouvelle feuille
     '           Exportation vers nouvelle feuille
     '           Déplacement de cette nouvelle feuille vers un nouveau classeur
     For r = 1 To rngList.CurrentRegion.Rows.Count - 1
      rngCriteria.Cells(2, 1) = rngList.Offset(r) ' Insère le critère
      ' 2.1 - Création d'une feuille
      Sheets.Add before:=Sheets(1): Sheets(1).Name = rngList.Offset(r)
      ' 2.2 - Exportation vers nlle feuille suivant critère
      With rngData
      .AdvancedFilter xlFilterCopy, rngCriteria, Sheets(1).Range("A1")
      End With
      ' 2.3 - Déplacement de la feuille cers un nouveau classeur
      Sheets(1).Move
      '
      ' Ici code pour sauver classeur, Envoyer par email etc...
      '
     Next
    End Sub
    sur ma feuille à moi, il me sort l'erreur:

    "Objet requis" sur la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set rngData = shtData.Range("A1").CurrentRegion
    Alors Ok ma variable rngData est mal déclarée, mais j'aimerais pouvoir lui dire que c'est la colonne "Who" dans l'onglet options, or je ne vois nulle part dans le code de Philippe de déclaration spécifique en disant "c'est dans cet onglet la que tu cherche la data, et dans cet onglet la que tu cherches les criteres"

    J'ai raté quelque chose c'est évident, mais quoi et ou ?

    J'ai enlevé le code de la macro pour que vous puissiez ouvrir sans risque, mais si vous avez des pistes, je suis preneur.



    d'avance merci
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    L'erreur obtenue provient sans doute du fait que tu n'as pas de feuille dont la propriété CodeName a pour valeur shtData

    Lire éventuellement ce billet VBA – CodeName d’une feuille Excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Septembre 2019
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    L'auteur même du tuto et du fichier d'exemple que j'utilise qui répond ! C'est un honneur !

    Merci pour la piste, je m'en vais creuser de ce coté

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Septembre 2019
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    L'erreur obtenue provient sans doute du fait que tu n'as pas de feuille dont la propriété CodeName a pour valeur shtData

    Lire éventuellement ce billet VBA – CodeName d’une feuille Excel
    Philippe, j'ai regardé ton lien et j'ai parfaitement compris, merci !

    J'ai une suite de questions pour bien comprendre ton code, désolé si cela te parait vraiment trivial mais je souhaite parfaitement saisir la philosophie derrière chaque ligne et non simplement copier et coller en changeant des noms de variables.

    SI tu permet je te cite chaque ligne qui m'intrigue:


    EDIT: je me suis répondu tout seul en cherchant, il me reste cette question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     With rngData
     .Resize(, 1).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=rngList, Unique:=True
     End With
    peux tu m'expliquer s'il te plait pourquoi tu commence par .resize ?

    Sinon quand je met à jour le code de l'exemple pour s'adapter à mon fichier cela donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    Sub Rectangleàcoinsarrondis1_Cliquer()
     ' Déclaration + Initialisation des variables
     Dim rngList As Range, rngData As Range, rngCriteria As Range, r As Long
     Set rngData = shtData.Range("H1").CurrentRegion
     With shtParam
      Set rngList = .Range("C1"): Set rngCriteria = .Range("F1:F2")
     End With
     ' Etape 1 - Création d'une liste unique basée sur la colonne 1
     With rngData
     .Resize(, 1).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=rngList, Unique:=True
     End With
     ' Etape 2 - Boucle sur la liste avec placement du critère
     '           Création nouvelle feuille
     '           Exportation vers nouvelle feuille
     '           Déplacement de cette nouvelle feuille vers un nouveau classeur
     For r = 1 To rngList.CurrentRegion.Rows.Count - 1
      rngCriteria.Cells(2, 1) = rngList.Offset(r) ' Insère le critère
      ' 2.1 - Création d'une feuille
      Sheets.Add before:=Sheets(1): Sheets(1).Name = rngList.Offset(r)
      ' 2.2 - Exportation vers nlle feuille suivant critère
      With rngData
      .AdvancedFilter xlFilterCopy, rngCriteria, Sheets(1).Range("A1")
      End With
      ' 2.3 - Déplacement de la feuille cers un nouveau classeur
      Sheets(1).Move
      '
      ' Ici code pour sauver classeur, Envoyer par email etc...
      '
     Next
    End Sub
    Mais lors de l'execution j'ai droit à l'erreur: Erreur d'execution 1004, le nom de champ est incorrecte ou manquant dans la zone d'extraction.

    l'erreur a lieu ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     .Resize(, 1).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=rngList, Unique:=True

    Je sais que mes questions sont ras les pâquerettes mais je débute totalement en VBA et je t'avoue que la puissance de l'outil me dépasse or j'ai vraiment envie de le maîtriser petit à petit.

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La fonction Resize redimensionne une plage de cellules et renvoie un objet Range.
    Dans l'exemple donné, je veux exporter une liste unique basée sur la colonne A de RngData qui représente par exemple la plage A1:J100
    Dans le code ci-dessous, l'exportation concerne A1:A100
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With rngData
     .Resize(, 1).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=rngList, Unique:=True
    End With
    Pour t'en convaincre ajoute la ligne de code .Resize(,1).Select en première ligne du bloc With ... End With

    Si nous devions effectuer une exportation des données sans les doublons de la colonne C, il faudrait ajouter la propriété Offset
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With rngData
     .Offset(,2).Resize(, 1).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=rngList, Unique:=True
    End With
    soit déplacement de deux colonnes et redimensionnement d'une colonne
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Septembre 2019
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Compris pour le resize, mais pourquoi ai-je cette erreur: Erreur d’exécution 1004, le nom de champ est incorrecte ou manquant dans la zone d'extraction.

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je conseille vivement l'utilisation de l'une des fonctionnalités de l'outil de débogage.
    SI l'erreur 1004 est déclenchée à cette ligne là, c'est que soit la variable rngData soit rngList n'est pas alimentée.
    Un point d'arrêt sur cette ligne et un Debug.Print rngData.Address(External:=True) ou Debug.Print rngList.Address(External:=True) t'en apprendra sans doute plus.

    La lecture ce ce tutoriel Le débogage sous Visual Basic 6 & Visual Basic pour Application (1ère partie) te sera très utile pour avancer.

    [EDIT]
    Erreur d’exécution 1004, le nom de champ est incorrecte ou manquant dans la zone d'extraction
    L'étiquette de colonne de la zone d'exportation (Extraction) n'est sans doute pas identique ou bien manquante (cellule vide ?) à l'étiquette de colonne de la zone source (relire le tutoriel à ce sujet)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Septembre 2019
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci pour les points d'arrets, ce que j'obtiens:


    pour rngData et rngList:

    (captures d'écran)

    https://imgur.com/a/bkbI1N7

    Je ne vois rien d'étrange sachant que l'on voit sur ma feuille "database" et "options" que cela colle.


    "L'étiquette de colonne de la zone d'exportation (Extraction) n'est sans doute pas identique ou bien manquante (cellule vide ?) à l'étiquette de colonne de la zone source (relire le tutoriel à ce sujet)"
    Ce que tu appelles zone d'extraction et zone source sont "Database" et "option" ?



    edit: dans ma capture il y a une erreur suite à mes nombreux tests, j'ai bien:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Set rngList = .Range("C1"): Set rngCriteria = .Range("F1:F2")

    et non:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Set rngList = .Range("C1"): Set rngCriteria = .Range("C1:C2")

  9. #9
    Nouveau Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Septembre 2019
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Je voulais tester quelque chose et j'ai remplacé:



    ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Resize(, 1).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=rngList, Unique:=True

    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rngData.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=rngList, Unique:=True

    et le code fonctionne. Cependant (forcément) j'ai à nouveaux des choses étranges:

    Quand je lance le code il me génère plusieurs fichiers excels, un par trigramme mais j'ai le comportement étrange suivant:

    1) j'ai une erreur "erreur d'execution 1004, erreur définie par l'application ou l'objet" à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets.Add before:=Sheets(1): Sheets(1).Name = rngList.Offset(r)
    plus précisément sur la partie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    : Sheets(1).Name = rngList.Offset(r)
    2) dans mon fichier source (nommé reporting) le trigramme "VMO" qui me sert à détecter la fin du tableau est enlevé, voilà ce que cela donne une fois le code exécute (voir capture d'acran sur le fichier joint).

    Je ne comprends pas pourquoi il me supprime le trigramme VMO des deux endroits oui il est utilisé: en critere et fin de tableau de trigramme. D'après ce que je comprends, quand le code a bouclé jusqu'à la "derniere" entrée du tableau, il plante. donnant l'erreur.

    ps: chose étrange, la 7ieme feuille excelle qui est filtrée sur le trigramme CDU n'a pas une mais deux feuilles dans le classeur, et c'est le second onglet qui est dédié au contenu exporté. Tous les autres trigrammes sont créés avec une seule feuille.

    le fichier tuto de philippe:exemple.xlsx
    Mon fichier: Reporting.xlsm

    C'est quasiment la même macro à l'exception du resize.
    Images attachées Images attachées   

  10. #10
    Nouveau Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Septembre 2019
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    TROUVE !!!!!!!!!!!!!!

    en fait le code va lire la table "WHO" dans l'onglet options et crée une liste basée sur cette colonne.
    Pour chaque entrée de la ligne il va filtrer l'onglet Database et en extraire un fichier excel. SEULEMENT il va cracher si j'ai 8 entrées dan ma liste extraite de l'onglet options mais seulement 7 (ou moins) de trigrammes utilisés dans l'onglet Database.

    Une idée de la maniere de gerer ce cas ou j'ai 10 trigrammes mais X entrées (9 ou moins de lignes de taches utilisants du coup 9 ou moins de trigrammes ?)


    En gros le code ne fonctionne que s'il y a EXACTEMENT le même nombre d'entrées dans la colonne Who de l'onglet options que de trigrammes utilisés dans la database.

  11. #11
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une idée de la maniere de gerer ce cas ou j'ai 10 trigrammes mais X entrées (9 ou moins de lignes de taches utilisants du coup 9 ou moins de trigrammes ?)
    En gros le code ne fonctionne que s'il y a EXACTEMENT le même nombre d'entrées dans la colonne Who de l'onglet options que de trigrammes utilisés dans la database
    Vraisemblablement le problème vient du fait que la plage de cellules représentée par la variable objet rngList est entourée d'autres cellules remplies. En effet, utilisant la propriété CurrentRegion pour connaître le nombre de lignes si des cellules se trouvent à droite ou à gauche l'objet Range renvoyé ne correspondra pas au nombre de lignes exportée précédemment (plage contenant le contenu de la colonne sans les doublons)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  12. #12
    Nouveau Candidat au Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Septembre 2019
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci pour la précision Philippe, j'ignorait que le fait que les cellules à cotés de celles dont je fait le Range pouvaient influencer mon résultat.
    Du coup maintenant il me faut pouvoir lire les fichiers d'avancement générés pour mettre à jour mon fichier principal (et historiser les information pour chaque semaine, ainsi je peux faire des stats sur des mois complets).
    Je suis capable d'ouvrir un fichier excel en lui indiquant quel onglet charger dans une variable pour pouvoir l'exploiter.

    Maintenant me reste à historiser l'onglet dans mon fichier central ET mettre à jour mes données clef (% avancement, status de la tache etc)

Discussions similaires

  1. [XL-2010] Exporter un tableau vers Word dans un format txt
    Par meyerbsa dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/05/2018, 10h43
  2. Exporter un tableau vers excel dans Windev Mobile 20
    Par younesoft dans le forum Windev Mobile
    Réponses: 3
    Dernier message: 25/08/2016, 13h28
  3. [XL-2010] Partager puis Exporter un tableau vers word
    Par Matrixmax dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/04/2013, 11h54
  4. Exporter un tableau VBA dans le classeur Excel
    Par dexterchief dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2011, 18h23
  5. [Excel] Exporter un tableau vers excel
    Par legillou dans le forum Documents
    Réponses: 8
    Dernier message: 08/02/2006, 14h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo