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: 161
  • Sans titre.JPG
    Sans titre.JPG
    24.2 KB · Affichages: 158
Dernière édition:

Dranreb

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

Bonjour.
Je viens de comprendre que c'était plus où moins votre intention d'explorer chaque cellule. Je ne l'avais pas vu tant il m'était évident qu'il fallait QUAND MÊME boucler d'abord sur les .Rows pour la création des lignes dans la ListBox et, à l'intérieur seulement, s'occuper des colonnes dans une autre boucle pour les renseigner.
Par ailleurs avez vous toujours autant de problèmes si vous explorez la collection .Areas de la plage, au lieu d'explorer la plage ?
À+
 

SneakyZEKE

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

Avec l'aide de Dranreb, on arrive presque au résultat voulu :

Code:
Dim Z As Range, R As Range, i As Long, j As Long

ListBoxfiltre.Clear
For Each Z In Range("A3", [I1000].End(xlUp)).SpecialCells(xlCellTypeVisible).Areas
   For Each R In Z.Rows
      i = Me.ListBoxfiltre.ListCount
      Me.ListBoxfiltre.AddItem
      For j = 1 To 9
         Me.ListBoxfiltre.List(i, j - 1) = R.Columns(j).Value
         Next j
      Next R
   Next Z

Mais pour une raison que j'ignore, certaines recherches ne fonctionnent pas :/

Par exemple si je recherche "Malika" dans le champ "Prénom", ça me renvoi la ligne A2 °_°'

Enfin globalement il y a du mieux mais je comprends pas ce qui me fait ça. Peut-être le nom de famille composé.

Si je recherche l'Etat "S", même problème !
 

Dranreb

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

J'ai eu beaucoup de problèmes pour arriver à faire tourner votre production.
Des problèmes de références manquantes obligé de décocher dans Références... notamment.
Mais à force de patience, j'ai fini par trouver ce qui coince: vous utilisez End(XlUp) sur la colonne I qui n'est pas partout renseignée. Il semblerait, ce qui est une surprise pour moi, qu'il n'examine que les lignes filtrées de sorte qu'il arrive en ligne 2 en partant du bas, 1 ligne d'encore moins, en somme, qu'une plage complètement vide !
Utilisez donc plutôt la plage effectivement couverte par le filtre automatique :
VB:
For Each Z In Feuil3.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Areas
Celà ira bien mieux !

Par ailleurs une critique risque de vous être faite si vous devez présenter cela:
Pourquoi est on obligé de taper ce qu'on veux selectionner dans des champs alors que le filtre automatique naturel permet de les sélectionner dans des listes. Où est le gain de convivialité ?

À+
 
Dernière édition:

SneakyZEKE

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

Bon j'arrive au moment où toute les fonctions que je souhaitai intégrer à mon projet son réalisées, ne reste plus qu'à terminer cette utilisation du tableau par Listbox et Formulaires...

Pour ce qui est de l'affichage dans la Listbox, grâce à Dranreb j'ai quelque chose de très satisfaisant si ce n'est le fameux ColumnHeads qui ne fonctionne que si l'on utilise un RowSource, chose qui me parait compliqué dans mon cas !

Ma question est donc...comme de toutes manières la ligne qui devrait-être renvoyée comme head si j'utilisai le RowSource, est renvoyée sans que l'on sache pourquoi comme première ligne dans la Listbox...n'y aurait il pas moyen de mettre en valeur d'une façon ou d'une autre la première ligne de la Listbox et la rendre non sélectionnable ? Ou mieux, quelqu'un saurai comment faire en sorte qu'elle ne s'affiche pas comme ça devrait-être le cas ?

Dans cette deuxième hypothèse j'utiliserai des Label dans la boite de dialogue en guise de Head !

Une idée ?

PS: Je ne suis pas mécontent de voir que le webmaster permet maintenant un hébergement acceptable des pièces jointes:D
 

Pièces jointes

  • Projet.zip
    254.8 KB · Affichages: 86
  • Projet.zip
    254.8 KB · Affichages: 84
  • Projet.zip
    254.8 KB · Affichages: 89
Dernière édition:

Dranreb

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

Bonjour.
Je n'arrive pas à dézipper votre dossier: il me parle d'une methode de compression inconnue.

