Vba macro excel recherche et userform

[Fermé]
Signaler
Messages postés
19
Date d'inscription
mercredi 3 octobre 2007
Statut
Membre
Dernière intervention
18 mars 2008
-
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
-
Bonjour,

Je poursuis mon travail sur un système de suivi assez audacieux (pour ce qui me concerne) et voici un point qui me bloque :

Je cherche à permettre à l'utilisateur d'établir une recherche à un ou plusieurs critères combinés depuis un userform et à en restituer le résultat dans un formulaire (ou un autre userform).

Essayons d'illustrer mes propos...

=> supposons ces 4 critères dans le userform de recherche : Nom - Prénom - Age - Profession
=> l'utilisateur recherche les "Dupont" ayant "35ans" (critères combinés)
=> une fois le bouton "Rechercher" activé, la macro procède à cette recherche dans la feuille contenant les données et
=> ouvre un formulaire (ou un userform peu importe finalement) avec le résultat, c'est à dire la ligne complète des informations correspondantes à la recherche mise en forme dans ce formulaire.

En outre, j'aime semble-t-il me compliquer la vie, il doit être possible d'avoir une échapatoire en cas de réponses multiples (plusieurs Dupont agés de 35 ans...) ; dans ce cas, un formulaire multiple peut-il s'envisager?

Enfin, désolé je suis pénible, peut-on imaginer un système permettant une recherche assistée (par exemple, en recherchant les "Dupont" dont on ignore si la dernière lettre est un "D" ou un "T" on pourrait rechercher les "Dupon%")

Je vous remercie d'ores et déjà de toute votre aide et des pistes qui pourraient m'aider à réaliser ce projet fou.

Chris

17 réponses

Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
bonjour

Tu as effectivement une syntaxe incorrecte.
Si j'ai compris ta modification, je te propose ceci avec décalage des instructions pour bien voir le début et la fin des boucles, des if et autres.
Option Explicit

Public Sub chercher(rech, c) 'recherche d'une chaine
Dim sel As Object
Dim valide As Boolean
Dim i As Integer
Dim l As Long
Dim n As Integer
l = 2: n = 0
SuiviActivite.ListBox1.Clear
With Sheets("BaseDeDonnées")
If rech = "" Then Exit Sub
Do
    Set sel = .Cells.Find(What:=rech, after:=.Cells(l, c), _
        LookIn:=xlValues, LookAt:=xlPart, _
        SearchOrder:=xlByColumns, _
        SearchDirection:=xlNext, MatchCase:=False)
    If sel Is Nothing Then Exit Do
    If sel.Column <> c Then Exit Do
    If sel.Row <= l Then Exit Do
    l = sel.Row
    valide = True
    For Each ctrl In SuiviActivite.Controls
        If TypeOf ctrl Is MSForms.TextBox _
            Or TypeOf ctrl Is MSForms.ComboBox Then
            If ctrl.Value <> "" _
            And InStr(1, LCase(.Cells(l, i).Value), LCase(ctrl.Value)) = 0 Then valide = False
        End If
    Next ctrl
    If valide Then
        SuiviActivite.ListBox1.AddItem _
            (.Cells(l, 1).Value & " " & _
            .Cells(l, 2).Value & " " & _
            .Cells(l, 3).Value & " " & _
            .Cells(l, 4).Value & " " & _
            .Cells(l, 5).Value & " " & _
            .Cells(l, 6).Value & " " & _
            .Cells(l, 7).Value & " " & _
            .Cells(l, 8).Value & " " & _
            .Cells(l, 9).Value & " " & _
            .Cells(l, 10).Value & " " & _
            .Cells(l, 11).Value & " " & _
            .Cells(l, 12).Value & " " & _
            .Cells(l, 13).Value & " " & _
            .Cells(l, 14).Value & " " & _
            .Cells(l, 15).Value & " " & _
            .Cells(l, 16).Value)
        SuiviActivite.ListBox1.List(n, 2) = sel.Row
        n = n + 1
    End If
Loop
End With
End Sub

1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

Bonjour,

