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 :

Filtre selon une colonne et copie des données propres dans nouvelle feuille [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut Filtre selon une colonne et copie des données propres dans nouvelle feuille
    Bonjour le forum !

    Petite énigme en VBA en cet après-midi fort gris

    Sur une feuille "Depart", j'ai un tableau de données comme sur le screenshot ci-joint.

    Je souhaite, pour chaque classe, créer une nouvelle feuille qui sera nommée selon le numéro de la classe et qui récupèrera les informations propre à cette classe.
    Pour ce faire, j'ai créé une liste sans doublon (qui est effacée à la fin du traitement).
    Ensuite je filtre mon tableau en fonction de la classe afin de copier les données de chaque classe une à une et de les coller dans les feuilles nouvellement crées.
    Ainsi, à la fin je me retrouve avec un classeur comportant les feuilles suivantes :
    Depart > 1 > 2 > 3 > 4

    Voici mon bout de code :
    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
    32
    33
    Dim lastlig As Long, lastligcl As Long, i As Long, xfeuille As Worksheet, numcl As String 
     
      ThisWorkbook.Worksheets(2).Activate
      
      ' Créer une liste (temporaire) des classes sans doublons en colonne M
      lastlig = Range("C1048576").End(xlUp).Row
      [C6:C1000].AdvancedFilter Action:=xlFilterCopy, CopyToRange:=[M1], Unique:=True
      
      
      'Créer nouvelle feuille pour chaque classe et la nommer selon la classe; placer les nouvelles feuilles en dernière position
      lastligcl = Range("P200").End(xlUp).Row
      For i = 2 To lastligcl
        numcl = Cells(i, 13).Value
        Worksheets.Add.Move After:=Worksheets(Worksheets.Count)
        Worksheets(i).Name = numcl
        Application.Goto ActiveWorkbook.Worksheets(2).Range("A1")
        Range("C6").AutoFilter Field:=3, Criteria1:=Cells(i, 13).Value
        Range("A6:E6" & lastlig).SpecialCells(xlCellTypeVisible).Copy Destination:=Worksheets(i).Cells(1, 1)
        
      Next i
      
      ' Boucle sur les noms des classes
      Application.Goto ActiveWorkbook.Worksheets(2).Range("A1")
      For i = 2 To lastligcl
        numcl = Cells(i, 13).Value
        Worksheets(i).Name = numcl
      Next i
    
      ' Supprime la colonne temporaire
      Range("M:M").Delete
      Range("A6:E" & lastlig).AutoFilter Field:=2
      Range("A1").Select
    Dans mon tableau, le nombre de colonnes est fixe mais le nombre de lignes peut varier.

    Quand j'exécute ma macro, la liste sans doublons est créée impeccablement mais survient une erreur d'exécution 1004 sur la ligne que j'ai écrite en rouge :
    "Cette sélection n'est pas valide. Raison possibles:
    - les zones de copie et de collage ne peuvent se superposer que si elles sont de dimension et de forme identiques.
    - si vous utilisez la commande Créer à partir de la sélection, la ligne ou la colonne contenant les noms proposés n'est pas incluse dans les"
    (je n'ai pas la suite du message, impossible d'agrandir la fenêtre !)

    D'avance, merci beaucoup everybody !

    Kaera*
    Images attachées Images attachées  

  2. #2
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Tu as laissé le 6 dans A6:E6. C'est pas ça ?

  3. #3
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Salut ZebreLoup !

    Non je ne pense pas que ça vienne de là car j'ai également testé "A6:E", sans succès.

  4. #4
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut

    Alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lastlig = Range("C1048576").End(xlUp).Row
    A remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    with ThisWorkbook.Worksheets(2)
        lastlig = .cells(.rows.count,"C").End(xlUp).Row
    Ensuite ZebreLoup a raison, si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A6:E6" & lastlig)
    avec lastlig = 20 par exemple, vba comprend
    "A6:E6" & "20"...
    donc
    "A6:E620"

    il vaut donc mieux mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A6:E" & lastlig)

    Mais le problème est plus profond me semble t il
    Lorsque tu crées une nouvelle feuille, tu ne sélectionnes pas la bonne feuille par la suite.

    Voila une possibilité de faire (je n'ai pas testé)
    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
    Dim LastLigCl As Long 'Toujours au moins une majuscule dans tes nom de variables
    Dim TheCell As Range
    Dim NewSheet As Worksheet
    Dim LastLig As Long
     
    'Créer nouvelle feuille pour chaque classe et la nommer selon la classe; placer les nouvelles feuilles en dernière position
     
    With ThisWorkbook.Sheets(2)
        LastLig = .Cells(.Rows.Count, "C").End(xlUp).Row
      'Plutot que sheets(2), essai de donner le nom de la feuille, sa position peut varier ou alors utilise le codename de la feuille directement
      For Each TheCell In .Range("P2", .Cells(.Rows.Count, "P").End(xlUp))
        Set NewSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
        NewSheet.Name = TheCell.Offset(0, -3) '-3 = de la colonne P à la colonne M
        Application.Goto .Range("A1") 'je ne connaissais pas cette méthode
        .Range("C6").AutoFilter Field:=3, Criteria1:=TheCell.Offset(0, -3).Value
        .Range("A6:E" & LastLig).SpecialCells(xlCellTypeVisible).Copy Destination:=NewSheet.Range("A1")
     
      Next i
    ++
    Qwaz

  5. #5
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Salut salut,

    D'abord, au temps pour moi ZèbreLoup.

    Ensuite, Qwazerty, merci de ta réponse.
    MEA CULPA : il y a une minuscule erreur dans le code que j'ai donné au début du topic.
    Je crée une liste temporaire sans doublon dans la colonne M mais plus bas j'ai écrit colonne P. Donc, sorry.
    Du coup, ton code lavé de ma faute doit donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewSheet.Name = TheCell.Offset(0, 0)
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewSheet.Name = TheCell.Offset(0, -3) '-3 = de la colonne P à la colonne M
    right ?

    Autre chose : à propos de l'utilisation du nom de la feuille plutôt que Worksheets(2), le problème c'est que la feuille en question porte un nom avec partie fixe et partie variable. Explanation : La feuille est nommée par macro "Depart_nomfichier" et varie donc en fonction du nom du fichier.

    Merci d'avance.

  6. #6
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Dans ce cas la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewSheet.Name = TheCell
    Offset te permet de te décaler de y lignes et x colonne, donc se décaler de 0, 0 revient à rester en place .

    Pour le reste, il faudrait avoir une vue un peu plus large de ton code, par exemple à quel moment crées tu la feuille que tu pointes avec worksheets(2) et comment appelles tu le morceau de code que tu nous a donné?

    Le fait d'avoir une partie variable sur le nom d'une feuille n'est pas un problème, exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DIm NomFichier as string
     
    'On défini le nom du fichier
    NomFichier = "a adapter"
     
    '[...] Suite du code
    'On pointe notre feuille
    with Thisworkbook.sheets("Depart_" & NomFichier)
        '[...]
    En y réfléchissant un peu, il me semble que lorsque tu dis Worksheet(2), au vu des explication que tu donnes en début de sujet, tu veux faire référence à ta feuille de départ, donc pas de problème de nom de feuille?
    Et donc par extension la création des feuilles est faite par le code que tu nous propose? right?

    ++
    Qwaz

  7. #7
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Hallo,

    Il est vrai que j'aurais dû davantage expliciter le "contexte" de mon bout de code.

    Le but de la macro-mère (qui contient donc des macros-enfants, dont le code que j'ai donné en début de topic) est d'importer un fichier texte, de le nettoyer, le mettre en forme et d'effectuer quelques traitements avec les données, tout ceci afin de faciliter la lecture et l'analyse dudit fichier.
    Le nom de ma worksheets(2) varie donc en fonction du fichier importé.

    Les étapes du traitement de la macro-mère:
    -importer le fichier texte
    -le nettoyer des lignes futiles
    -organiser les données sous forme de tableau
    -filtrer ledit tableau en fonction de la colonne C et pour chaque donnée différente en C (ici la classe), créer une nouvelle feuille sur laquelle seront copiées les lignes du tableau propres à la donnée du tableau filtré.

    Vielen Dank im Voraus

    (PS: je me sens d'autant plus idiote que j'avais pourtant bien compris le concept d'Offset...)

  8. #8
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Pas de soucis pour Offset, on est parfois trop pressé

    Pour ce qui est de ta macro, ta macro-mère ouvre le fichier texte, donc ensuite rien ne t'empêche de pointer la feuille dans une variable worksheet et de la passer en paramètre à ta macro-enfant (ou juste le nom du fichier).

    N'hésite pas à proposer ton code si tu veux une simplification (si nécessaire) et ça nous permet de mieux voir les interactions entre les différentes macro. A toi de voir.

    ++
    Qwaz

  9. #9
    Membre averti
    Avatar de Kaera
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 185
    Points : 332
    Points
    332
    Par défaut
    Salut Qwaz'

    C'est une macro qui comporte pas mal de traitement et qui contient des informations que je ne peux divulguer.
    Lorsque c'était pour des bouts de code, ce n'était pas grave et puis je pouvais toujours modifier les infos "gênantes", mais là, impossible !
    Néanmoins je te remercie beaucoup, une fois de plus !

    'nuit

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/08/2013, 21h58
  2. Réponses: 3
    Dernier message: 22/10/2010, 07h15
  3. Réponses: 11
    Dernier message: 18/10/2007, 12h49
  4. Copie des données d'une table d'une base Interbase 6
    Par Djedjeridoo dans le forum InterBase
    Réponses: 6
    Dernier message: 02/02/2004, 09h39

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