Essayez peut être:
VB:
With Feuil3.AutoFilter.Range: Set PlageFiltrée = .Rows(2).Resize(.Rows.Count - 1): End With
For Each Z In PlageFiltrée.SpecialCells(xlCellTypeVisible).Areas ' etc.
À+
 

SneakyZEKE

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

Ah c'est zippé avec 7zip pour atteindre des taux de compression important tout en gardant le format zip accepté par le forum...le dézippeur Windows est surement un peu juste pour ce genre de compression si c'est celui utilisé ?

Je peux vous conseiller 7zip portable si vous ne désirez pas installer cet archiveur sur votre ordinateur :
7-Zip Portable | PortableApps.com - Portable software for USB, portable and cloud drives

J'essaye de suite votre solution Dranreb...une nouvelle fois merci !
 

SneakyZEKE

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

Comme je disais, une nouvelle fois, merci Dranreb !

Un petit plantage dû au fait que je n'avais pas définie PlageFiltrée...puis nouvelle essai avec PlageFiltrée en Variant et nickel !
Plus d'entête qui apparait comme une donnée normale...je n'ai plus qu'à mettre mes Label et la partie affichage sera terminée.

Ensuite je vais essayer de pondre un truc pour la sélection. J'ai réussi à adapter un bout de code qui permet l'utilisation du scroll via la roulette (bien pratique tout de même !), par contre j'ai eu quelques difficultés en tentant rapidement de faire un mix entre "MultiSelectMulti" et dans la façon de sélection les ligne voulues. Le problème du "MultiSelectExtended" est qu'il ne permet pas d'avoir plusieurs zone de sélections étendues...moi je souhaiterai par exemple permettre de sélectionner une ligne au début de la Listbox, puis 5 avec la méthode "MultiSelectExtended", puis deux en fin de Listbox...là ce n'est pas possible !

Je vais me renseigner sur le sujet, à moins que quelqu'un connait le sujet et apporte une réponse avant moi !
 

Dranreb

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

