Rechercher : dans
Par :

Vba macro excel recherche et userform

Dernière réponse le 1 jui 2009 à 21:38:09 Chriscam8786, le 25 fév 2008 à 16:47:57 
 Signaler ce message aux modérateurs

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

Configuration: Windows XP
Internet Explorer 6.0

1

amigo, le 25 fév 2008 à 19:37:29

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+

Répondre à amigo

2

gbinforme, le 25 fév 2008 à 23:48:59

Bonjour

Un petit exemple pour te faire voir ce que l'on peut faire : http://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...
Toujours zen

Répondre à gbinforme

4

Chriscam8786, le 26 fév 2008 à 11:40:15

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... ;-)

Répondre à Chriscam8786

3

gbinforme, le 26 fév 2008 à 00:57:19

Bonjour

un fichier plus réaliste : http://cjoint.com/?cAa3Vj6LPm
Toujours zen

Répondre à gbinforme

15

olive60, le 25 jun 2009 à 21:09:28

Salut Gbinform,

est ce que tu pourrais reposter le fichier???

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

Olive

Répondre à olive60

5

gbinforme, le 26 fév 2008 à 17:03:23

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...
Toujours zen

Répondre à gbinforme

6

Chriscam8786, le 29 fév 2008 à 10:34:26

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

Répondre à Chriscam8786

7

Chriscam8786, le 11 mar 2008 à 13:53:54

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

Répondre à Chriscam8786

8

gbinforme, le 11 mar 2008 à 16:00:51

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

Répondre à gbinforme

9

Chriscam8786, le 11 mar 2008 à 17:39:35

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

Répondre à Chriscam8786

10

Chriscam8786, le 14 mar 2008 à 09:11:23

Up!

Répondre à Chriscam8786

11

amigo, le 14 mar 2008 à 09:34:19

Bonjour,

For Each Ctrl In SuiviActivite.Controls

il manque NEXT.

Salut.

Répondre à amigo

12

Chriscam8786, le 14 mar 2008 à 09:46:13

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

Répondre à Chriscam8786

13

gbinforme, le 14 mar 2008 à 09:55:10

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


Toujours zen

Répondre à gbinforme

14

amigo, le 14 mar 2008 à 10:03:00

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

Répondre à amigo

16

gbinforme, le 25 jun 2009 à 22:19:27

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.xl­s
Toujours zen

Répondre à gbinforme

17

olive60, le 26 jun 2009 à 11:11:06

Je ne l'ai pas regardé mais merci beaucoup, c'est sympa de ta part.

A+!

Olive

Répondre à olive60

18

olive60, le 26 jun 2009 à 11:16:23

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

Répondre à olive60

19

olive60, le 26 jun 2009 à 11:32:35

Pour le redimensionner j'ai vu comment faire....

par contre pour le fixer c'est pas un truc avec "modal"??

Répondre à olive60

20

olive60, le 26 jun 2009 à 12:56:40

Ou dans les propriétés?

Répondre à olive60

21

gbinforme, le 27 jun 2009 à 09:55:05

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.
Toujours zen

Répondre à gbinforme

23

olive60, le 1 jui 2009 à 18:52:56

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

Répondre à olive60

22

olive60, le 28 jun 2009 à 19:32:57

Merci gbinform. je vais essayer...

A+!

Olive

Répondre à olive60

24

 gbinforme, le 1 jui 2009 à 21:38:09

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.
Toujours zen

Répondre à gbinforme