Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

Vba macro excel recherche et userform

Chriscam8786, le lundi 25 février 2008 à 16:47:57
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
Répondre à Chriscam8786  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
amigo, le lundi 25 février 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
gbinforme, le lundi 25 février 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Chriscam8786, le mardi 26 février 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
gbinforme, le mardi 26 février 2008 à 00:57:19
bonjour

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

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
gbinforme, le mardi 26 février 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Chriscam8786, le vendredi 29 février 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Chriscam8786, le mardi 11 mars 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
gbinforme, le mardi 11 mars 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Chriscam8786, le mardi 11 mars 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Chriscam8786, le vendredi 14 mars 2008 à 09:11:23
up!
Répondre à Chriscam8786

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
amigo, le vendredi 14 mars 2008 à 09:34:19
Bonjour,

For Each Ctrl In SuiviActivite.Controls

il manque NEXT.

Salut.
Répondre à amigo

12


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Chriscam8786, le vendredi 14 mars 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
gbinforme, le vendredi 14 mars 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 amigo, le vendredi 14 mars 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
Macro Excel recherche multiple (Résolu) Bonjour, J'aimerais écrire une macro excel qui me permettrait de vérifier si le contenu de ma cellule appartient à une liste de valeur prédéfinie ou est présente dans une plage d'autres cellules précise. Et si oui de faire telle ou telle... www.commentcamarche.net/forum/affich-3623448-macro-excel-recherche-multiple
Copier des répertoire via macro excel VBA (Résolu) Bonjour à tous, j'utilise un petit programme en langage Macro Excel 4 sous Excel 2003, avec lequel j'arrive à me débrouiller! Il me génère une liste d'arborescence de répertoire sur une feuille Excel du type: c:/devi2008/AA080555/... www.commentcamarche.net/forum/affich-8565002-copier-des-repertoire-via-macro-excel-vba
Macro excel Extraire prix dans texte (Résolu) Bonjour, Je voudrai faire une macro excel qui me permette d'extraire un prix dans un phrase pour pourvoir ensuite le comparer a la valeur d'une autre cellule. - Est-il possible d'extraire selement les caractères numériques d'une... www.commentcamarche.net/forum/affich-6521911-macro-excel-extraire-prix-dans-texte
Programmation macro Excel (Résolu)Bonjour, Est il possible avec une macro Excel de faire une recherche pour que celle ci trouve automatiquement toutes les feuilles créées du fichier Excel. D'avance Merci Lionel www.commentcamarche.net/forum/affich-2711377-programmation-macro-excel
[VBA] Ouvrir un PDF depuis une macro Excel. (Résolu)Bonjour. Je reçois quotidiennement un nombre important de fichiers en format Word et PDF que je dois imprimer dans un ordre précis. Cet ordre est contenu dans un fichier Excel. J'ai réussi, à partir d'une boucle dans une macro Excel à... www.commentcamarche.net/forum/affich-2793717-vba-ouvrir-un-pdf-depuis-une-macro-excel