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 :

Filtrage ListBox Multiselect


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Data
    Inscrit en
    Mai 2023
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Data

    Informations forums :
    Inscription : Mai 2023
    Messages : 14
    Par défaut Filtrage ListBox Multiselect
    Bonjour tout le monde,

    Je suis en stage dans une boîte qui me demande de faciliter la recherche dans de grande base de données.
    J'ai donc créé un UserForm avec différentes comboxes, checkboxes qui fonctionnent.
    Maintenant j'aimerais intégrer des listboxes qui contiennent une liste de plusieurs dizaines de compétences (R, Python, VBA, etc...) et une contenant les secteurs (Assurances, Banques, etc...).
    J'ai donc rempli mes ListBoxes et activer la multiselection mais je n'arrive pas à produire un code qui serait capable de chercher si les compétences cochées dans la listbox sont présentes dans une cellule. Les cellules contiennent une liste de différentes compétences. Par exemple si je sélectionne Python et VBA et que la colonne M de candidat 1 correspond à VBA, SAS, Python et que candidat 2 = SAS, R, SPSS
    j'aimerais que seul le candidat 1 soit retenu et apparaisse sur ma nouvelle base de données (qui apparaît sur une feuille "RESULTATS")

    J'ai essayé d'intégrer ce "code" ou plutôt cette méthode à mon code :
    https://www.developpez.net/forums/bl...ne-caracteres/
    Mais rien n'y fait je suis perdue...

    Avez vous des conseils ?

    Merci beaucoup !

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il sera extrêmement compliqué de vous aider si vous n'afficher pas votre code et n'expliquiez plus en détail votre problématique.
    Une illustration d'une portion de vos données serait un plus.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre averti
    Femme Profil pro
    Data
    Inscrit en
    Mai 2023
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Data

    Informations forums :
    Inscription : Mai 2023
    Messages : 14
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Il sera extrêmement compliqué de vous aider si vous n'afficher pas votre code et n'expliquiez plus en détail votre problématique.
    Une illustration d'une portion de vos données serait un plus.
    Bonjour, oui désolée ! Je n'ai pas trop l'habitude.
    Voici mon UserForm : Nom : usf.PNG
Affichages : 141
Taille : 37,5 Ko

    et voici un extrait de ma base :
    Nom : exemple.PNG
