Afficher résultat filtre élaboré dans listbox

Bonjour,

J'ai créé un UserForm avec ComBox et TextBox. Lorsque je clique sur le bouton "Recherche", cela devrait lancer un filtre élaboré nommé "FiltreData" et afficher le résultat dans la ListBox mais cela ne fonctionne pas! Je suis débutant donc je tatônne!

Quelqu'un pourrait-il m'éclairer sur ce problème? Je joins le fichier concerné!

Merci.

Bonjour Dark Gandolf,

Peux-tu expliquer à quoi est censé servir ton filtre? Je ne comprend pas la formule que tu as tapé dans ton module, qui contient effectivement des erreurs, notamment:

CopyToRange:=Range("K1:1722")

où il manque un K

Conseils:

  • La gestion des erreurs, tu laisses de côté, ça t'empêche de voir les vrais problèmes.
  • Le module doit être nommé de manière logique: Module2 => ModuleFiltres (par exemple)
  • Si ton module travaille sur une feuille spécifique, précise la feuille de travail
Range("A1:E8291")

Excel ne pensera pas à ta place à utiliser la feuille 1. Donc actuellement si tu es sur la feuille2 au moment où ta fonction FiltreData est appelée, Excel va utiliser cette feuille.

-

Call FiltreData

=>

Call ModuleFiltres.FiltreData

Excel ne peut pas 'deviner' qu'il doit utiliser le module que tu as créé

Bonjour, et merci pour ta réponse.

J'ai trouvé cette façon de faire sur internet mais je pense qu'il y a plus simple pour quelqu'un qui connaît bien VBA.

Dans mon UserForm je souhaite juste sélectionné sur quoi est basé ma recherche, exemple "Famille" et taper dans TextBox le n° de "Famille" que je recherche afin que toutes lignes où appairait ma demande s'affiche dans la ListBox (les 5 colonnes). Par exemple, si tu prends les 4 premières lignes du tableau, la famille "21463" apparait sur 4 lignes! J'aimerai que ces 4 lignes apparaissent dans la ListBox. Mais certaines familles peuvent apparaitre sur beaucoup plus de lignes!!

Penses-tu qu'il y ait plus simple que ce que j'ai fais?

Merci.

Bonsoir,

J'ai nommé tes plages, c'est plus confortable, et ça permet de se passer des feuilles...

Les noms sont (base et plage filtrée) sont dynamiques, ils s'adapteront aux extensions.

Il faut toujours penser à supprimer le filtrage précédent avant d'en faire un nouveau... !

Sub FiltreData()
    [PlgFltr].Offset(1).ClearContents
    [Base].AdvancedFilter xlFilterCopy, [Crit], [PlgFltr]
End Sub

Pour ta ListBox, j'ai eu quelques doutes sur tes intentions. J'ai fini par opter par une multicolonnes, et j'ai donc complété la construction pour l'élargir un peu de façon qu'elle accueille tes datas en largeur. J'ai aussi réduit un peu la hauteur, ça surtout parce que plus haute que mon écran, cela ne facilite pas le travail, et de toute façon elle n'aurait pas été assez haute pour en pas avoir besoin de scrollbar avec certains filtrages...

Private Sub CommandButton1_Click()
    Dim PlgF, i%
    If ComboBox1.ListIndex > -1 And TextBox1.Value <> "" Then
        With [Crit]
            .Cells(1, 1) = ComboBox1.Value
            .Cells(2, 1) = TextBox1.Value
        End With
        FiltreData
        With [PlgFltr]
            If .Rows.Count > 1 Then
                PlgF = .Offset(1).Resize(.Rows.Count - 1).Value
            Else
                MsgBox "Aucune correspondance trouvée.", vbInformation, "FiltreData"
            End If
        End With
        With ListBox1
            If UBound(PlgF) > 1 Then
                .List = PlgF
            Else
                .AddItem PlgF(1, 1)
                For i = 1 To 4
                    .List(0, i) = PlgF(1, i + 1)
                Next i
            End If
        End With
    Else
        MsgBox "Définir les critères de filtrage !", vbExclamation, "FiltreData"
    End If
End Sub

Pour ta procédure de recherche, il convenait d'abord de tester si l'utilisateur avait bien défini les critères de recherche avant de poursuivre...

Puis tester si le filtrage avait été productif, ce qu'on pouvait faire directement sans passer par l'utilisation d'une gestion d'erreur.

Le transfert du résultat du filtrage sur un tableau facilite l'opération. Les noms de plage incluent les en-têtes (en raison de leur utilisation pour le filtre avancé, et cela permet d'ailleurs que la plage filtrée soit toujours définie même si aucun élément filtré), en passant par un tableau on rajuste pour éliminer les en-têtes.

RowSource n'était pas le meilleur choix pour l'affectation à la ListBox : plage mouvante et sur laquelle tu seras peut-être susceptible d'intervenir, ce qui aurait pose des problèmes avec RowSource, qui lie la plage à la liste...

Ayant le résultat en tableau on l'affecte avec List (ce qui t'évite d'ailleurs de recalculer l'adresse de la plage, ce que tu n'avais pas fait encore ), en dissociant le cas où un seul élément est filtré, pour lequel List n'est pas utilisable.

