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 :

Filtrer un tableau à l'aide d'une Listbox Multiselect


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de anarchiste-mouton
    Homme Profil pro
    ceci
    Inscrit en
    Décembre 2017
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ceci
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2017
    Messages : 69
    Par défaut Filtrer un tableau à l'aide d'une Listbox Multiselect
    Bonjour,

    C'est la première fois que j'utilise une Listbox et j'ai besoin d'aide. Comme une image vaut 1000 mots :

    Nom : devp.PNG
Affichages : 820
Taille : 41,4 Ko

    Ce que je voudrais en cliquant sur Valider (pour ce cas de figure) :

    Seule les lignes contenant "Détourage/Remplissage" ou "Elements Peints" restent visibles. Les autres (à partir de la ligne 3) sont masquées.

    J'ai rédigé le code suivant mais il me fait des choses que je peine à comprendre...

    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
     
    Private Sub CommandButton1_Click()
     
        Dim  Feuille As Worksheet, i As Byte, Cellu As Range, nb_lignes As Integer
        Set Feuille = Sheets("Feuil1")
     
        If ListBox1.ListIndex = -1 Then Exit Sub
     
        eneleve_filtre 'Sert à rendre toutes les lignes de la feuille visibles
     
        nb_lignes = Feuille.Cells(2, 3).End(xlDown).Row 
     
        For Each Cellu In Feuille.Range(Cells(3, 3), Cells(nb_lignes, 3))
            For i = 0 To Me.ListBox1.ListCount - 1
                If ListBox1.List(ListBox1.ListIndex) = Cellu.Value And Then
                    Cellu.EntireRow.Hidden = False
                Else
                    Cellu.EntireRow.Hidden = True
                End If
            Next i
        Next Cellu
     
    End Sub
    J'ai du mal à comprendre la syntaxe pour récupérer les éléments selectionnées dans la Listbox

    PS : Je sais que c'est plus simple d'utiliser des checkbox pour ce que je veux faire...

    Bonne journée

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Tu es en train de réinventer le fil à couper le beurre.
    Ce que tu cherches à faire est un filtre et ça peut se mettre en place en 10 seconde sans VBA.
    Tu sélectionnes toutes tes colonnes > Ruban Données > Filtrer

    Ensuite, tu n'auras qu'à appuyer sur le bouton de l'entête "Rattaché à la mission" pour sélectionner ce que tu veux laisser affiché.

    Je te conseille aussi fortement de supprimer ta ligne 1 et ta colonne A qui ne servent à rien qu'à causer des difficultés.

  3. #3
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    bonjour

    En plus si tu as 2013 et plus, en mettant le source sous forme de tableau structuré, tu peux filtrer par segments ce qui est encore plus proche de la listbox (en mieux)...

  4. #4
    Membre confirmé Avatar de anarchiste-mouton
    Homme Profil pro
    ceci
    Inscrit en
    Décembre 2017
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ceci
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2017
    Messages : 69
    Par défaut
    Merci pour ces réponses rapides,

    Je sais que cette fonction de tri existe et qu'en apparence je m’attèle sur quelque chose d'inutile, mais ce classeur fonctionne en mode "protégé", je ne déverrouille la feuille que par macro (j'ai effacé les lignes pour plus de lisibilité). C'est un classeur perso mais j'ai envie de m'entrainer à produire des fichiers "incassables", fiables dans le temps qu'importe le niveau de l'utilisateur.
    Bonne soirée

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par anarchiste-mouton Voir le message
    Je sais que cette fonction de tri existe et qu'en apparence je m’attèle sur quelque chose d'inutile, mais ce classeur fonctionne en mode "protégé", je ne déverrouille la feuille que par macro (j'ai effacé les lignes pour plus de lisibilité).
    Rien ne t'empêche de placer le filtre en VBA.
    Un coup d'enregistreur automatique de macro et tu as 80% du code qui tombe tout cuit.

    j'ai envie de m'entrainer à produire des fichiers "incassables"
    Dans ce cas, oublie VBA parce que c'est un gruyère question sécurité.

  6. #6
    Membre confirmé Avatar de anarchiste-mouton
    Homme Profil pro
    ceci
    Inscrit en
    Décembre 2017
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ceci
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2017
    Messages : 69
    Par défaut
    Pour clore cette discussion je joints la procédure finale (ça fonctionne mais l’exécution n'est pas hyper rapide) :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    Option Explicit
    Private Sub CommandButton1_Click()
    On Error GoTo errorHandler
     
        Dim i As Byte
        Dim nb_lignes As Integer
        Dim Feuille As Worksheet, Cellu As Range
     
        Set Feuille = Sheets("Feuil1")
     
        If ListBox1.ListIndex = -1 Then Exit Sub '............................Rien ne se passe si rien n'est sélectionné
     
        eneleve_filtre '............................................................Affiche toutes les lignes de Feuille
     
        nb_lignes = Feuille.Cells(3, 3).End(xlDown).Row
        If nb_ligne = 0 Then Exit Sub
     
        For Each Cellu In Feuille.Range(Cells(3, 3), Cells(nb_lignes, 3)) '.. Pour chaque cellule pleine de la colonne C
     
            For i = 0 To ListBox1.ListCount - 1 '.......................Nombre d'itérations = nombre d'items de la liste
                If ListBox1.List(i) = Cellu.Value Then '......... Si l'item visualisé vaut la valeur de la cellule cible
                    If Not ListBox1.Selected(i) Then '.... Si l'item visualisé n'a pas été sélectionné par l'utilisateur
                        Feuille.Unprotect ("ahlp") '.............................................. On enlève la sécurité
                        Cellu.EntireRow.Hidden = True '............................On cache la ligne de la cellule cible
                        Feuille.Protect ("ahlp") '................................................. On remet la sécurité
                        Exit For '........................................................ Et on change de cellule cible
                    End If
                End If
            Next i '................................................ Dans le cas contraire on change l'item à visualiser
     
        Next Cellu
     
        Unload me
     
        Exit Sub
     
    errorHandler:
        MsgBox Err.Number & vbLf & Err.Description
     
     
    End Sub

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

Discussions similaires

  1. [XL-2007] Faire un filtre dans un tableau à l'aide d'une multi-select listbox
    Par Nomorerulz dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/06/2016, 19h27
  2. [débutant] filtrer des CheckBox à l'aide d'une liste
    Par mimo13 dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/11/2008, 15h16
  3. filtrer formulaire a l'aide d'une macro
    Par jncoffy dans le forum IHM
    Réponses: 13
    Dernier message: 18/01/2007, 20h49
  4. Réponses: 7
    Dernier message: 23/10/2006, 21h06

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