Affichages : 140
Taille : 12,2 Ko

    En ce qui concerne mon code, voici la procédure lorsque l'on appuie sur Rechercher :

    Private Sub RECHERCHER_Click()

    Dim wsCandidats As Worksheet
    Dim wsResultats As Worksheet
    Dim critere As String
    Dim i As Long
    Dim col As Range
    Dim maxWidth As Double
    maxWidth = 50

    Set wsCandidats = ThisWorkbook.Sheets("CANDIDATS")
    Set wsResultats = ThisWorkbook.Sheets("RESULTATS")

    wsResultats.Cells.ClearContents
    wsResultats.Cells.ClearFormats

    ' On créé une chaîne de critères en fonction des CheckBoxes cochées
    critere = ""
    If CheckBoxE1.Value Then critere = critere & "E1,"
    If CheckBoxE2.Value Then critere = critere & "E2,"
    If CheckBoxE3.Value Then critere = critere & "E3,"
    If CheckBoxFREELANCE.Value Then critere = critere & "FREELANCE,"
    If CheckBoxPROPALE_MISSION.Value Then critere = critere & "PROPALE MISSION,"
    If CheckBoxRECRUTEMENT.Value Then critere = critere & "RECRUTEMENT,"
    If CheckBoxVIVIER.Value Then critere = critere & "VIVIER,"

    If critere <> "" Then critere = Left(critere, Len(critere) - 1)

    ' On clean notre feuille résultats
    wsResultats.Cells.ClearContents

    ' On copie les en-têtes de colonne
    wsCandidats.Range("A2").EntireRow.Copy Destination:=wsResultats.Range("A1")

    ' On applique nos filtres
    If critere <> "" Then
    With wsCandidats.Rows(2).Resize(wsCandidats.Cells(wsCandidats.Rows.count, "B").End(xlUp).row - 1)
    .AutoFilter Field:=2, Criteria1:=Split(critere, ","), Operator:=xlFilterValues

    Dim cell As Range
    Dim visibleRows As Range

    ' Afin d'éviter les problèmes avec le langage R, on créer un objet "regex"
    Dim regex As New RegExp
    regex.Pattern = "\bR\b" ' Cherche R isolé (le \b dénote les limites du mot)


    ' On créé le filtre pour ComboBoxINTERLOC
    If ComboBoxINTERLOC.Value <> "" Then
    .AutoFilter Field:=3, Criteria1:="*" & ComboBoxINTERLOC.Value & "*", Operator:=xlAnd
    End If

    End With

    ' Collecter les compétences sélectionnées
    Dim arrComp() As Variant
    Dim comp As Variant
    Dim j As Long

    If ListBoxCOMP.ListIndex <> -1 Then
    ReDim arrComp(0 To ListBoxCOMP.ListCount - 1)
    For i = 0 To ListBoxCOMP.ListCount - 1
    If ListBoxCOMP.Selected(i) Then
    arrComp(j) = "*" & ListBoxCOMP.list(i) & "*"
    j = j + 1
    End If
    Next i
    ReDim Preserve arrComp(0 To j - 1)
    End If

    ' Filtre les candidats par compétences
    If Not IsEmpty(arrComp) Then
    For Each comp In arrComp
    .AutoFilter Field:=13, Criteria1:=comp, Operator:=xlAnd
    With .SpecialCells(xlCellTypeVisible)
    .EntireRow.Copy Destination:=wsResultats.Cells(wsResultats.Cells(Rows.count, "A").End(xlUp).row + 1, 1)
    End With
    .AutoFilter Field:=13
    Next comp
    End If


    ' On supprime la première colonne
    wsResultats.Columns(1).Delete

    ' On ajuste la largeur des colonnes et la hauteur des lignes
    wsResultats.Cells.EntireColumn.AutoFit

    For Each col In wsResultats.UsedRange.Columns
    col.AutoFit
    If col.ColumnWidth > maxWidth Then
    col.ColumnWidth = maxWidth
    End If
    Next col

    wsResultats.Rows.RowHeight = 20

    ' Harmonisation du fond des cellules en blanc
    wsResultats.Range("A2:Z" & wsResultats.Cells(Rows.count, "A").End(xlUp).row).Interior.Color = RGB(255, 255, 255)

    ' Colonne à trier en fonction de la sélection de ComboBoxTRIER
    Dim colToSort As Range
    Set colToSort = wsResultats.Rows(2).Find(What:=ComboBoxTRIER.Value, LookIn:=xlValues, LookAt:=xlWhole)

    ' On vérifie si la colonne a été trouvée
    If Not colToSort Is Nothing Then
    ' On tri les données
    Dim sortOrder As XlSortOrder
    If OptionButton1.Value = True Then
    sortOrder = xlAscending
    ElseIf OptionButton2.Value = True Then
    sortOrder = xlDescending
    Else
    ' Si aucune option n'est choisie, ne pas trier
    GoTo AfterSorting
    End If

    With wsResultats.Sort
    .SortFields.Clear
    .SortFields.Add Key:=colToSort, SortOn:=xlSortOnValues, Order:=sortOrder, DataOption:=xlSortNormal
    .SetRange wsResultats.UsedRange
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
    End With
    End If

    AfterSorting:

    ' On affiche un message si aucun candidat n'a été trouvé
    If wsResultats.Cells(Rows.count, "A").End(xlUp).row = 1 Then
    MsgBox "Aucun candidat trouvé."

    Else

    ' On affiche la feuille "RESULTATS" et on ferme le UserForm
    Sheets("RESULTATS").Select
    usfCandidat.Hide

    End If

    End Sub


    J'espère que je le fais de la bonne façon... merci !

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour
    Si j'ai bien compris, votre problème est de rechercher les enregistrements (lignes) qui contiennent dans la colonne nommée Outils l'une des compétences sélectionnée dans la liste déroulante ?

    Si ce que j'ai compris est exact, vous devez donc en premier lieu récupérer les éléments sélectionnés dans le formulaire et ensuite effectuer une recherche dans la colonne "Outils" pour chaque mot sélectionné.
    • Pour récupérer les éléments sélectionnés, vous pouvez utiliser ou vous inspirer de la fonction générique que je propose dans l'un de mes billets titré VBA - Fonction qui renvoie une chaîne de caractères des éléments sélectionnés dans un ListBox (Lien que je vous avais déjà donné dans votre autre discussion sur le même sujet ListBox VBA - multiselection
    • Pour séparer les mots renvoyés par la fonction que j'ai publiée, vous devez utiliser la fonction Split qui va vous renvoyer une variable tableau (voir tutoriel référencé ci-dessous)
    • Pour la recherche, vous pouvez utiliser la méthode Find intégrée dans une boucle (voir tutoriel référencé ci-dessous)


    Liste de tutoriels qui vous aideront
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre averti
    Femme Profil pro
    Data
    Inscrit en
    Mai 2023
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Data

    Informations forums :
    Inscription : Mai 2023
    Messages : 14
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour
    Si j'ai bien compris, votre problème est de rechercher les enregistrements (lignes) qui contiennent dans la colonne nommée Outils l'une des compétences sélectionnée dans la liste déroulante ?

    Si ce que j'ai compris est exact, vous devez donc en premier lieu récupérer les éléments sélectionnés dans le formulaire et ensuite effectuer une recherche dans la colonne "Outils" pour chaque mot sélectionné.
    • Pour récupérer les éléments sélectionnés, vous pouvez utiliser ou vous inspirer de la fonction générique que je propose dans l'un de mes billets titré VBA - Fonction qui renvoie une chaîne de caractères des éléments sélectionnés dans un ListBox (Lien que je vous avais déjà donné dans votre autre discussion sur le même sujet ListBox VBA - multiselection
    • Pour séparer les mots renvoyés par la fonction que j'ai publiée, vous devez utiliser la fonction Split qui va vous renvoyer une variable tableau (voir tutoriel référencé ci-dessous)
    • Pour la recherche, vous pouvez utiliser la méthode Find intégrée dans une boucle (voir tutoriel référencé ci-dessous)


    Liste de tutoriels qui vous aideront
    Merci ! Effectivement votre premier lien me semblait être une bonne piste mais je n'arrivais pas à spliter les élements de la liste etc. Merci beaucoup ! J'ai l'impression que ce que je souhaite faire est possible finalement
    Savez vous s'il est possible de faire cette recherche en disant que l'on souhaite au moins l'une des compétences sélectionnées VS (si on coche sur une checkbox) toutes les compétences sélectionnées?

    Merci encore pour votre temps, je me penche sur votre réponse tout de suite !

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Effectivement votre premier lien me semblait être une bonne piste mais je n'arrivais pas à spliter les élements de la liste etc
    Split est une fonction VBA qui permet d'extraire une chaîne de caractères en fonction d'un délimiteur pour obtenir une variable tableau à une dimension alors que Join regroupe les valeurs d'un tableau en une chaîne de caractères, en définissant un délimiteur (caractère espacé par défaut)

    Autrement dit, lorsque vous avez une chaîne de caractères telle que "Python;Dataiku;R;VBA", la procédure suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub t()
      Const Text As String = "Python;Dataiku;R;VBA"
      Dim t As Variant
      t = Split(Text, ";")
      MsgBox Join(t, vbCrLf)
    End Sub
    va afficher

    Nom : 230517  dvp Split.png