Vois déjà si le résultat va dans le sens de ce que tu voulais. Il me semble que ta TextBox ne sera pas très facile d'emploi... Pour ma part j'opterais volontiers sur une ComboBox, ce qui oblige d'une part à avoir des listes d'éléments uniques des colonnes de ta base (ce serait à faire sur une autre feuille pour éviter d'encombrer plus la feuille de ta Base), à faire par filtrage avancé (et à tenir à jour), et d'autre part alimenter cette Combo à partir du choix de la Combo1.

A toi d'y réfléchir, mais cela te faciliterait les choix.

Un petit problème potentiel réside dans ta Base où les colonnes (les 4 premières) contiennent des valeurs texte composées uniquement de chiffres, et les formats de cellule sont en format nombre. Une fausse manoeuvre pourrait facilement dans ces conditions entraîner la conversion de ces valeurs en nombre, qui fausserait toute ton application. Tu as utilement mis ta zone de critère en format Texte. Je ne suis pas habituellement partisan du format Texte, mais je crois que dans ton cas, placer ces 4 colonnes de la base en format Texte serait une sécurité.

Bonne continuation.

Cordialement.

Je vais essayer de comprendre tout ça et de l'appliquer (ça va pas être facile!! ). Je suis un débutant!!

Merci beaucoup pour le temps que tu as consacré à mon problème!

Le fichier n'était pas passé ! Il m'a fallu un peu de temps pour le voir, c'est réparé.

Les explications seront plus claires avec le fichier !

Cordialement.

Ha oui c'est mieux!!

Nickel, ça suffit à faire mon bonheur!!

Je voudrai pas être chiant mais comment pourrai-je intégrer un bouton pour réinitialiser le UserForm sans le fermer pour faire une autre recherche??

Tu vas peut-être pensé que j'abuse mais est-il possible d'afficher l'entête des colonnes dans le résultat de la recherche??

Merci encore!

Pour réinitialiser :

Private Sub CommandButton2_Click()
    ComboBox1.ListIndex = -1
    TextBox1.Value = ""
    ListBox1.Clear
End Sub

Pour avoir les intitulés de colonnes, je pense que tu devrais placer des étiquettes au-dessus de ta ListBox, ce era moins contraignant pour la suite (à moins que tu te contentes de contempler le résultat et que tu n'aies pas à manipuler le contenu de la ListBox...)

Cordialement.

En effet, mettre des étiquettes sera plus simple !

Merci pour ton aide et tous ces conseils précieux !

Passe une bonne journée !

Bonjour MFerrand, tout fonctionne bien sauf lorsque je fais une recherche sur quelque chose qui n'existe pas!

Une fenêtre de débogage apparaît à ce moment là! Que dois-je ajouter pour éviter cela et afficher un message du type "Référence inexistante"?

Merci!

C'est de ma faute, j'ai oublié une ligne !

            Else
                MsgBox "Aucune correspondance trouvée.", vbInformation, "FiltreData"
                Exit Sub
            End If

Tu rajoutes le Exit Sub et le problème est réglé.

Cordialement.

Nickel, ça fonctionne, t'es un crack!!

Encore merci pour le temps que tu as consacré à mon problème!!

Bonne soirée.

Bonsoir MFerrand,

Je reviens vers toi car je sais que tu sauras répondre à ma question!

J'ai suivi tes conseils et obtenue exactement ce que je voulais, mais j'aimerai aller encore plus loin avec mon Userform!

Lorsque je lance une recherche dans celui-ci, j'obtiens un résultat (1 ou plusieurs lignes)! Est-il possible de cliquer sur une de ces lignes et d'ouvrir un fichier le fichier PDF correspondant! La recherche se ferait sur le chiffre qui est dans la colonne "Repère" car les fichiers sont nommés avec ce chiffre. Tous les fichiers PDF sont dans un même dossier que je nomme "Matériel".

Je joins mon fichier!!

Merci d'avance pour ta réponse!!

Tu es sûr que le nom du fichier correspond à la mention dans Repères ?

J'y vois beaucoup de 000000 : ça désignerait un fichier : 000000.pdf ?

Et quel est le chemin du dossier Matériel ?

Oui, désolé, ça correspond à la colonne "Plan", pas "Repère".

Pour le chemin d'accès au dossier ce sera D:/Caténaire VCH/Plans.

D:/Caténaire VCH/Plans/Matériels

Désolé j'avais oublié le dernier dossier du chemin.

Essaie ceci :

Private Sub ListBox1_Click()
    Dim chfich$, i%
    i = ListBox1.ListIndex
    If i > -1 Then
        chfich = ListBox1.List(i, 2) & ".pdf"
        chfich = "D:\Caténaire VCH\Plans\Matériels\" & chfich
        Shell "explorer.exe " & chfich
    End If
End Sub

Cordialement.

Ca fonctionne!!

T'es au top!!!

Je te remercie pour ton aide.

Passe une bonne journée!

Rechercher des sujets similaires à "afficher resultat filtre elabore listbox"