Recherche d'un critère via Textbox dans ListBox

Bonjour à toutes et à tous,

Un sujet très connu sauf que je n'arrive pas à faire ce que je veux....

J'ai 20 colonnes dans une feuille se nommant "BDD". J'utilise une listbox pour afficher ces 20 colonnes en utilisant ".RowSource". Mon objectif est de faire une recherche via une colonne de la listbox en utilisant une Textbox. En l'occurrence, la première et uniquement celle-ci (Exemple : AE...). Pas besoin de devoir choisir un critère (colonne) et ensuite de taper en fonction.

Le problème que j'ai est je sais afficher en faisant des "Additem" sauf que je ne peux ajouter que 10 colonnes avec cette méthode...

Auriez vous une solution pour filtrer et afficher les 20 colonnes ?

Vous trouverez un fichier : Pour accéder à l'endroit qui bloque, il faut que vous vous connectiez : id = adf & mdp = aze, puis cliquez sur BDD. Vous y trouverez :

  • une listbox
  • une textbox

Merci par avance

Bien cordialement,

edit modo : cfr feuille Roles

Bonjour,

quelqu'un aurait-il une idée pour résoudre mon problème ? N'ai-je pas été assez précis dans la demande ?

N'hésitez pas si besoin

A+

Bonjour

Si tune donnes pas les MDP pour ouvrir le fichier,il va être très difficile de répondre à ta demande

Crdlt

Bonjour Joco,

J'ai écris l'identifiant et mdp correspondant dans le message précédent... (adf et aze).

Dans tous les cas, tu as raison, je vais faire plus simple en enlevant l'id et mdp. Ca sera plus simple.

Désolé pour ce désagrément.

A+

edit modo : cfr feuille Roles

Bonjour à toutes et à tous,

Je me permets d'insister sur le sujet....

S'il n'existe pas de solution, veuillez m'en notifier.

Merci par avance

A+

Bonjour

Désolé pour vos fichiers qui contiennent des données confidentielles dans la feuille Roles

Remplacez déjà votre code Private Sub UserForm_Activate() par celui ci-dessous

Private Sub UserForm_Initialize()
Dim i As Integer, j As Integer
Dim plage As Range
Dim tablo()
Dim f As Worksheet

Set f = Sheets("BDD_OP")
Set plage = f.Range("A3:T" & f.Range("A" & Rows.Count).End(xlUp).Row)
ReDim tablo(1 To plage.Rows.Count, 1 To plage.Columns.Count)
For i = 1 To plage.Rows.Count
     For j = 1 To plage.Columns.Count
         tablo(i, j) = f.Cells(i + 2, j).Value
     Next j
Next i
Lbx_BDD.List = tablo
End Sub

Cordialement

Bonjour Dan,

Au temps pour moi, j'avais oublié d'enlever ces informations.

Voici le fichier sans données sensibles avec votre code proposé.

Néanmoins, je n'ai plus de headers.

Merci

Néanmoins, je n'ai plus de headers.

Oui avec la méthode additem, vous avez deux possibilités
- Refaire une listbox collée à celle que vous avez. Elle pourrait servir à ajouter les headers.
ou
- ajouter des labels au dessus de la listbox existante. Cette solution est moins pratique car si vous agrandissez les colonnes de la listbox, il faut repositionner chaque label

Je préconise plutot la première solution car vous donnez une dimension de colonnes identique aux deux listbox.
Le seul souci que je verrais est dû au fait que vous utilisez 20 colonnes, ce qui n'est pas pratique pour les titres si vous devez scroller à droite ou à gauche pour aller consulter des colonnes masquées.
Ou alors vous ajoutez le titre dans la liste des items ou simplement réduire le nombre de colonnes dans votre listbox

Autre solution, changer votre listbox pour une listview. Là il faut tout refaire Userform et codes associés et ne fonctionner qu'avec excel Windows

Bonjour Dan,

Je me questionne suite à l'utilisation de "Lbx_BDD.List = tablo". Pourquoi ne pas utiliser ".RowSource" qui permet d'intégrer des headers automatiquement ?

Ensuite, merci pour votre aide concernant les 2 solutions proposées. Par ailleurs, le sujet principal où je suis bloqué concerne la recherche dans la textbox qui filtre la listbox.

Avez-vous une idée pour filtrer 20 colonnes d'une listbox avec une textbox ?

La piste "Lbx_BDD.List = tablo" est-elle plus adaptée pour répondre à ma demande ?

Merci par avance

A+

Bonjour