Bien que ce soient des types de données au même titre que les premiers, ce ne sont pas en même temps des mots clés du language mais assimilable à des types définis par l'utilisateur.
Quoi bleu et noir... beurk... Chez moi le fond est bleu foncé, les mots clés magenta, mes identifiants verts, les commentaires cyan et le peu qui reste jaune, tout ça en police Consolas (format de l'éditeur)
 

SneakyZEKE

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

Bien que ce soient des types de données au même titre que les premiers, ce ne sont pas en même temps des mots clés du language mais assimilable à des types définis par l'utilisateur.
Quoi bleu et noir... beurk... Chez moi le fond est bleu foncé, les mots clés magenta, mes identifiants verts, les commentaires cyan et le peu qui reste jaune, tout ça en police Consolas (format de l'éditeur)
Original ! Chez moi je met des fonds noir partout avec polices verte fluo et rouge...à l'ancienne ! lol Mais je préfère, le fond noir me fatigue moins les yeux que le blanc et le contraste avec la police permet une bonne lisibilité chez moi...certain ne supporte pas ce contraste...chacun ses vilains yeux lol
 

SneakyZEKE

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

Bon j'ai manifestement eu une crise d'optimisme qui ne me réussi pas ! Je pensai trouver assez rapidement comment mixer le MultiSelectExtended et le MultiSelectMulti de façon à conserver mes zones sélectionnées tout en continuant à en sélectionner de nouvelles pas forcément à suivre (je précise que ça ne fonctionne pas en maintenant "Ctrl" enfoncé durant la sélection comme sous l'explorateur Windows) et idem pour la dé-sélection...échec cuisant malgré un dépassement de bande passante internet très important (Et oui en 2011 il existe encore des lieu où on paye l'internet à la quantité de bande passante consommé et non en illimité ! Pathétique mais véridique !) !

Second échec, j'ai pensé qu'il serai facile de simplement sélectionner dans le tableau Excel, les lignes sélectionnées dans la ListBox pour ensuite appliqué le traitement voulu par l'utilisateur aux lignes sélectionnées (Comme on peut le deviner avec les boutons présents sous la ListBox, les 3 fonctions qui seront applicables aux lignes sélectionnées seront, "Modifier": qui envoie chaque ligne sélectionnée dans un formulaire où chaque cellule de la ligne correspond à une TextBox du formulaire de modification; "Imprimer": qui reprendra la fonction déjà existante sur ma feuille "BASE"; et la fonction "Supprimer": permettra d'effacer le contenu de lignes sans effacer la ligne elle-même !), mais en fin de compte je suis vraiment pas doué, je vois pas comment utiliser ce genre de bout de code à dans mon problème :


Code:
For i= 0 To .ListBCli.ListCount - 1
 
     If .ListBCli.Selected(i) Then ListBCli.SelectItem ListBCli.ListIndex
     EndIf
 
Next i

J'ai grand honte, je suis définitivement pas fait pour la programmation !
 
Dernière édition:

Dranreb

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

Je ne sais pas quoi vous conseiller. J'ai de plus en plus l'impression que vous rajoutez des dispositifs compliqués pour effectuer des choses qui peuvent se faire simplement directement depuis Excel.
Enfin si vous tenez à selectionnez des lignes disjointes une à une dans une liste vous devriez pouvoir faire
Union(Selection, Rows(x)).Select
Bien sur ça vous crée comme selection une plage à plusieurs Areas.
Rien compris à part ça à vos problèmes de Listbox
À+
 

SneakyZEKE

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

Bonjour et désolé pour l'abandon temporaire du sujet, une mononucléose suivie de deux semaines d'évaluations m'ont contraint à choisir mes priorités...

J'ai fais un p'tit screenshot qui à mon avis parle mieux que des long discours, de façon à résumer ce que j'aimerai parvenir à faire.

A gauche c'est l'écran que j'obtiens en résultat d'une recherche...à savoir une ListBox à 9 colonnes reprenant l'essentiel de ce qui se trouve dans mon tableau Excel de ma feuille de BASE.

A droite c'est l'écran que je j'obtiens quand j'ai cliqué sur le bouton "Modifier" de ma ListBox. L'idée serait donc d'obtenir sur le clique de ce bouton "Modifier", autant de formulaires que de lignes sélectionnées dans la ListBox, chaque formulaire reprenant les informations d'une ligne de mon tableau de ma feuille BASE.

En claire, je souhaite à terme que l'utilisateur n'est plus accès directement au tableau, mais qu'il soit contraint de passer par ces formulaires pour modifier le contenu du tableau...

Bref, je vous laisse tester pour ceux chez qui ça fonctionne. Je cherche à ce qu'une ligne sélectionnée dans la ListBox, puisse renvoyer les informations de la ligne qui lui correspond dans le tableau vers un formulaire...les autres petits problèmes sont secondaires !
 

Pièces jointes

  • ListBox vers formulaire.jpg
    ListBox vers formulaire.jpg
    50.7 KB · Affichages: 85
  • SERDIS v1.4.zip
    235.8 KB · Affichages: 84
Dernière édition:

SneakyZEKE

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

Je me suis essayé à tout à hasard à quelque chose d'un peu ambitieux...ça fonctionne pas bien sûr mais il y a peut-être de l'idée ?

Code:
Private Sub UserForm_Initialize()

i = 2
While Feuil3.Cells(i, 1) <> ""
i = i + 1
Wend
i = i - 1

UserFormChoix.choix.ColumnCount = 2
PlageFiltrée.SpecialCells(xlCellTypeVisible).Areas
End Sub

Code:
Private Sub choix_Click()
Dim NumCP As String
Dim Date As String

NumCP = Me.choix.Column(6)
Date = Me.choix.Column(8)

With UserFormModification
       .ComboBox1.Text = Me.choix.Column(0)
       .TextBox1.Text = Me.choix.Column(1)
       .TextBox2.Text = Me.choix.Column(2) 
       .TextBox3.Text = Me.choix.Column(3)
       .ComboBox2.Text = Me.choix.Column(4)
       .ComboBox3.Text = Me.choix.Column(5)
       .TextBox4.Text = Left(NumCP, (InStr(NumCP, "-") - 2))
       .TextBox5.Text = Right(NumCP, (InStrRev(NumCP, "-") - 4))
       .ComboBox4.Text = Me.ListBoxfiltre.Column(7)
       .TextBox6.Text = Left(MDate, 2)
       .TextBox7.Text = Mid(MDate, 4, 2)
       .TextBox8.Text = Right(MDate, 4)
       .TextBox9.Text ='?
End With

UserFormModification.Show

End Sub
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 243
Messages
2 086 541
Membres
103 244
dernier inscrit
lavitzdecreu