Formulaire recherche+listview
Bonjour,
Je suis tout nouveau sur le code VBA. Mon but est de, grosso modo, créer une application Excel comprenant un formulaire de recherche pour trouver le numéro du dossier du jour du patient. Le formualire comprend ainsi un bouton "Rechercher". A partir de 3 critères de recherche (nom, prénom et date de naissance du patient), la ou les réponse(s) sera(ont) affichée(s) dans une listview. L'application travaille sur un fichier d'une base de données régulière. Le problème est que je ne comprends pas du tout comment créer un moteur de recherche, malgré Internet. J'aimerais donc comprendre comment le créer.
Voici la construction de la listview :
Private Sub UserForm_Initialize()
'Configuration de la listview LIST_Clients
With Recherche_client.LIST_Clients
'Définit le nombre de colonnes
With .ColumnHeaders
'Supprime les anciens entêtes
.Clear
'Ajoute 10 colonnes en lien avec la feuille List_clients
.Add , , Sheets("Liste_clients").Range("I1").Text, 80, lvwColumnLeft 'Colonne Nom
.Add , , Sheets("Liste_clients").Range("J1").Text, 80, lvwColumnLeft 'Colonne Prénom
.Add , , Sheets("Liste_clients").Range("K1").Text, 60, lvwColumnLeft 'Colonne DateN
.Add , , Sheets("Liste_clients").Range("D1").Text, 60, lvwColumnLeft 'Colonne Date du RDV
.Add , , Sheets("Liste_clients").Range("E1").Text, 60, lvwColumnLeft 'Colonne Heure du RDV
.Add , , Sheets("Liste_clients").Range("G1").Text, 50, lvwColumnLeft 'Colonne Durée
.Add , , Sheets("Liste_clients").Range("A1").Text, 80, lvwColumnLeft 'Colonne UF
.Add , , Sheets("Liste_clients").Range("B1").Text, 40, lvwColumnLeft 'Colonne Statut
.Add , , Sheets("Liste_clients").Range("F1").Text, 80, lvwColumnLeft 'Colonne IEP
.Add , , Sheets("Liste_clients").Range("H1").Text, 80, lvwColumnLeft 'Colonne IPP
End With
.View = lvwReport 'affichage en mode Rapport
.Gridlines = True 'affichage d'un quadrillage
.FullRowSelect = True 'Sélection des lignes complètes
End With
End Sub
J'ai redistribué l'ordre des colonnes dans le souci de visibilité (qu'est-ce que l'utilisateur préfererait voir globalement?).
Voici la procédure du bouton "Rechercher" :
Private Sub BTN_Rechercher_Click()
'Déclaration des variables
Dim prenom As String
Dim nom As String
prenom = TXT_Prénom 'TXT_Prénom est la TextBox du champ prénom
nom = TXT_Nom 'TXT_Nom est la TextBox du champ nom
'Si ces trois champs de recherche sont corrects alors (voir pb condition string)
If VarType(prenom) = vbString And VarType(nom) = vbString And IsDate(TXT_DateN) Then
Else
MsgBox "Erreur de saisie, vérifiez bien les champs de saisie"
End If
End Sub
Je pense que le code des conditions n'est pas l'idéal, mais comme les conditions sont liées au moteur de recherche...
Récapitulations, j'aimerais savoir comment créer un moteur de recherche où les réponses seront affichées dans une listview.
Si vous avez des liens qui me permettent de comprendre, je vous prie de les partager.
Merci d'avance de m'aider,
Malitiosus
Après intense réflexion, j'ai pu réaliser une partie du code pour le moteur de recherche :
'Vide le contenu de la listview "LIST_clients"
Recherche_client.LIST_Clients.ListItems.Clear
'Activation de la feuille
Sheets ("Liste_clients")
'Définition de la plage de recherche sur la feuille active
Dim C As Integer
Dim derli As Integer
Dim dercol As Integer
derli = Range("A1").End(xlDown).Row
dercol = Range("IV1").End(xlToLeft).Column
For Each C In Range(derli, dercol)
Je suppose qu'il me reste ce genre de code "If C.Text Like "*"& Recherche_client.TXT_Nom.Text & "*" And C.Offset(0,1) etc.
Quand je vois cette instruction, je vois : Si le texte de ladite cellule correspond au texte saisi par l'utilisateur de la deuxième colonne. Que signifie Offset? Ma traduction est-elle correcte?
bonsoir
c'est juste pour dire mettre tes codes apres appuie sur le bouton codes comme ceci entre les mots code
voila
pascal
D'accord, je m'excuse de ne n'y pas avoir prêté attention. Sinon, quelqu'un peut m'eclairer, svp?
PS : Faut-il recopier mes codes?
Re,
J'ai développé le reste de la partie du moteur de recherche. Mon problème est que ça n'affiche rien après le bouton "Rechercher". Je pense que c'est c'est un problème avec Offset. Pourriez-vous m'aider, s'il vous plaît
For Each C In Range(Range("A" & ActiveCell.Row), Range("IV" & ActiveCell.Row).End(xlToLeft))
Dim ligne_rech
Dim cell_remplir
Dim LR As Integer
LR = 1
Dim num_ligne As Integer
If C.Text Like "*" & Recherche_client.TXT_Nom.Text & "*" And C.Offset(0, 9) Like "*" & Recherhce_client.TXT_Prénom.Text & "*" And C.Offset(0, 10) Like "*" & Recherche_client.TXT_DateN.Text & "*" Then
'On place l'adresse de la variable de ligne_rech
ligne_rech = C.Address
If ligne_rech <> "$A$1" And C <> "" Then
With ThisWorkbook.ActiveSheet
'On remplit la première colonne de la listview
Recherche_client.LIST_Clients.ListItems.Add , , Range(ligne_rech)
'On remplit les autres colonnes de la listview
Set cell_remplir = Range(ligne_rech).Offset(0, 9)
Recherche_client.LIST_Clients.ListItems(LR).ListSubItems.Add , , ActiveSheet
Set cell_remplir = Range(ligne_rech).Offset(0, 10)
Recherche_client.LIST_Clients.ListItems(LR).ListSubItems.Add , , ActiveSheet
Set cell_remplir = Range(ligne_rech).Offset(0, 3)
Recherche_client.LIST_Clients.ListItems(LR).ListSubItems.Add , , ActiveSheet
Set cell_remplir = Range(ligne_rech).Offset(0, 4)
Recherche_client.LIST_Clients.ListItems(LR).ListSubItems.Add , , AvtiveSheet
Set cell_remplir = Range(ligne_rech).Offset(0, 6)
Recherche_client.LIST_Clients.ListItems(LR).ListSubItems.Add , , ActiveSheet
Set cell_remplir = Range(ligne_rech).Offset(0, 0)
Recherche_client.LIST_Clients.ListItems(LR).ListSubItems.Add , , ActiveSheet
Set cell_remplir = Range(ligne_rech).Offset(0, 1)
Recherche_client.LIST_Clients.ListItems(LR).ListSubItems.Add , , ActiveSheet
Set cell_remplir = Range(ligne_rech).Offset(0, 5)
Recherche_client.LIST_Clients.ListItems(LR).ListSubItems.Add , , ActiveSheet
Set cell_remplir = Range(ligne_rech).Offset(0, 7)
Recherche_client.LIST_Clients.ListItems(LR).ListSubItems.Add , , ActiveSheet
End With
'On ajoute 1 à LR pour la prochaine ligne de réponse (lign_rech)
G = G + 1
End If
End If
Next C
Bon, j'ai pu afficher le résultat du bouton de cette manière :
Nom | Prénom | DateN | DateRDV | HeureRDV | DuréeRDV | UF | Statut | IEP | IPP
n°IPP| JEAN | 02/11/1988 | 04/11/2014 | 11h20 | 15mn | 8400 | 214577 | n°IPP
La première colonne est rempli de numéros IPP à la place des noms, et seulement une seule ligne se remplit. J'ai l'impression de tourner en rond pendant des heures...
'Définition de la plage de recherche sur la feuille active
Dim C
Dim numero_ligne, num
For Each C In Range([A2], [A65536].End(xlUp))
Dim ligne_rech
Dim cell_remplir
Dim LR As Integer
LR = 1
If C.Offset(0, 8) Like "*" & Recherche_client.TXT_Nom.Text & "*" And C.Offset(0, 9) Like "*" & Recherche_client.TXT_Prénom.Text & "*" And C.Offset(0, 10) Like "*" & Recherche_client.TXT_DateN.Text & "*" Then
'On place l'adresse de la variable de ligne_rech
ligne_rech = C.Address
Set numero_ligne = Columns("I").Find(C.Offset(0, 8))
num = numero_ligne.Row
If ligne_rech <> "$A$1" And C <> "" Then
With Classeur.ActiveSheet
'On remplit la première colonne de la listview
Set cell_remplir = Range(ligne_rech).Offset(0, 8)
Recherche_client.LIST_Clients.ListItems(LR).ListSubItems.Add , , cell_remplir
Re,
J'ai finalement trouvé l'erreur. J'ai en fait placé LR=1 (1ère ligne de réponse) dans la boucle For each C in Range... Et puis aussi le remplissage de la 1ère colonne par des noms :
'1ère ligne de résultat
Dim LR As Integer
LR = 1
'Définition de la plage de recherche sur la feuille active
Dim C
Dim numero_ligne
For Each C In Range([A2], [A65536].End(xlUp))
Dim ligne_rech
Dim cell_remplir
If C.Offset(0, 8) Like "*" & Recherche_client.TXT_Nom.Text & "*" And C.Offset(0, 9) Like "*" & Recherche_client.TXT_Prénom.Text & "*" And C.Offset(0, 10) Like "*" & Recherche_client.TXT_DateN.Text & "*" Then
'On place l'adresse de la variable de ligne_rech
ligne_rech = C.Address
If ligne_rech <> "$A$1" And C <> "" Then
With Classeur.ActiveSheet
'On remplit la première colonne de la listview
Recherche_client.LIST_Clients.ListItems.Add , , C.Offset(0, 8)
J'espère que je ne l'ai pas posté pour rien.