Je me questionne suite à l'utilisation de "Lbx_BDD.List = tablo". Pourquoi ne pas utiliser ".RowSource" qui permet d'intégrer des headers automatiquement ?

On le répète toujours, évitez à tout prix d'utiliser cette instruction Rowssource qui pose parfois des soucis avec VBA. On a plus de facilité avec ADDITEM ou LIST.
Exemple :
- RowSource interdit la suppression d'élément de la liste et le Clear
- En cas de recherche il faut faire un second tableau (dans une autre feuille) avec le résultat de la recherche et puis placer ce tableau dans la propriété RowSource

J'ai utilisé LIST parce que le code crée d'abord un tableau avec toutes vos données et que l'instruction List est utilisée pour charger le tableau dans la listbox. Il existe d'autres manière de faire.

Avez-vous une idée pour filtrer 20 colonnes d'une listbox avec une textbox ?

Absolument oui, mais la question de la listbox est essentielle. Si vous testez la listbox comme proposé dans le code de mon post précédent, je vous donne le code de recherche


Edit : Pour faire plus simple à l'ouverture de l'USF avec Listbox et selon votre tableau en feuille BDD_OP, le code que je vous ai proposé pourrait être ceci aussi

Private Sub UserForm_Initialize()
Dim plage As Range
Dim f As Worksheet

Set f = Sheets("BDD_OP")
Set plage = f.Range("A3:T" & f.Range("A" & Rows.Count).End(xlUp).Row)
Lbx_BDD.List = plage.Value
End Sub

Dan,

Merci pour ces informations !

Je pense utiliser la première option que j'ai update dans ce fichier :

A+

Ok pour le fichier.
Faites ceci :

1. Juste au dessus de votre première ligne Private Sub TB_champs_recherche_Change(), ajoutez cette ligne de code

Dim f As Worksheet

2. Modifiez le code Initialize comme ceci (on gagne en rapidité à l'ouverture)

Private Sub UserForm_Initialize()
Dim plage_header As Range

Set f = Sheets("BDD_OP")

Call chargerUSF

Set plage_header = f.Range("A2:T2")
Lbx_BDD_headers.List = plage_header.Value
End Sub

3. Ajoutez ce code en dessous du code initialize

Private Sub chargerUSF()
Dim plage As Range

Set plage = f.Range("A3:T" & f.Range("A" & Rows.Count).End(xlUp).Row)
Lbx_BDD.List = plage.Value
End Sub

4. Remplacez votre code Private Sub TB_champs_recherche_Change() par celui ci-dessous

Private Sub TB_champs_recherche_Change()
Dim i As Integer, j As Integer, k As Integer
Dim plage As Range
Dim tablo()
Dim Recherche As String

If TB_Champs_recherche = vbNullString Then
    Lbx_BDD.Clear
    Call chargerUSF
End If

Set plage = f.Range("A3:T" & f.Range("A" & Rows.Count).End(xlUp).Row)

ReDim tablo(1 To plage.Rows.Count, 1 To plage.Columns.Count)
k = 1

For i = 1 To f.Range("A" & Rows.Count).End(xlUp).Row
    If UCase(f.Range("A" & i + 2).Value) Like "*" & UCase(TB_Champs_recherche) & "*" Then
        For j = 1 To plage.Columns.Count
            On Error Resume Next
            tablo(k, j) = f.Cells(i + 2, j).Value
        Next j
        k = k + 1
        End If
Next i

Lbx_BDD.List = tablo

'supprimer les lignes vides dans listbox
For i = Lbx_BDD.ListCount - 1 To 0 Step -1
    If Lbx_BDD.List(i, 1) = "" Then Lbx_BDD.RemoveItem (i)
Next i
End Sub

Rem : si le code de recherche vous semble long, essayez en remplaçant Private Sub TB_champs_recherche_Change() par --> Private Sub TB_Champs_recherche_AfterUpdate().
Du coup, la recherche ne commencera que lorsque vous avez complété la textbox et que vous avez confirmé par Entrée sur le clavier

Ne repostez pas votre fichier, j'ai votre dernier sur lequel je travaille

Dites-moi après test

quand tu mets "edit" c'est que tu as update le fichier de mon dernier message ?

Pas réveillé ce matin ou juste idiot que je suis

Update : j'ai eu ta notif trop vite haha

quand tu mets "edit" c'est que tu as update le fichier de mon dernier message ?

Non c'est juste que j'ai viré mon message car j'ai vu que je pouvais faire autrement. Mon message n'était pas correct

Tout est ok !

Merci beaucoup !

Rechercher des sujets similaires à "recherche critere via textbox listbox"