FormulaireRecherche par filtres avec renvoi des lignes filtrées dans listbox

SneakyZEKE

XLDnaute Nouveau
Bonjour à tous,

Voici le second problème...ou plutôt les seconds problèmes qui me bloques dans l'avancement de mon projet !

J'ai toujours un tableau A2:J1000 avec un (premier) bouton nommé "Rechercher", qui en fait se trouve n'être qu'une application des filtres Excel par une macro.

L'idée restant toujours d’empêcher l'utilisateur lambda d'avoir accès au tableau et de l'obliger à passer par les boutons et formulaire dont voici un aperçu :

Sans titre.JPG

L'idée serai que l'utilisateur puisse effectué une recherche avec l'un ou plusieurs des champs issus des colonnes B, C, D, G, H et I et que le résultat de ces filtre soient affichés dans une listbox où, un ou plusieurs des résultats pourront être sélectionnés pour ensuite se voir appliquer fonction facile à deviner avec les boutons de mon formulaire mais qui feront l'objet d'autres sujets car trop éloignés de l’intitulé actuel...

Les résultats de la liste box seront en fait les lignes filtrés moins les champs des colonnes E, F et J mais en revanche avec les champs de la colonne A, pourtant pas utilisé dans la fonction de recherche.

Voici ce que j'ai pu pondre pour la recherche en fouinant sur le net et qui fonctionne partiellement mais pas pour la recherche par "Matricule", par "clef" ou par "Date"...rien pour le renvoie dans la listbox, je vois pas :

Code:
Public Const COL_NOM = 2
Public Const COL_PRENOM = 3
Public Const COL_MATRICULE = 4
Public Const COL_NUMCLE = 7
Public Const COL_ETATCLE = 8
Public Const COL_DATEMOD = 9

'Fonction de recherche
Public Function Rechercher(Nom As String, Prenom As String, Clef As String, Matricule As String, DateMod As String, Etat As String)
Nom = UCase(Nom)
Prenom = UCase(Prenom)
Matricule = UCase(Matricule)
Etat = UCase(Etat)

Set w = Worksheets("BASE")

    Application.ScreenUpdating = False
    
    AutoFilterMode = False
    
    If Nom <> "" Then
        w.Range("A1").AutoFilter field:=COL_NOM, Criteria1:="*" & Nom & "*"
    End If
    
    If Prenom <> "" Then
        w.Range("A1").AutoFilter field:=COL_PRENOM, Criteria1:="*" & Prenom & "*"
    End If
    
    If Matricule <> "" Then
        w.Range("A1").AutoFilter field:=COL_MATRICULE, Criteria1:="*" & Matricule & "*"
    End If
    
    If Clef <> "" Then
        w.Range("A1").AutoFilter field:=COL_NUMCLE, Criteria1:="*" & Clef & "*"
    End If
    
    If DateMod <> "" Then
        w.Range("A1").AutoFilter field:=COL_DATEMOD, Criteria1:="*" & DateMod & "*"
    End If
    
    If Etat <> "" Then
        w.Range("A1").AutoFilter field:=COL_ETATCLE, Criteria1:=Etat
    End If
    
Application.ScreenUpdating = True
UserFormChoix.Show
End Function

Je dois avoué que je ne comprend pas trop pourquoi, d'autant qu'un premier essai s'était montré plutôt concluant sur la recherche de clef mais impossible de le faire fonctionner ce tableau !

Un peu compliqué à expliquer mais si quelqu'un voit une solution....
 

Pièces jointes

  • Sans titre.JPG
    Sans titre.JPG
    24.2 KB · Affichages: 160
  • Sans titre.JPG
    Sans titre.JPG
    24.2 KB · Affichages: 158
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : Fonction de recherche par filtres avec renvoie des lignes filtrées dans listbox.

Bonjour,

petite remarque au passage, une fonction est généralement utilisée pour retourner un résultat, en l'état vois pas trop comment tout ca va fonctionner...

bon après midi
@+
 

SneakyZEKE

XLDnaute Nouveau
Re : Fonction de recherche par filtres avec renvoie des lignes filtrées dans listbox.

Bonjour,

petite remarque au passage, une fonction est généralement utilisée pour retourner un résultat, en l'état vois pas trop comment tout ca va fonctionner...

bon après midi
@+


Sauf oubli de ma part, j'ai :

Code:
Private Sub Rechercher_Click()
    UserFormRechercher.Show
End Sub
Dans ma feuille BASE;

Code:
Private Sub CommandButtonRechercher_Click()
    Rechercher TextBoxNom.Text, TextBoxPrenom.Text, TextBoxMatricule.Text, TextBoxClef.Text, TextBoxDate.Text, ComboBoxEtat.Text
    Unload Me
End Sub
Dans mon UserFormRechercher, et la partie précédemment citée se trouve dans un module dit "ModuleCommun"...

