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

  1. #1
    Nouveau Candidat au Club
    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

  2. #2
    Rédacteur

    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
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  3. #3
    Nouveau Candidat au Club
    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
    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

    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
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  6. #6
    Nouveau Candidat au Club
    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

    Ce message n'a pas pu être affiché car il comporte des erreurs.
    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
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  8. #8
    Nouveau Candidat au Club
    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
    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:
    Mon fichier:

    C'est quasiment la même macro à l'exception du resize.

  10. #10
    Nouveau Candidat au Club
    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

    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
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  12. #12
    Nouveau Candidat au Club
    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)

###raw>template_hook.ano_emploi###