Affichages : 128
Taille : 3,7 Ko

    Dans l'exemple ci-dessus t(0) contient "Python" et t(3) contient "VBA" donc il suffit de faire une boucle sur les éléments de la variable t en utilisant la méthode Find dans la colonne Outils pour trouver les enregistrements (lignes) de votre table de données et pour connaître ainsi les lignes qui contiennent ces mots.
    Vous pourriez aussi utiliser le filtre automatique d'excel ou le filtre avancé (AdvancedFilter en VBA) ou sans doute encore Power Query. Il y a toujours plusieurs façons d'arriver à résoudre un problème.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. MVVM + Listbox + Multiselect : Bind sur selecteditems ?
    Par zax-tfh dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 10/11/2010, 15h04
  2. Listbox multiselect ?
    Par maxmarie dans le forum ASP.NET
    Réponses: 4
    Dernier message: 10/02/2009, 15h02
  3. vb.net - ListBox Multiselect Drag & Drop
    Par House MD dans le forum VB.NET
    Réponses: 0
    Dernier message: 20/01/2009, 01h20
  4. Filtrage listbox et remplissage textbox
    Par Elumastebit dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/12/2008, 11h29
  5. Quel est la valeur d'une listbox multiselect non selectionnée?
    Par jolzeviking dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/09/2008, 12h29

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