Et je dois reconnaitre que la fonction rechercher est très proche de fonctionner puisqu'elle fonctionne pour la recherche par Nom, Prénom et Etat....il reste donc la recherche par Matricule, Clef et Date comme je l'expliquai plus haut...

Après j'ai peut-être oublié un bout de code car je commence à avoir pas mal de code et cette fonction recherche est la fonction la plus importante, celle dont dépendent les autres...enfin bref, j'ai trouvé cette fonction sur le web, j'ai tenté de l'adapté à mon problème et je ne comprends pas pourquoi elle ne fonctionne qu'à moitié.
 
Dernière édition:

SneakyZEKE

XLDnaute Nouveau
Re : Fonction de recherche par filtres avec renvoie des lignes filtrées dans listbox.

Voici le bout de code qui me sert pour la recherche, vous pouvez tester si vous les souhaitez mais chez moi ça filtre bien pour Nom, Prénom et Etat...c'est le reste qui me pose problème...

Personne n'a d'idée sur la question ?:confused:
 

Pièces jointes

  • Projet.zip
    36.6 KB · Affichages: 123
  • Projet.zip
    36.6 KB · Affichages: 127
  • Projet.zip
    36.6 KB · Affichages: 122

Dranreb

XLDnaute Barbatruc
Re : Fonction de recherche par filtres avec renvoie des lignes filtrées dans listbox.

Bonjour.
j'ai repéré un problème d'ordre des paramètres dans votre programmation:
Code:
Public Function Rechercher(Nom As String, Prenom As String, Clef As String, Matricule As String, DateMod As String, Etat As String)
Code:
Rechercher TextBoxNom.Text, TextBoxPrenom.Text, TextBoxMatricule.Text, TextBoxClef.Text, TextBoxDate.Text, ComboBoxEtat.Text
Clef et Matricule sont intervertis. Date est à la bonne place et disfonctionne sans doute pour une autre raison de représentation interne. CvDate résoudrait peut être le problème.
Cordialement.
 
Dernière édition:

SneakyZEKE

XLDnaute Nouveau
Re : Fonction de recherche par filtres avec renvoie des lignes filtrées dans listbox.

Effectivement je suis pas doué ! Merci beaucoup Dranreb ! Vous pouvez me tutoyer, ça ne pause aucun problème ;)

Ca fonctionne de nouveau pour Clef et Matricule...par contre pour CVDate je vois pas trop, en cherchant un peu j'ai cru comprendre que ça permettait de retourner un format de date voulu mais ça reste un peu obscure pour moi.

Je continu à chercher ce qui ne fonctionne pas à moins que quelqu'un voit d'où vient le problème...
 

SneakyZEKE

XLDnaute Nouveau
Re : Fonction de recherche par filtres avec renvoie des lignes filtrées dans listbox.

C'est bon, c'est tout bête le coup du CvDate :

Code:
If DateMod <> "" Then
        w.Range("A1").AutoFilter field:=COL_DATEMOD, Criteria1:=CVDate(DateMod)
    End If

...reste le renvoi des résultats dans la listbox et la gestion de la sélection dans la listbox...là je pars de zéro, j'ai bien vu du code avec Add.Item mais j'ai même pas eu l'ombre d'un résultat dans ma listbox donc je fais une nouvelle fois appel à vos lanternes éclairées :)
 

Dranreb

XLDnaute Barbatruc
Re : Fonction de recherche par filtres avec renvoie des lignes filtrées dans listbox.

Bonjour SneakyZEKE.
AddItem Permet en effet d'ajouter une ligne dans un Listbox, mais ne la renseigne pas pour autant.
C'est la propriété List qui est une image de son tableau et qui peut être renseigné.
À+
 

SneakyZEKE

XLDnaute Nouveau
Re : Fonction de recherche par filtres avec renvoie des lignes filtrées dans listbox.

J'ai tâché de me renseigner sur l'utilisation des ListBox mais je butte toujours sur le fait de renvoyer uniquement les données filtrées par la fonction de recherche, dans la ListeBox...est-ce possible ou je m'arrache les cheveux pour rien ?
 

Dranreb

XLDnaute Barbatruc
Re : Fonction de recherche par filtres avec renvoie des lignes filtrées dans listbox.

Bonjour.
J'étais absent hier, c'est pourquoi je ne vous répond qu'aujourd'hui.

