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 automatique dans combobox VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Par défaut Filtre automatique dans combobox VBA
    Bonjour,

    J'ai codé une petite application en VBA qui me permet de réaliser des filtres automatique mais sans un aspect "feuille Excel".

    ouskel'n'or m'a aidé à résoudre pas mal de petits soucis (ici).

    Mais il me reste une problématique:
    J'ai un tableau et dans un userform 10 combobox qui correspondent chacune à une colonne de mon tableau. C'est combobox sont alimentées de telle façon qu'il n'y ait pas de doublon et classé par ordre alphabétiques.

    Toutes ces combobox fonctionne très bien indépendamment (le résultat du filtre s'affiche dans une listebox) mais je souhaiterais qu'elle fonctionne comme un filtre automatique sous Excel. C'est à dire que dès que je sélectionne une combobox, les autres se recalcule en fonction du résultat.

    Je met le programme en pièce jointe et le code de la fonction qui remplit ses combobox

    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
    Private Sub UserForm_Initialize()
        Dim Plage As Range
        Set Plage = Range("A1").CurrentRegion
        RemplirListe RechercheC1, Plage, 1
        RemplirListe RechercheC2, Plage, 2
        RemplirListe RechercheC3, Plage, 4
        RemplirListe RechercheC4, Plage, 5
        RemplirListe RechercheC5, Plage, 6
        RemplirListe RechercheC6, Plage, 7
        RemplirListe RechercheC7, Plage, 8
        RemplirListe RechercheC8, Plage, 9
        RemplirListe RechercheC9, Plage, 10
        RemplirListe RechercheC10, Plage, 13
        Call Rechercher
    End Sub
    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
    Sub RemplirListe(Liste As ComboBox, Plage As Range, Colonne As Long)
        Dim j As Long
        With Plage
            'Tri sur la colonne
            .Sort key1:=.Cells(1, Colonne), order1:=xlAscending, Header:=xlYes
            'Ajoute la 1ere entree (2eme ligne)
            Liste.AddItem .Cells(2, Colonne)
            For j = 3 To .Rows.Count - 1
                'Ne charge pas les cellules vides
                If IsEmpty(.Cells(j, Colonne)) Then Exit For
                'Filtre les doublons
                If .Cells(j, Colonne) <> .Cells(j - 1, Colonne) Then Liste.AddItem .Cells(j, Colonne)
            Next
        End With
    End Sub
    Merci d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    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
    Hello fabien, peux-tu donner un exemple ?
    Je sélectionne quoi dans quelle liste et je veux obtenir quoi dans les autres liste ?... Par exemple

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Par défaut
    Par exemple je sélectionne largeur = 90

    Donc dans la liste box on voit le résultat de la recherche:

    Il n'y a que du "contrecollé" (type), que du "CLIC" (type de pose), qu'un fournisseur, etc

    Et quand on regarde les autres combobx, et bien elle sont restés avec les valeurs de départ. Et donc, d'une c'est pas très pratique pour appliquer un autre filtre en plus du premier, et de deux ça fait planter l'application si je choisit un autre 2e critère non présent dans la listebox, par exemple "R+L" (type de pose)

  4. #4
    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
    Donc, si tu sélectionnes dans une liste, l'item correspond à un N° de ligne dans la base de données et, sur la même ligne, tu as les renseignements qui vont bien... Si c'est ça, je ne comprends pas l'usage des listeBox. Que dois-tu avoir dans les autres listes ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Par défaut
    -Mon tableau de donnée fait 1000 lignes
    -Je sélectionne dans la combobox 1 le critère "CLIC" (correspondant à la colonne 1 de mon tableau)
    -Il y a 500 ligne de mon tableau qui répondent à ce critère. Elles sont affichées dans la listebox
    -Ma liste box est remplie de ses 500 lignes
    -Je sélectionne dans la combobox 2 le critère "20" (correspondant à la colonne 2 de mon tableau)
    -Il y a 100 lignes de mon tableau qui répondent à ces critères.
    -Elles sont affichées dans la listebox
    Ainsi de suite

    Le souci est que mes combobox s'alimentent au début de l'application sur les 3000lignes du départ et non sur le résultat des recherches.

  6. #6
    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
    Ton problème est assez tordu puisque dans un filtre tu ne peux entrer que deux critères. Dans Contribuez, tu as une méthode pour obtenir un filtre sans t'occuper du nombre de critères mais je ne vois pas encore comment l'adapter. Jète toujours un oeil, juste pour le principe mais ne t'y attarde pas.
    Ce qu'il faudrait faire est un appel à une fonction filtre qui fonctionnerait en cascade en partant de la première sélection. Reste à écrire la mécanique...
    Dès que j'ai un moment, je regarde mais ne te promets rien...
    En attendant je laisse donc la place à ceux qui ont de l'imagination
    A+ quand même, la question reste intéressante

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Par défaut
    Ton lien est intéressant. Je le regarderais de plus près.

    Ma fonction recherche fonctionne a peu près bien. Le souci est qu'il faudrait réinitialiser mes combobox en fonction du résultat de la recherche.

    Je change le critère 1
    Tous mes autres combobox se remplissent (toujours sans doublon et dans l'odre) avec les résultats de cette recherche (qui sont stocké dans ma listebox)
    Ainsi de suite

  8. #8
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879

  9. #9
    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
    Alors voilà ! Après mure réflexion et un mal de tête carabiné, j'ai pensé à une solution.
    On part du combo1
    Tu sélectionnes un item.
    Cet item devient le critère 1
    Tu places ce critère dans un tableau (avec Redim Preserve)
    Dans le combo 2, tu te contentes de la liste obtenue avec un filtre sur le critère 1
    Dans Combo 2, tu sélectionnes un item
    Cet item devient le critère 2
    Tu places ce critère dans un tableau (avec Redim Preserve)
    Dans le combo 3, tu peux encore te contenter de la liste obtenue avec un filtre sur les critères 1 et 2
    On a atteint la limite des critères dans un filtre auto
    Dans Combo 3, tu sélectionnes un item
    Tu places ce critère dans un tableau (avec Redim Preserve)
    Là, avec ton tableau, tu peux utiliser la procédure dont je t'ai donné le lien
    Tu obtiendras ainsi la liste à utiliser pour renseigner le Combo 4
    Dans Combo 4, tu sélectionnes un item
    Tu continues à placer ce critère dans le tableau
    etc.

    Maintenant, si on veut uniformiser tout ça, au lieu de varier les plaisirs, pour chaque sélection dans un combo, tu utilises la même procédure en mettant ton tableau en paramètre.
    Avec un seul item dans ton tableau, ça fonctionnera aussi bien qu'avec plusieurs et ça simplifiera l'écriture.
    Si j'ai bien compris (!)

    Still to do...

    Tu crois que tu pourras t'en sortir ?
    A+

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Par défaut
    ouahh....

    Je vais tentes de coder tout ça. A tête reposé bien sur

    Est ce que c'est gênant si l'ordre des critères varie. Une personne peu très bien commencer par le critère 5, puis le 2, puis le 4 etc ?

    Merci à toi ouskel'n'or. Tu veux un aspirine

    Merci pour la piste delphi

  11. #11
    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
    Citation Envoyé par fabien114 Voir le message
    Est ce que c'est gênant si l'ordre des critères varie. Une personne peu très bien commencer par le critère 5, puis le 2, puis le 4 etc ?
    En principe, non. Tu crées le tableau de critères au fur et à mesure.
    Il faudrait tout de même prévoir un bouton pour ré-initialiser tes combos afin de saisir une nouvelle "combinaison" et donc placer le code que tu as mis dans Userform_Initialise dans une procédure que tu puisses appeler depuis Userform_Initialise et depuis ce bouton.
    Si tu ne tu as un pb, tu dis

    Tu veux un aspirine
    Merci, c'est fait

  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
    Je crois que j'ai mal compris ta question : Tu veux que chaque donnée de ton combo ListBoxParquet soit reporté dans chaque combo RechercheC ?
    Si c'est ça, j'ai effectivement mal compris.
    Tu peux préciser ?
    A+

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Par défaut
    Actuellement mes combobox s'initialise une seule fois au lancement de l'application.

    Par conséquent, quand je choisi un critère dans une combobox rechercheC pour réduire le nombre de donnée affiché dans ma listeboxparquet, et bien les autres combobox rechercheC ont gardé leur premières valeurs. Il faudrait qu'elle se réactualise par rapport à mon premier critère, etc

    But final: avoir le même système que le bouton "Filtrer" d'Excel.

    Je pense que le plus simple c'est que tu essaie l'application que j'ai mis dans le premier post, tu comprendras tout de suite


    PS: ma fonction qui recherche mes données et qui les affiche dans ma listboxparquet fonctionne bien (graçe à toi sur mon autre post).

  14. #14
    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
    Ok. C'est ce que j'avais compris. Ce qui m'a parturbé c'est ton Combo à x colonnes. Je me demandais ce qu'il venait faire là.
    En fait, une fois réalisé l'appli, ce combo ne sert plus à rien.
    Une liste de fournisseurs sans doublon, une liste de type sans doublon, etc.
    Lors de la sélection dans un combo, les autres combos sont nettoyés de ce qui n'appartient pas à la sélection.
    C'est bien ça ?
    A+

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Ok. C'est ce que j'avais compris. Ce qui m'a parturbé c'est ton Combo à x colonnes. Je me demandais ce qu'il venait faire là.
    En fait, une fois réalisé l'appli, ce combo ne sert plus à rien.
    Et bien ce combo sert à afficher le résultat des recherche sous forme de tableau. Et aussi il me permet d'y masquer des colonnes


    Citation Envoyé par ouskel'n'or Voir le message
    Une liste de fournisseurs sans doublon, une liste de type sans doublon, etc.
    Lors de la sélection dans un combo, les autres combos sont nettoyés de ce qui n'appartient pas à la sélection.
    C'est bien ça ?
    A+
    oui ce serait ça que je souhaiterai.

  16. #16
    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 déjà un début qui permet de mettre à jour tous les combobox à partir d'une sélection dans l'un d'eux.
    De là découle la mise à jour du combo ListBoxParquet. Le principe est le même.
    C'est brut de fonderie, on peut sans doute simplifier, ce sera dans un second temps.
    Je te mets le fichier, si je retravaille dessus, je le remplacerai pas une mise à jour.
    Tu testes et si tu as besoin d'explications, elles viennent.
    J'ai basculé tes macros utilisées dans l'userform dans la feuille de code de l'userform. Ça simplifie le code.
    Tu dis
    Bonne journée
    A+

    Edit
    Bon, j'ai réglé le pb du combo ListBoxParquet. Tu regardes et tu dis.

    Les combos.zip (avec dernières corrections)

    Les explications :
    Je ne mets qu'une procédure RechercheC pour le principe
    Elles sont toutes sur le même modèle
    Le boolean INIT neutralise l'événement Change des combos lors de la suppression des doublons dans la sub Rechercher()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub RechercheC10_Change()
            If Not INIT Then Rechercher RechercheC10, 10
    End Sub
    Bouton ajouté afin de ré-initialiser le bidule
    CORRIGÉ dans le fichier joint ( ou j'avais mis [Initialisation ""] )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Initialise_Click()
            Rechercher "", 0
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub UserForm_Activate()
    Dim Largeur As String, Critere As String
        'Création de l'instance de la feuille "Données1" afin
        'FL1 sera utilisé dans toutes les procédures
        Set FL1 = Worksheets("Données1")
        'Fixe la largeur de colonnes des 13 colonnes "utiles"
        Largeur = "80;70;70;50;40;40;40;120;0;0;70;20;0"
        Me.ListBoxParquet.ColumnWidths = Largeur
     
        initialisation ("")
        Rechercher Critere, 0
    End Sub
    Sub initialisation()
    Renseigne le combo ListBoxParquet
    Si critère = "" => Signifie qu'on initialise le combo
    Si Critère <> "" => Signifie qu'un critère a été posé dans la sub Rechercher()
    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
    Sub initialisation(Critere As String)
    Dim Tablo() As Variant, Plage As Variant, Cell As Range, Solde As Range
    Dim NoLig As Long, NoCol As Integer
        If Critere = "" Then
            'Utilise la totalité de la plage de données
            If FL1.FilterMode = True Then FL1.Cells.AutoFilter
            Plage = FL1.UsedRange.SpecialCells(xlCellTypeVisible).Value
            Me.ListBoxParquet.Clear
            Me.ListBoxParquet.List() = Plage
          Else
            'Ne renseigne le combo que de la plage de données filtrée
            Set Solde = FL1.UsedRange.SpecialCells(xlCellTypeVisible)
            NoLig = 1
            'Parcourt la plage de données visible
            'Le nombre de colonnes de la plage est de 15
            'Si des colonnes sont ajoutées, ne nombre devra être modifié
            'Cette boucle lit les données ligne après ligne
            'Toutes les 15 colonnes, reprend à la colonne 1 et
            'passe à la ligne suivante
            For Each Cell In Solde
                ReDim Preserve Tablo(1 To 15, 1 To NoLig)
                NoCol = NoCol + 1
                If NoLig > 1 Then Tablo(NoCol, NoLig) = Cell
                NoCol = NoCol Mod 15
                If NoCol = 0 Then NoLig = NoLig + 1
            Next
            Me.ListBoxParquet.Column() = Tablo
        End If
    End Sub
    Sub Rechercher()Renseigne les 10 combos. Critere correspond à une sélection dans un ComboBox
    Combo correspond au N° du combo dans l'userform
    Si pas de critere ni No de combo => Pas de filtre
    Sinon => Filtre sur la colonne ListCol(combo)
    CORRIGÉ dans le fichier joint (voir explication [1])
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    'Renseigne les 10 combos. Critere correspond à une sélection dans un ComboBox
    'Combo correspond au N° du combo dans l'userform
    'Si pas de critere ni No de combo => Pas de filtre
    'Sinon => Filtre sur la colonne ListCol(combo)
    Sub Rechercher(Critere As String, Combo As Integer)
    Dim ListCol As Variant, NoLig As Long, NoCol As Integer, Colonne As String
    Dim Plage As Range, Cell As Range, DerLig As Long
    ListCol = Array(, 1, 2, 4, 5, 6, 7, 8, 9, 10, 13)
    'Le fait de renseigner une liste sans doublon provoque l'événement Change
    'INIT permet de neutraliser cet événement
    INIT = True
        DerLig = Split(FL1.UsedRange.Address, "$")(4)
        If FL1.FilterMode = True Then FL1.Cells.AutoFilter
        If Combo <> 0 Then
            Colonne = FL1.Columns(ListCol(Combo)).Address(0, 0)
            If Err.Number <> 0 Then
                Err.Clear
                On Error GoTo 0
                FL1.Columns(Colonne).AutoFilter Field:=1, Criteria1:=CDbl(Critere)
              Else
                FL1.Columns(Colonne).AutoFilter Field:=1, Criteria1:=Critere
            End If
        End If
     
        'Définit la plage selon le critère de filtre. Si pas de critère, pas de filtre
        For NoCol = 1 To 10
            If Not Critere = "" Then
                DoEvents
                On Error Resume Next '[*]Gestion d'erreur
                Set Plage = FL1.Range(Cells(2, ListCol(NoCol)), Cells(DerLig, ListCol(NoCol))).SpecialCells(xlCellTypeVisible)
                If Err.Number = 1004 Then Exit For
               Else
                DerLig = Split(FL1.UsedRange.Address, "$")(4)
                Set Plage = FL1.Range(Cells(2, ListCol(NoCol)), Cells(DerLig, ListCol(NoCol)))
            End If
     
            Me.Controls("RechercheC" & NoCol).Clear
            Me.Controls("RechercheC" & NoCol).AddItem "" 'Place une ligne vide ds le combo
     
            'Renseigne les dix combobox
            For Each Cell In Plage
                If Trim(Cell) <> "" Then
                    Me.Controls("RechercheC" & NoCol) = Cell
                    If Me.Controls("RechercheC" & NoCol).ListIndex = -1 Then _
                        Me.Controls("RechercheC" & NoCol).AddItem Cell
                End If
            Next
            Me.Controls("RechercheC" & NoCol).ListIndex = 0
        Next
        If Err.Number = 1004 Then Rechercher Critere, Combo
     
    INIT = False
    initialisation (Critere) 'Renseigne le combo ListBoxParquet
    End Sub
    J'attends de tes nouvelles

    [1] - J'ai rencontré un problème avec les critères "épaisseur" contenant une virgule (9,6 7,5 ...) non reconnu par le filtre.
    J'ai donc ajouté une gestion d'erreur
    Celle-ci relance la procédure, convertit le nombre à virgule flottante en "double" et réalise le filtre correspondant.
    Transparent pour l'utilisateur.
    Tu as là le nouveau code.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Par défaut
    Salut,

    C'est pour te dire que je n'avais oublié ce post. Mais je n'ai toujours pas trouvé le temps de m'y pencher dessus. J'ai vu que tu avais passé du temps sur mon problème et je t'en remercie.

    Des que j'ai du temps je me penche sur ton programme.

    Encore merci

Discussions similaires

  1. [XL-2010] Filtre automatique dans userform
    Par duplaly dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 20/07/2011, 01h42
  2. [AC-2007] Filtres automatiques dans un formulaire
    Par vandrie dans le forum IHM
    Réponses: 1
    Dernier message: 06/09/2010, 18h23
  3. [XL-2003] Filtre Automatique dans tableau
    Par Tintou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/03/2010, 19h15
  4. Saisie semi-automatique dans combobox
    Par method_man dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 04/04/2007, 17h11
  5. [Excel] Récupération d'un filtre automatique dans une cellule
    Par billy123 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 01/03/2007, 16h32

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