Si on maitrise à la fois Excel et le VBA, on peut faire beaucoup de chose.
As-tu déjà créé ton userform et écrit quelques macros?
Un sujet similaire a été traité récemment sur ce même forum. Recherche nikky 74 par nom d'utilisateur forum programmation, et vois si tu peux déjà identifier ton problème de recherche à celui qui y est évoqué. Dans cet exemple il est question de recherche par nom.
Pour la recherche multicritères, ça va dépendre des comparaisons souhaitées: = ;<; >; =<;>=;<>; OR; XOR; AND....; ordre de priorité .....
Cela peut ce compliquer rapidement. Mais rien n'est impossible, il y a toujours une astuce. Tout dépend de ton niveau en VBA et ou tu places la barre de complexité. J'espère ne pas t'avoir découragé.On peut toujours essayer et voir ou ça nous mène. A+
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
bonjour

Un petit exemple pour te faire voir ce que l'on peut faire : https://www.cjoint.com/?cAax7fK2BS

Le fichier n'ai pas bien adapté et pour tester il n'y a que les chiffres à faire varier sur les saisies.

Les doubles sont listés et si on en sélectionne un, on atteint la ligne de "base" correspondante.

Regardes si cela peux t'aider...
Messages postés
19
Date d'inscription
mercredi 3 octobre 2007
Statut
Membre
Dernière intervention
18 mars 2008
8
Bonjour,

En partant de ce premier fichier, des pistes m'intéressent énormément.
J'ai commencé par étudier le comportement du userform, j'aime beaucoup cet affichage instantanné des réponses...

Pour adapter mon besoin à ce fichier, j'ai l'impression qu'il ne faut plus grand chose, à savoir :
- l'ouverture d'un formulaire lorsqu'on valide la recherche (en cliquant par exemple comme c'est prévu ici sur la ligne correspondant)
- la possibilité de ne pas respecter la casse ; je crains qu'à l'usure, mes utilisateurs ne se souviennent plus s'ils ont ou non mis des majuscules à certains endroits...

Pour le reste, je commence dès à présent à travailler l'adaptation de ce fichier et insiste à te remercier très sincèrement du temps, de l'aide et des connaissances que tu m'as apportés.

Chris,

P.S. : je ne suis pas particulièrement novice en VBA, disons que sur une échelle de 1 à 10, je suppose que je me situe au niveau 2... ;-)
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
bonjour

un fichier plus réaliste : https://www.cjoint.com/?cAa3Vj6LPm
Messages postés
253
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
21 décembre 2010
25
Salut Gbinform,

est ce que tu pourrais reposter le fichier???

un GRAND merci si tu prends le temps de le faire...

Olive
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
bonjour

la possibilité de ne pas respecter la casse

Ah bon ! la recherche qui est faite ne s'en préoccupe pas !

Bonne continuation et à bientôt peut-être...
Messages postés
19
Date d'inscription
mercredi 3 octobre 2007
Statut
Membre
Dernière intervention
18 mars 2008
8
Bonjour,

Il semblerait qu'en ne respectant pas la casse sur le fichier joint, la macro de recherche bogue...
Ce qui n'arrive pas si on la respecte.

C'est pour ça que je pensais qu'il fallait y ajouter un module supplémentaire,

Chris
Messages postés
19
Date d'inscription
mercredi 3 octobre 2007
Statut
Membre
Dernière intervention
18 mars 2008
8
Bonjour,

J'ai mis à ma sauce le module de recherche sur vba mais j'ai un petit couac sur cette ligne de commande :

If SuiviActivite.Controls("TextBox" & i).Value <> "" _
And InStr(1, .Cells(l, i).Value, SuiviActivite.Controls("TextBox" & i).Value) = 0 Then valide = False

Le problème à mon sens réside dans le fait que je n'emploie pas uniquement des TextBox mais également des ComboBox.

J'ai bien tenté de renseigner naïvement cette nuance par cette commande :

If SuiviActivite.Controls("TextBox", "ComboBox" & i).Value <> "" _
And InStr(1, .Cells(l, i).Value, SuiviActivite.Controls("TextBox", "ComboBox" & i).Value) = 0 Then valide = False

Bien entendu, c'est raté...

Si tu as une idée, je prends volontiers

Merci de ton aide,

Chris
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
bonjour

J'ai mis à ma sauce le module de recherche sur vba mais j'ai un petit couac sur cette ligne de commande :

Cette ligne ne récupère que les contrôles dont le nom commence par "TextBox" et avec la valeur de i
Si tu as supprimé des textbox pour mettre des combo, ton i est faux et cela plante.

