Formulaire de recherche multicritères

bonjours a tous ,

je cherche a avoir un onglet de recherche pour mes commandes qui permet selon les critères inscrit dans les textboxs d'afficher tout les commandes correspondante de plus je ne sait pas si cela est possible mais pour les dates j'aimerais qu'on puisse rechercher des commandes entre deux dates choisit .

Merci d'avance pour toute contributions , cordialement Nathan.

Bonjour,

J'ai récemment répondu à un sujet légèrement similaire avec 4 critères de recherche (mais sans date). https://forum.excel-pratique.com/excel/recherche-avancee-avec-plusieurs-textbox-et-une-listbox-multi...

Dans votre cas, il faudrait pas mal adapter je pense. Si c'est possible, pouvez-vous mettre un fichier avec juste le nécessaire : la base visée par la recherche, la support de recherche (un userform avec les textbox si j'ai bien compris), et le support accueillant les résultats (un onglet si j'ai bien compris).

Cdlt,

d'accord je vais regarder cela merci .Vous souhaiter que je fasse un fichier similaire au mien avec seulement les informations qu'il faut pour faire les recherches ?

cdlt.

Oui, c'est ça. Un fichier avec la base (si possible sous forme de tableau structuré, sinon je le créerai). Avec si j'ai bien compris, un onglet de recherche où on restituera les infos après les filtres et les textbox qui serviront à filtrer (au sein d'un userform ou sur cette même feuille). Et l'idéal serait que les textbox portent des noms identiques ou correspondant aux noms des colonnes relatives. Donc il faudrait des noms de colonnes simples et sans espaces.

ex : COL1 (la colonne de la base) - Txt_COL1 (la textbox correspondante)

Cdlt,

Re,

alors c'est bon normalement j'ai organisé mon onglet rechercher j'espère qu'il va vous convenir j'ai renommer toute les textboxs au nom des colonnes quand a la base de données c'est dans la feuille 'bdd1" ou je souhaite afficher toute les informations des commandes sauf les "notes" qui elles appartiennent a l'onglet commandes

Re,

Honnêtement, c'est compliqué pour moi de vous renvoyer le fichier, les userforms ne sont pas vraiment ma tasse de thé et il y a trop de modifications à faire...

Je vous propose un code à placer dans un module normal :

Sub test()

Dim ctrl As Control, tfiltre()

With Sheets("bdd1").Range("BDD")
    t = .Resize(, .Columns.Count - 1)
    ReDim tfiltre(1 To UBound(t, 2), 1 To UBound(t))
    For i = LBound(t) To UBound(t)
        retenir = True
        For Each ctrl In SuiviCommande.Controls
            partnom = Split(ctrl.Name, "_")
            If UBound(partnom) > 1 Then
                If (partnom(0) = "txt" Or partnom(0) = "cbx") And partnom(1) = "Rech" Then
                    verif = False
                    col = Application.Match(partnom(2), .Rows(0), 0)
                    If CStr(t(i, col)) Like "*" & ctrl.Value & "*" Then verif = True
                    retenir = retenir And verif
                End If
            End If
        Next ctrl
        If retenir Then
            n = n + 1
            For j = LBound(t, 2) To UBound(t, 2)
                tfiltre(j, n) = t(i, j)
            Next j
        End If
    Next i
End With

With SuiviCommande.LBxRecherche
    .Clear
    If n > 0 Then
        .ColumnCount = UBound(t, 2)
        ReDim Preserve tfiltre(1 To UBound(t, 2), 1 To n)
        If n = 1 Then
            .Column = tfiltre
        Else
            .List = Application.Transpose(tfiltre)
        End If
    End If
End With

End Sub

Il faut :
- mettre le tableau de "bdd1" sous forme de tableau structuré et le nommer "BDD",
- renommer les colonnes et les contrôles correspondants ainsi (en tout cas, sur ce modèle) (type[repris dans le code]_Rech_nomdecolonne) :

Designationtxt_Rech_Designation
Destinatairetxt_Rech_Destinataire
Sitetxt_Rech_Site
Fournisseurtxt_Rech_Fournisseur
Etatcbx_Rech_Etat
Servicecbx_Rech_Service
NumDAtxt_Rech_NumDA
DateDAtxt_Rech_DateDA
DateValidationtxt_Rech_DateValidation
NumBCtxt_Rech_NumBC
DateBCtxt_Rech_DateBC
dateCommandetxt_Rech_dateCommande
DateLivraisontxt_Rech_DateLivraison

- placer ensuite, pour chaque contrôle, au sein de la macro évènementielle Change() (ou beforeupdate() pour les combo) la simple instruction Call test.

On verra éventuellement ce qu'on peut faire pour les dates car je ne sais pas vraiment comment arbitrer.

Cdlt,

Salut 3GB,

ta solution semble intéressante mais j'ai un soucis avec les tableaux qui me cause un problème pour l'ajout , suppression de commande enfaite quand je sélectionne la première ligne vide ca sélectionne enfaite la première ligne en dehors du tableau et donc je pense que si je ne peux pas faire de tableau je ne peux malheureusement pas appliqué ta solution

clmt Nathan

Salut Nathan,

J'ai pas très bien compris mais si tu parles de la façon de trouver la dernière ligne ou première non vide :

dl = range("tableau").rows.count 'dernière
nvl = range("tableau").rows.count + 1

tout simplement. MAIS IL NE FAUT PAS AVOIR DE LIGNES VIDES, le tableau se restructure automatiquement.

Cdlt,

Re ,

alors j'ai essayer ta solution mais malheureusement je n'arrive pas a l' adapter sinon j'ai trouver ce post :

Recherche multicritères USERFORM (excel-pratique.com)

qui ressemble beaucoup a ce que je faire donc je ne sais pas si quelqu'un est en mesure de me l'adapter

clmt Nathan

Comme je t'ai dit, essayer de trouver un code pour mettre au point la recherche ne me pose pas de problème (et je pense d'ailleurs que le code fourni n'est pas loin de produire le résultat escompté). Mais je ne veux passer un temps fou à adapter un fichier.

Si tu as vraiment envie d'y arriver, tu n'as qu'à créer le tableau structuré (sans ligne vide), renommer les colonnes comme sur mon précédent commentaire (enfin sur ce modèle en évitant les espaces) et renommer les textbox comme sur mon précédent commentaire.

Ensuite, il ne te restera plus qu'à mettre call test dans les macros change des textbox pour faire tes essais.

Sinon, vu qu'il y a une solution toute faite, c'est à toi de l'adapter, à moins gmb passe par là...

Cdlt,

Oui je comprend tout a fait que adapter un fichier prend du temps et je ne t'en veut pas que tu n'ai pas le temps pour le faire je vais donc essayer de faire comme tu ma dit mais je ne sais pas si je vais y arriver

Re alors j'ai placer le code dans un module j'ai créer un tableau et j'ai renommer les colonnes et les textbox et combo tu pourrais m'expliquer ce que je doit faire après , je ne comprend pas cette histoire de call test

Si tout est bien renommé, on peut commencer les essais.

Si tu cliques sur le module de l'userform SuiviCommande, puis que tu double-cliques sur une textbox, normalement, tu es renvoyé vers le code avec par défaut la macro private sub txt_..._change(). Il suffit d'y mettre Call test (on appelle la macro test à chaque changement sur la textbox).

Il faut faire de même avec toutes les textbox qui serviront à la recherche.

Mais au début, il vaut mieux le faire avec une seule pour voir si le code est fonctionnel. Puis on généralisera car il n'est pas impossible qu'il y ait des blocages au niveau de certains noms.

salut alors j'ai essayer pour la première textbox et j'obtiens une erreur au niveau de cette ligne

If CStr(t(i, col)) Like "*" & ctrl.Value & "*" Then verif = True

Re,

Alors, La colonne Designation était mal nommée d'où l'erreur. J'ai ensuite rencontré une erreur car la colonne Notes n'était pas incorporée au tableau.

Après essai, ça fonctionne. Ce n'est toujours pas parfait mais on a déjà la base :

Cdlt,

Merci ! pour l'instant ca a l'air de très bien fonctionné tu a une idée pour le bouton remise a zéro (RAZ) je pensais vider toute les textboxs et combo avec un truc du genre "txt_rech_fournisseur.value="" " mais il a peut être un moyen plus simple non ?

Tu vois ça marche ! même s'il y a des petites améliorations à faire...

Alors, désolé mais je n'ai pas fait attention aux autres codes.

Ici, l'avantage, c'est que les contrôles ont tous un dénominateur commun type_Rech_nom. Donc, on peut faire quelque chose comme :

'MODULE NORMAL
Sub remettreAZ()

dim ctrl as control

for each ctrl in SuiviCommande.controls
    if ctrl.name like "*_Rech_*" then
        ctrl.value = ""
    end if
next ctrl

'SuiviCommande.LBRecherche.clear 'éventuellement ? (doute sur le nom ressorti de tête)

end sub

'DANS LA MACRO btn_raz
private sub btn_raz_click() 'adapter nom !!!
call remettreAZ
end sub

Il faut adapter les noms bien entendu.

Un grand merci a toi pour ta patience et de m'avoir aider il me reste des améliorations et peut être revoir un truc pour les dates mais je referais un post dédié si besoin merci encore pour ta grande aide

clmt Nathan

Je t'en prie ! Merci pour ta compréhension. Et si je vois ton post sur les dates, j'essaierais d'y répondre.

A plus,

Rechercher des sujets similaires à "formulaire recherche multicriteres"