Recherche dans fichier Excel
Bonjour à tous,
J'essaie de trouver un moyen en utilisant un Userform de faire une recherche d'une chaine de caractères (dans ma colonne val) puis d'afficher dans une liste déroulante les résultats correspondants.
J'aimerais pouvoir, une fois cette liste affichée, cliquer sur un des résultats pour me renvoyer soit vers la ligne de ce résultat soit vers un document externe.
Je ne connais pas grand chose au VBA, mais j'ai des connaissances dans d'autres langages.
Je n'ai pas vraiment envie d'avoir une réponse avec une solution parfaite mais plutôt des indications sur la façon dont je pourrais faire.
N'hésitez pas à me demander de quelconques informations si ce n'est pas assez claires.
Merci d'avance
Cordialement.
Bonjour Steinfus, bonjour le forum,
T'expliquer est plus long que te proposer un code. J'ai opté pour un code commenté (j'ai supprimé le bouton, la recherche se fait au fur et à mesure que l'on tape du texte)
Option 1 : la recherche se fait par rapport au début du mot.
Private O As Worksheet 'déclare la variable O (Onglet)
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Private Sub UserForm_Initialize() 'a l'initialisation de l'UserForm
Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Me.ListBox1.ColumnCount = 4 'définit le nombre de colonne de la Listbox1
Me.ListBox1.ColumnWidths = "0" 'masque la première colonne
End Sub
Private Sub TextBox1_Change() 'au changement dans la TextBox
Dim I As Integer 'déclare la variable I (Incrément)
Me.ListBox1.Clear 'vide la ListBox1
If Me.TextBox1 = "" Then Exit Sub 'si la TextBox1 est effacée, sort de la procédure
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
'condition : si les premiers caractères de la donnée ligne I colonne 3 de TV valent le texte tapé dans la TexttBox1
If Left(TV(I, 3), Len(Me.TextBox1.Value)) = Me.TextBox1.Value Then
With Me.ListBox1 'prend en compte la ListBox1
.AddItem 'ajoute un élément
.Column(0, .ListCount - 1) = I 'récupère dans la colonne 0 de la Listbox1 (masquée) la ligne I
.Column(1, .ListCount - 1) = TV(I, 1) 'récupère dans la colonne 1 de la Listbox1 la donnée ligne I colonne 1 de TV
.Column(2, .ListCount - 1) = TV(I, 2) 'récupère dans la colonne 2 de la Listbox1 la donnée ligne I colonne 2 de TV
.Column(3, .ListCount - 1) = TV(I, 3) 'récupère dans la colonne 3 de la Listbox1 la donnée ligne I colonne 3 de TV
End With 'fin de la prise en compte de la ListBox1
End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub
Private Sub ListBox1_Click() 'au clic dans la ListBox1
Dim LI As Integer 'déclare la variable I (Incrément)
LI = Me.ListBox1.Column(0, Me.ListBox1.ListIndex) 'définit la ligne LI (dans la colonne 0, masquée, de l'élément sélectionné
O.Cells(LI, "A").Select 'sélectionne la cellule ligne LI colonne A de l'onglet O
End SubOption 2 : la recherche se fait par rapport au contenu, si les texte tapé est contenu dans le mot :
Private Sub TextBox1_Change() 'au changement dans la TextBox
Dim I As Integer 'déclare la variable I (Incrément)
Me.ListBox1.Clear 'vide la ListBox1
If Me.TextBox1 = "" Then Exit Sub 'si la TextBox1 est effacée, sort de la procédure
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
'condition : si le texte tapé est contenu dans le mot
If InStr(1, TV(I, 3), Me.TextBox1.Value, vbTextCompare) > 0 Then
With Me.ListBox1 'prend en compte la ListBox1
.AddItem 'ajoute un élément
.Column(0, .ListCount - 1) = I 'récupère dans la colonne 0 de la Listbox1 (masquée) la ligne I
.Column(1, .ListCount - 1) = TV(I, 1) 'récupère dans la colonne 1 de la Listbox1 la donnée ligne I colonne 1 de TV
.Column(2, .ListCount - 1) = TV(I, 2) 'récupère dans la colonne 2 de la Listbox1 la donnée ligne I colonne 2 de TV
.Column(3, .ListCount - 1) = TV(I, 3) 'récupère dans la colonne 3 de la Listbox1 la donnée ligne I colonne 3 de TV
End With 'fin de la prise en compte de la ListBox1
End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End SubBonjour ThauThème,
Merci de me répondre aussi vite, je viens de tester l'option 1, cela fonctionne très bien, mais j'aurais préféré utiliser l'option 2 qui me permet de trouver n'importe quelle caractère (pas forcément le début de la valeur).
J'ai un message d'erreur sur cette ligne :
For I = 2 To UBound(TV, 1)
Re,
Il fallait remplacer la partie du code Textbox1_Change de l'option 1 par le code de l'option 2
Ton fichier modifié en pièce jointe :
Effectivement, je n'avais pas pensé à ça!
Est-il possible de "créer" un lien hypertexte directement dans la liste déroulante pour que l'utilisateur soit renvoyé:
- Soit à la ligne voulu;
- Soit directement au fichier donné par le chemin.
Encore merci pour ton aide.
Re,
J'suis pas très fortiche avec les liens... Mais envoie un exemple avec des liens dans le tableau et je verrai si j'arrive a te dépatouiller ça...
Re,
Je pense avoir trouvé.
Si la cellule en Colonne B contient le lien vers un fichier, remplace le code du Click dans la Listbox1 par :
Private Sub ListBox1_Click() 'au clic dans la ListBox1
Dim LI As Integer 'déclare la variable I (Incrément)
LI = Me.ListBox1.Column(0, Me.ListBox1.ListIndex) 'définit la ligne LI (dans la colonne 0, masquée, de l'élément sélectionné
O.Cells(LI, "A").Select 'sélectionne la cellule ligne LI colonne A de l'onglet O
On Error Resume Next
Range("B23").Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True
Unload Me
End Sub[Édition]
NON ! ça ne marche pas comme ça... Je continue de chercher...
Re,
Évidemment, j'suis bête !...
Private Sub ListBox1_Click() 'au clic dans la ListBox1
Dim LI As Integer 'déclare la variable I (Incrément)
LI = Me.ListBox1.Column(0, Me.ListBox1.ListIndex) 'définit la ligne LI (dans la colonne 0, masquée, de l'élément sélectionné
O.Cells(LI, "A").Select 'sélectionne la cellule ligne LI colonne A de l'onglet O
On Error Resume Next
Cells(LI, "B").Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True
Unload Me
End SubTout marche parfaitement!
Un grand merci à toi!