Le début de code suivant devrait convenir :
VB:
Dim Zone As Range, Ligne As Range
For Each Zone In Feuil1.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Areas
   For Each Ligne In Zone.Rows
      ListeBox.AddItem
      Listebox.List(...
À tester
 

SneakyZEKE

XLDnaute Nouveau
Re : Fonction de recherche par filtres avec renvoie des lignes filtrées dans listbox.

J'avance doucement, j'arrive à afficher ce que je souhaite dans ma listbox la plupart du temps avec ce code :

Code:
Private Sub UserForm_Initialize()
Dim i As Integer
Dim j As Integer
Dim c As Object

    Sheets("BASE").Activate
    'Définit le nombre de colonnes dans la ListBox
    ListBoxfiltre.ColumnCount = 9
    'Définit la largeur des colonnes d'une ListBox:
    'Par défaut, la largeur des colonnes est de 72 points
    '(72 points = 1 pouce)
    ListBoxfiltre.ColumnWidths = "30;110;85;55;37;98;55;25;70"
    'Il est aussi possible de définir la dimension des colonnes en centimètres
    'ListBox1.ColumnWidths = "2 cm; 1,5 cm ......"
    i = 0
    j = 0
    For Each c In Range("A3", [I1000].End(xlUp)).SpecialCells(xlCellTypeVisible)
        If j < 9 Then
            Me.ListBoxfiltre.AddItem
            Me.ListBoxfiltre.List(i, j) = c.Value ' 1ere colonne
            j = j + 1
        ElseIf j = 9 Then
            i = i + 1
            j = 0
            Me.ListBoxfiltre.AddItem
            Me.ListBoxfiltre.List(i, j) = c.Value ' 1ere colonne
            j = j + 1
            End If
    Next c
End Sub


Problème, si ma fonction de recherche par filtre fonctionne très bien, le renvoi des lignes filtrées dans la listbox est aléatoire !
Si un espace est détecté entre deux chaines d'une même cellule, c'est la ligne (A2:I2) précédent le tableau source (A3:I1000) que j'ai choisi qui est affichée :/

Je vois pas comment forcer la variable c à prendre l'intégralité du contenu des cellules, espaces compris, avant les recopier dans la listbox, sachant que cette variable ne peut-être que Object ou Variant !

Je ne suis pas sûr que le problème vienne de là non plus car je ne comprends pas pourquoi c'est la ligne précédent mon tableau qui est renvoyé dans ces cas là !

Autre bizarrerie, l'espace ne pose pas problème si je fais une recherche par prénom avec "Jean"....comme il y en a plusieurs on trouvera quand même "Jean Francois" dans la listbox, malgré l'espace !

La seule piste que j'ai c'est de "passé une collection à la propriété datasource de ma listbox"....j'ai lu ça quelque part mais je comprends pas en quoi ça consiste !
 
Dernière édition:

SneakyZEKE

XLDnaute Nouveau
Re : Fonction de recherche par filtres avec renvoie des lignes filtrées dans listbox.

Rectification...il arrive que les résultats d'une recherche par prénom ne soit pas renvoyés non plus dans la listbox malgré qu'il y est plusieurs résultat sans espace !!! Je ne comprends définitivement pas ce qui cloche dans cette listbox qui un coup fonctionne, puis celui d'après ne fonctionne plus !
 

Dranreb

XLDnaute Barbatruc
Re : Fonction de recherche par filtres avec renvoie des lignes filtrées dans listbox.

Bonjour,
Je ne sais pas si ça recouvre le problème dont vous parlez, auquel je n'ai rien compris, mais :
1: Vous bouclez sur des cellules (In Range) et non sur des lignes (In Range.Rows)
2: Vous ne tenez pas compte du découpage en zones de la plage filtrée, et j'ignore s'il saute de lu imême de chaque zone à la suivante ou s'il ne traite que la première lorsqu'on tente de parcourir directement toutes les lignes de l'ensemble.
Déroulez en pas à pas, avec un espion sur c.Row.
À+
 

Dranreb

XLDnaute Barbatruc
Re : Fonction de recherche par filtres avec renvoie des lignes filtrées dans listbox.

Qu'est ce qui vous dépasse ?
Je détaille.

1: Vous bouclez sur des cellules (In Range) et non sur des lignes (In Range.Rows)
Vous n'avez pas suivi mon modèle: contrairement à ma boucle la plus interne, la votre boucle sur toutes les cellules de la plage filtrée, chaque colonne de chaque ligne. Ajouter .Rows derrière pour ne boucler que sur les lignes.

2: Vous ne tenez pas compte du découpage en zones de la plage filtrée...
Là encore vous n'avez pas suivi mon modèle et j'ignore si ça peut marcher comme ça.
La partie visible d'une liste filtrée consiste en morceaux disjoints comme une selection multiple ou un résultat d'union, donc en sous plages de sa collection Areas.

Déroulez en pas à pas, avec un espion sur c.Row.
Il y a les commande VBA pour ça. Mettez un point d'arrêt sur la première instruction où vous voulez que l'exécution s'arrête, utilisez la barre d'outils débogage les espions et le déroulement pas à pas, sortant, jusqu'au curseur etc.
 
Dernière édition:

Discussions similaires