Pour ne pas tenir compte de la casse, il suffit de modifier ainsi
If SuiviActivite.Controls("TextBox" & i).Value <> "" _
And InStr(1, lcase(.Cells(l, i).Value),  lcase(SuiviActivite.Controls("TextBox" & i).Value)) = 0 Then valide = False


Si tu veux utiliser des textbox et des combo, tu peux faire quelque chose comme
    For Each Ctrl In Me.Controls

    If typeOf Ctrl Is MSForms.textBox Then
         If Ctrl.Value = True Then
                       'ton traitement de texte
    elseif  typeOf Ctrl Is MSForms.comboBox Then
         If Ctrl.Value = True Then
                      'ton traitement de liste
--


Toujours zen
Messages postés
19
Date d'inscription
mercredi 3 octobre 2007
Statut
Membre
Dernière intervention
18 mars 2008
8
Je sens que j'avance, voici l'état actuel de la petite programmation :

Public Sub chercher(rech, c) 'recherche d'une chaine
Dim sel As Object
Dim valide As Boolean
Dim i As Integer
Dim l As Long
Dim n As Integer
l = 2: n = 0
SuiviActivite.ListBox1.Clear
With Sheets("BaseDeDonnées")
If rech = "" Then Exit Sub
Do
Set sel = .Cells.Find(What:=rech, after:=.Cells(l, c), _
LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, MatchCase:=False)
If sel Is Nothing Then Exit Do
If sel.Column <> c Then Exit Do
If sel.Row <= l Then Exit Do
l = sel.Row
valide = True
For Each Ctrl In SuiviActivite.Controls
If TypeOf Ctrl Is MSForms.TextBox Then
If Ctrl.Value = True Then
'ton traitement de texte
Else
If TypeOf Ctrl Is MSForms.ComboBox Then
If Ctrl.Value = True Then
'ton traitement de liste
If valide Then
SuiviActivite.ListBox1.AddItem _
(.Cells(l, 1).Value & " " & _
.Cells(l, 2).Value & " " & _
.Cells(l, 3).Value & " " & _
.Cells(l, 4).Value & " " & _
.Cells(l, 5).Value & " " & _
.Cells(l, 6).Value & " " & _
.Cells(l, 7).Value & " " & _
.Cells(l, 8).Value & " " & _
.Cells(l, 9).Value & " " & _
.Cells(l, 10).Value & " " & _
.Cells(l, 11).Value & " " & _
.Cells(l, 12).Value & " " & _
.Cells(l, 13).Value & " " & _
.Cells(l, 14).Value & " " & _
.Cells(l, 15).Value & " " & _
.Cells(l, 16).Value)
SuiviActivite.ListBox1.List(n, 2) = sel.Row
n = n + 1
End If
Loop
End With
End Sub

J'ai encore un message d'erreur signifiant Boucle Loop sans Do...

Je me demande si ce ne serait pas plus efficace de te faire suivre purement et simplement le fichier pour un meilleur visuel...

Pas facile mais j'y arriverai !!!

Chris
Messages postés
19
Date d'inscription
mercredi 3 octobre 2007
Statut
Membre
Dernière intervention
18 mars 2008
8
up!
Bonjour,

For Each Ctrl In SuiviActivite.Controls

il manque NEXT.

Salut.
Messages postés
19
Date d'inscription
mercredi 3 octobre 2007
Statut
Membre
Dernière intervention
18 mars 2008
8
Bonjour Amigo,

J'ai tenté le next avant et après la ligne de commande sans résultat

Le débogueur me répond "next sans for" dans les 2 cas
RE,

