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 :

Listbox sans ligne cachée d'autofiltre


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 58
    Par défaut Listbox sans ligne cachée d'autofiltre
    Bonjour,

    après 3 jours de recherche je reviens vers vous.

    Quelle méthode utilisez-vous pour afficher des lignes filtrées dans une listbox?

    En gros j'ai un worksheet avec des lignes de données. Après un autofilter certaines lignes disparaissent (normal!). Je met donc à jour ma listbox, problème: les lignes cachées sont toujours là bien que non visible sur le worksheet.?

    Pour info j'utilise cette méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Listbox.RowSource = Range("A2", Range("K65000").End(xlUp)).Address
    Merci pour votre aide.

    Elumastebit

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Par défaut
    Malheureusement, tes lignes ont beau êtres cachées, elles existent toujours, et VBA ne tient pas compte du fait qu'elles soient cachées ou non.

    Cela veut donc dire que si tu veux que si tu veux qu'il n'y ait que les lignes non cachées qui apparaissent dans ta listbox, tu devras l'alimenter à la main (et surtout au un par un avec une boucle) avec la méthode AddItem et des tests.

  3. #3
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 58
    Par défaut
    Bonjour decondelite

    Donc en gros, si je fais une recherche à partir d'une textbox dans ma listbox je ne peux pas juste avoir les résultats correspondants? J'utilise actuellement l'autofilter, n'y aurait-t'il pas une autre méthode que celle ci puisqu'ensuite je ne peux pas retourner juste mes résultats dans ma listbox.

    Merci.

    Elumastebit

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Par défaut
    Eh bien tu fais comme tu sens:
    -soit tu gardes ta listbox tel quel, et ta recherche depuis ta textbox n'affichera pas les résultats correspondant aux éléments cachés: à la fois compliqué et pas très logique voilà mon avis
    -soit tu fais comme je te l'ai dit, c'est à dire remplir ta textbox avec tes éléments un par un
    -soit tu envisages encore un autre truc, c'est que tu fasses un filtrage qui supprime les lignes au lieu de juste les cacher.

  5. #5
    Membre confirmé Avatar de allergique
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 151
    Par défaut
    Bonsoir,

    J'avais créé il y a peu de temps un post avec le même problème.

    je te mets le lien ci-dessous:

    http://www.developpez.net/forums/d66...gnes-masquees/

  6. #6
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 58
    Par défaut
    Bonjour allergique,

    Dans le code du post que tu m'as transmis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For i = 2 To UBound(tableau)
        If Rows(i).Hidden = False Then
            resultat.Add tableau(i, 9), CStr(tableau(i, 9))
        End If
    Next i
     
    For i = 1 To resultat.Count
            ListBoxnom.AddItem resultat(i)
    Next i
    comment est défini "resultat"? comment le déclarer?

    Merci.

    Elumstebit

  7. #7
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 58
    Par défaut
    Re,

    Après pas mal de lecture, j'ai déclaré resultat en tant que collection, mais désormais il me met une erreur 70 accès refusé; 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
    Private Sub Textbox1_Change()
    Selection.AutoFilter field:=1, Criteria1:="*" & Textbox1 & "*"
    tableau = Range("A1:O" & Range("O65536").End(xlUp).Row)
    Dim resultat As New Collection
    For i = 2 To UBound(tableau)
        If Rows(i).Hidden = False Then
            resultat.Add tableau(i, 15), CStr(tableau(i, 15))
        End If
    Next i
     
    For i = 1 To resultat.Count
            Listbox1.AddItem resultat(i) '<======l'erreur pointe cette ligne
    Next i
    End Sub
    Si vous avez des idées, Plus que deux lignes!

    merci pour votre aide!

    Elumastebit

  8. #8
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 58
    Par défaut
    Je continue,

    Après avoir trouvé de l'aide chez notre ami billou:

    Support microsoft - Erreur 70 sur listbox

    J'ai donc compris qu'il faillait effacer les propriétés de la listbox durant la marche de la macro ainsi j'ai inséré:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Textbox1_Change()
    Selection.AutoFilter field:=2, Criteria1:="*" & Textbox1 & "*"
    tableau = Range("A1:O" & Range("O65536").End(xlUp).Row)
     Dim resultat As New Collection
          L_Fournisseurs.RowSource = ""    '<==== ça!
    For i = 2 To UBound(tableau)
        If Rows(i).Hidden = False Then
            resultat.Add tableau(i, 2), CStr(tableau(i, 2))
        End If
    Next i
    For i = 1 To resultat.Count
            Listbox1.AddItem resultat(i)
    Next i
    End Sub
    ça fonctionne, mais pas totalement, puisque désormais, seule la colonne 2 est affichée dans ma listbox, je souhaite avoir les 8 premières colonnes.

    Ma nouvelle question:
    Comment faire pour préciser dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat.Add tableau(i, 2), CStr(tableau(i, 2))
    non pas 2 mais 1 à 8?

    Encore un dernier effort!

    Merci

    Elumastebit

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 116
    Par défaut
    salut,

    Je suis entrain de faire la meme chose que toi une donnée dans un TExtbox
    qui va faire un Autofiltre qui chez moi n'affiche qu'une colonne dans la Listbox.
    pourrais tu m'envoyer ton code si cela ne te dérange pas

    Merci d'avance cela avencera terriblement mon projet

  10. #10
    Membre confirmé Avatar de allergique
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 151
    Par défaut
    Citation Envoyé par Elumastebit Voir le message
    Je continue,


    Ma nouvelle question:
    Comment faire pour préciser dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat.Add tableau(i, 2), CStr(tableau(i, 2))
    non pas 2 mais 1 à 8?

    Encore un dernier effort!

    Merci

    Elumastebit
    Bonsoir,

    Pour faire une listbox multi-colonnes tu peux adapter l'exemple de code de la faq suivant:
    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
    Créer une ListBox multicolonnes.
    Vba
     
     
    Private Sub UserForm_Initialize()
        Dim i As Byte, j As Byte
     
        'Définit le nombre de colonnes dans la ListBox
        ListBox1.ColumnCount = 7
     
        '---
        'Définit la largeur des colonnes d'une ListBox:
        'Par défaut, la largeur des colonnes est de 72 points
        '(72 points = 1 pouce)
        ListBox1.ColumnWidths = "50;80;50;60;50;70;50"     
            '---
            'Il est aussi possible de définir la dimension des colonnes en centimètres
            'ListBox1.ColumnWidths = "2 cm; 1,5 cm ......" 
            '---
        '---
     
        For i = 1 To 20
            'Ajoute une ligne et insère une donnée dans la colonne de gauche
            ListBox1.AddItem "Ligne" & i
     
            'Ajoute des données dans les colonnes de droite
            For j = 1 To 7
            ListBox1.List(ListBox1.ListCount - 1, j) = i & j
            Next j
     
        Next i
    End Sub

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 15
    Par défaut filtre
    bonjour
    pourquoi ne pas utiliser le filtre élaboré ?
    ce qui permet d'avoir les données sur une feuille le filtre sur une autre
    et d'afficher les resulats sur une autre dans une plage bien defini, dans ce cas tu n'as plus de probleme de lignes vides. al la suite de cela tu pe avoir des liste de validation basé sur plusieurs champs.
    enfin moi je crois, plutot que de taper du code que l'on ne maitrise pas toujours.
    @+

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Voici un exemple de code qui fait ce que tu demandes.
    J'ai deux listbox dans un userform : listbox1 et listbox2
    Dans ListBox1 j'affiche les données d'une colonne sans doublon et triées par ordre Alpha.
    Une sélection dans ListBox1 entraîne l'affichage de trois colonnes dans ListBox2

    Pour des Combos, le principe et le code sont les mêmes (noms de contrôles mis à part [!!!] )

    La méthode utilisée permet de renseigner les trois colonnes d'une ListBox2 selon des colonnes non contigues de la feuille de calculs.
    Le code susceptible de t'intéresser est dans Private Sub ListBox1_Click
    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
    Private Sub ListBox1_Click()
    Dim plage As Range, Cell As Range
    Dim FL1 As Worksheet, critere As String
        Set FL1 = Worksheets("Feuil1")
        ListBox2.Clear
    'On fixe le critère
        critere1 = ListBox1
    'Pose du filtre : Si un filtre existe, on le supprime...
        If FL1.FilterMode Then FL1.Cells.AutoFilter
    '... avant de le poser sur la colonne désirée
        FL1.Columns("A:A").AutoFilter Field:=1, Criteria1:=critere1
     
    'La plage de données filtrées correspond aux seules cellule visibles
    'Dans cette plage, la colonne du filtre est la colonne 1
        Set plage = FL1.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible)
    'Parcours de la plage filtrée -> remplissage des trois colonnes de la listbox
        For Each Cell In plage 'dans la listbox, la première colonne a l'indice 0
            'Colonne 1 ds listbox (indice 0) : colonne du filtre => D
            ListBox2.AddItem Cell 'colonne A de la feuille
            'Colonne 2 ds listbox (indice 1) : A + 2 => colonne C de la feuille
            ListBox2.List(ListBox2.ListCount - 1, 1) = Cell.Offset(0, 2)
            'Colonne 3 ds listbox (indice 2) : A + 3 => colonne D de la feuille
            ListBox2.List(ListBox2.ListCount - 1, 2) = Cell.Offset(0, 3)
        Next
        Set plage = Nothing
    End Sub
    Je te mets le remplissage de ListBox1 afin que tu puisses éventuellement tester sur une base de données existante
    Le test nécessite un userform et deux listbox, la première ne comportant qu'une colonne, la seconde trois colonnes.
    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
    Private Sub UserForm_Activate()
    Dim Tablo As Variant, Tempo As Variant, i As Long, j As Long
        Worksheets("Feuil1").Activate 'à défaut d'instancier la feuille
        Tablo = Range("a2:a" & Range("a" & Rows.Count).End(xlUp).Row).Value
    'triAlpha
        For i = 1 To UBound(Tablo)
            For j = 1 To UBound(Tablo)
                If Tablo(i, 1) < Tablo(j, 1) Then
                    Tempo = Tablo(i, 1)
                    Tablo(i, 1) = Tablo(j, 1)
                    Tablo(j, 1) = Tempo
                End If
            Next j
        Next i
        ListBox1.Clear
    'Remplissage excluant les doublons
        ListBox1.AddItem Tablo(1, 1)
        For i = 2 To UBound(Tablo)
            If Tablo(i, 1) <> Tablo(i - 1, 1) Then ListBox1.AddItem Tablo(i, 1)
        Next
    End Sub
    Bonne journée

    NB - Je n'ai pas intégré le saut de la première ligne de la plage filtrée. A ajouter le cas échéant.
    En cas de pb, tu demandes.

Discussions similaires

  1. [XL-2010] comment copier coller des cellules sans prendre en compte les lignes cachées
    Par bboy-eazy dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/09/2014, 15h20
  2. Ajouter du texte dans une ListBox sans sauter de ligne
    Par walid_kerkoub dans le forum Composants VCL
    Réponses: 2
    Dernier message: 03/03/2008, 15h42
  3. Réponses: 2
    Dernier message: 02/08/2006, 17h21
  4. Listbox sans scrollbar?
    Par mekacom dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 06/07/2006, 23h20
  5. Réponses: 3
    Dernier message: 27/09/2005, 08h44

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