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 :

VBA : Recopier une plage filtrée dans une Listbox de formulaire [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti Avatar de Pipeti
    Homme Profil pro
    Retraité - Conciliateur de Justice
    Inscrit en
    Août 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité - Conciliateur de Justice
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2012
    Messages : 12
    Par défaut VBA : Recopier une plage filtrée dans une Listbox de formulaire
    Bonjour,
    Exposé de mon problème:
    Dans un même classeur, j'ai une feuille "Dossiers" (1 ligne / dossier) et une feuille "Audiences" (1 à n lignes / dossier) avec le n° de dossier en colonne 1
    A partir de la feuille "Dossiers",
    Je veux récupérer les lignes d'audiences filtrées sur le n° de dossier et les copier pour affichage afficher dans une listbox de mon Formulaire_Dossier
    Pour tester ma procédure, je me place par exemple sur un dossier pour lequel je filtre bien les 3 audiences qui lui correspondent
    J'ai utilisé plusieurs méthodes mais pas la bonne ... car mon formulaire n'affiche que la ligne titres de ma feuille Audiences et pas les lignes filtrées... (d'ailleurs le compteur iR qui devrait me donner le nb de lignes filtrées me donne toujours 1 ! alors que dans mon test il devrait afficher 4!)
    Je ne comprend pas ce qui ne fonctionne pas.

    Si quelqu'un peut m'indiquer la solution je le/la remercie d'avance.

    Voici mon 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
    Sub Lister_Audiences_du_Dossier()
    '
    '-- Sélectionner les audiences du dossier
    '
    '   Audiences_du_Dossier est une Range déclarée en 'Public' dans un autre module
        Dim iR As Integer
        Dim iC As Integer
     
        Sheets("Dossiers").Select
        No_Dossier = Range("A99").Value  '---Pour tester un dossier avec 3 audiences
     
        Nom_Feuille = "Audiences"
        Nom_Base = "Base_Audiences"
        Sheets(Nom_Feuille).Activate
        ActiveSheet.Unprotect
        Call Libérer_les_volets
        Call Tri_Audiences_par_Dossier_Date_Heure_Audience
        ActiveSheet.Range(Nom_Base).AutoFilter Field:=1, Criteria1:=No_Dossier
        iR = Sheets(Nom_Feuille).Range(Nom_Base).SpecialCells(xlCellTypeVisible).Rows.Count
        Set Audiences_du_Dossier = Sheets(Nom_Feuille).Range(Nom_Base).SpecialCells(xlCellTypeVisible)
        'Dans le Formulaire_Dossier_Initialize : LB_Audiences = Audiences_du_Dossier.value (Copie dans la listbox du formulaire)
        Formulaire_Dossier.Show
     
    '-->Retour sur la feuille "Dossiers"
        Sheets("Dossiers").Select
     
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonsoir,

    Si la plage n'est pas continue, tu ne peux pas utiiser "List". Fais une boucle sur la plage filtrée. S'il n'y a qu'une colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim C As Range
    LB_Audiences.Clear
    For Each C In Audiences_du_Dossier
        LB_Audiences.AddItem C.Value
    Next C

  3. #3
    Membre averti Avatar de Pipeti
    Homme Profil pro
    Retraité - Conciliateur de Justice
    Inscrit en
    Août 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité - Conciliateur de Justice
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2012
    Messages : 12
    Par défaut Merci Daniel,
    En réalité bien sur, j'ai plusieurs colonnes dans chaque feuille...
    Je ne savais pas que .List ne permettait pas de copier une plage discontinue...
    Je vais chercher avec ta piste et voir comment je peux copier les autres colonnes qui me sont nécessaires pour chaque ligne de ma listbox
    Je débute dans ce genre de pratique...

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Un exemple pour 3 colonnes adjacentes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set Audiences_du_Dossier = Sheets(Nom_Feuille).Range(Nom_Base).Resize(, 1). _
    SpecialCells(xlCellTypeVisible)
    Plage filtrée (première colonne). Remplissage de la listbox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim C As Range
    LB_Audiences.Clear
    For Each C In Audiences_du_Dossier
        LB_Audiences.AddItem C.Value
        LB_Audiences.List(Me.lbSup.ListCount - 1, 1) = C.Offset(, 1).Value
        LB_Audiences.List(Me.lbSup.ListCount - 1, 2) = C.Offset(, 1).Value
    Next C

  5. #5
    Membre averti Avatar de Pipeti
    Homme Profil pro
    Retraité - Conciliateur de Justice
    Inscrit en
    Août 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité - Conciliateur de Justice
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2012
    Messages : 12
    Par défaut
    Encore Merci Daniel,

    Je ne vois pas très bien dans ton exemple de code ce que représente le Me.lbSup.ListCount et
    je pense que c'est du à un copier/coller un peu précipité et qu'il s'agit en fait de LB_Audiences.ListCount.
    J'avais compris mon erreur concernant la range discontinue et la méthode à adopter : .additem etc...

    Par contre, je souhaiterais avoir ton avis sur le point suivant :
    l'utilisation de la propriété .SpecialCells(xlCellTypeVisible) pour définir la range des lignes filtrées me retourne, en plus des lignes filtrées, toutes les lignes audiences vides en fin de tableau ce qui ne me convient pas vraiment puisque je ne souhaite traiter que les lignes renseignées donc non vides
    Bien sur je peux écrire une boucle pour sortir dès la 1ère ligne vide mais il y a peut-être plus élégant :
    - existe-t-il une propriété plus précise qui pourrait me définir, en une seule ligne de code, seulement la plage des lignes filtrées non vides ?
    - sans passer par une boucle...
    J'ai cherché bien sûr mais je n'ai pas encore trouvé...

    Merci encore pour tes conseils éclairés.

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    je pense que c'est du à un copier/coller un peu précipité et qu'il s'agit en fait de LB_Audiences.ListCount.
    Tout à fait.



    J'ai supposé que "Audiences_du_Dossier" représentait la plage filtrée. Si c'est une erreur, corrige. J'ai repris cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Audiences_du_Dossier = Sheets(Nom_Feuille).Range(Nom_Base).SpecialCells(xlCellTypeVisible)
    en la modifiant pour n'avoir que la première colonne. Que représente "Nom_Base" ?

    - existe-t-il une propriété plus précise qui pourrait me définir, en une seule ligne de code, seulement la plage des lignes filtrées non vides ?
    Si tu n'as que des valeurs tu pourrais utiliser "SpecialCells(xlCellTypeConstants)" ou "SpecialCells(xlCellTypeFormulas)" si tu n'as que des formules,mais le plus simple est de rajouter un filtre pour éliminer les lignes vides. D'ailleurs, tu serais obliger de boucler pour remplir la listbox.
    "

  7. #7
    Membre averti Avatar de Pipeti
    Homme Profil pro
    Retraité - Conciliateur de Justice
    Inscrit en
    Août 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité - Conciliateur de Justice
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2012
    Messages : 12
    Par défaut
    Daniel,
    Merci pour ta confirmation.
    On est bien d'accord que la boucle est inévitable pour remplir la listbox, donc un test pour sortir dès la 1ère ligne vide... c'est pas compliqué.

    Que représente "Nom_Base" ?
    "Nom_Base" me permet de nommer les plages de données avec les filtres (menu Formules) que j'utilise dans différentes feuilles.
    Cela me permet d'utiliser les mêmes procédures utilitaires génériques sur différentes feuilles, plages, etc simplement en passant un nom de feuille ou de plage différente... bien pratique pour moi (par exemple trier/filtrer les données sur la colonne A ou une autre,...)

    Au plaisir de te retrouver sur le forum une autre fois....

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

Discussions similaires

  1. Valeur la plus fréquente dans une plage filtré
    Par kyros21 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/07/2012, 08h55
  2. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  3. [XL-2003] Trouver le min et le max d'une colonne dans une plage filtrée
    Par Gwladys dans le forum Excel
    Réponses: 2
    Dernier message: 06/04/2009, 17h37
  4. Réponses: 13
    Dernier message: 26/07/2007, 08h50
  5. Réponses: 10
    Dernier message: 18/04/2007, 17h17

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