essaye comme ça
Public Sub chercher(rech, c) 'recherche d'une chaine
Dim sel As Object
Dim valide As Boolean
Dim i As Integer
Dim l As Long
Dim n As Integer
l = 2: n = 0
SuiviActivite.ListBox1.Clear
With Sheets("BaseDeDonnées")
  If rech = "" Then Exit Sub
  Do
    Set sel = .Cells.Find(What:=rech, after:=.Cells(l, c), _
    LookIn:=xlValues, LookAt:=xlPart, _
    SearchOrder:=xlByColumns, _
    SearchDirection:=xlNext, MatchCase:=False)
    If sel Is Nothing Then Exit Do
    If sel.Column <> c Then Exit Do
    If sel.Row <= l Then Exit Do
    l = sel.Row
    valide = True
    For Each Ctrl In SuiviActivite.Controls
      If TypeOf Ctrl Is MSForms.TextBox Then
          If Ctrl.Value = True Then
          'ton traitement de texte
          Else
             If TypeOf Ctrl Is MSForms.ComboBox Then
                If Ctrl.Value = True Then
                'ton traitement de liste
                     If valide Then
                       SuiviActivite.ListBox1.AddItem _
                       (.Cells(l, 1).Value & " " & _
                        .Cells(l, 2).Value & " " & _
                        .Cells(l, 3).Value & " " & _
                        .Cells(l, 4).Value & " " & _
                        .Cells(l, 5).Value & " " & _
                        .Cells(l, 6).Value & " " & _
                        .Cells(l, 7).Value & " " & _
                        .Cells(l, 8).Value & " " & _
                        .Cells(l, 9).Value & " " & _
                        .Cells(l, 10).Value & " " & _
                        .Cells(l, 11).Value & " " & _
                        .Cells(l, 12).Value & " " & _
                        .Cells(l, 13).Value & " " & _
                        .Cells(l, 14).Value & " " & _
                        .Cells(l, 15).Value & " " & _
                        .Cells(l, 16).Value)
                        SuiviActivite.ListBox1.List(n, 2) = sel.Row
                        n = n + 1
                     End If
                End If
             End If
          End If
      End If
    Next
  Loop
End With
End Sub
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
bonjour olive60,

Avec beaucoup de mal pour retrouver cet exemple mais le voici et fait en bon usage :

http://www.cijoint.fr/cjlink.php?file=cj200906/cijNZe1r3x.xls
Messages postés
253
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
21 décembre 2010
25
je ne l'ai pas regardé mais merci beaucoup, c'est sympa de ta part.

A+!

Olive
Messages postés
253
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
21 décembre 2010
25
c'est vraiment du beau boulot!

je voudrais l'adapter un peu à mon souci.

Comment ferais tu pour le redimensionner et surtout le fixer sur une feuille, par exemple au dessus de ma table?

merci

Olive
Messages postés
253
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
21 décembre 2010
25
pour le redimensionner j'ai vu comment faire....

par contre pour le fixer c'est pas un truc avec "modal"??
Messages postés
253
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
21 décembre 2010
25
ou dans les propriétés?
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
bonjour

Pour le fixer sur une feuille, tu peux l'ouvrir dans la macro open de thisworkbook. Il est ouvert en modal et donc tu n'as pas accès à la feuille.

Pour le positionner sur une feuille, dans Private Sub UserForm_Initialize() tu rajoutes la position haut et gauche :
Me.Top = Application.Top + 130
Me.Left = Application.Left + 30

en adaptant les nombres à ce que tu veux faire.
Messages postés
253
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
21 décembre 2010
25
Salut gbinform,

petite question : qu'est ce que tu veux dire par :

"tu peux l'ouvrir dans la macro open de thisworkbook"
=> ok mais comment????? je déplace le code dans Thisworkbook? (je dis petre n'importequoi)

"Il est ouvert en modal et donc tu n'as pas accès à la feuille."
=> de quelle feuille tu parle? je n'ai pas remarqué que je n'avais pas accès à une feuille...

S'il te plait explique moi!!!

merci d'avance

(d'ailleurs si qq un d'autre à la réponse.. je prends aussi)

Olive
Messages postés
253
Date d'inscription
vendredi 7 septembre 2007
Statut
Membre
Dernière intervention
21 décembre 2010
25
merci gbinform. je vais essayer...

A+!

Olive
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
bonjour

ok mais comment????? je déplace le code dans Thisworkbook?

Dans Thisworkbook tu peux effectivement mettre ce code et ton formulaire se lancera à l'ouverture
Private Sub Workbook_Open()
    recherche.Show
    End
End Sub

de quelle feuille tu parle? je n'ai pas remarqué que je n'avais pas accès à une feuille...

La feuille excel avec les données est visible mais non accessible lorsque le formulaire est actif. Cela veux dire que si tu agrandis suffisamment ton formulaire, la feuille ne sera plus visible et tu peux faire qu'il ait ma même taille que la fenêtre excel.