Utilisation TextBox ListBox en VBA
AbouJustBeHappy
Messages postés
13
Date d'inscription
Statut
Membre
Dernière intervention
-
AbouJustBeHappy Messages postés 13 Date d'inscription Statut Membre Dernière intervention -
AbouJustBeHappy Messages postés 13 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai adapté un programme selon mes besoins. Par contre ce que j'ai fait n'est pas forcément l'idéal et je souhaite rendre mon programme efficace. Je m'explique, j'ai une base de données que je remplie au fur et à mesure et ce que je veux c'est faire une recherche avec une textbox et afficher le résultat de la recherche dans une listbox. J'y arrive lorsque les box sont dans la même feuille. Par contre je veux effectuer cette recherche dans une feuille différente. J'ai essayé différentes solutions sans succès quelqu'un pourrait-il m'aider ? je mets le programme en dessous :
Private O As Worksheet 'déclare la variable O (Onglet)
Private TC As Variant 'déclare la variable TC (Tableau de Cellules)
Private NL As Integer 'déclare la variable NL (Nombre de Lignes)
Private NC As Byte 'déclare la variable NC (Nombre de colonnes)
Private Sub Recherche_Initialize() 'à l'initialisation de l'UserForm
Set O = Sheets("Remplissage") 'définit l'onglet O
TC = O.Range("A2").CurrentRegion 'définit le tableau de cellules TC
NL = UBound(TC, 1) 'définit le nombre de lignes de TC
NC = UBound(TC, 2) 'définit le nombre de colonnes de TC
Me.ListBox1.ColumnCount = NC + 1 'définit le nombre de colonnes de la ListBox1 (à adapter, dans cet exemple je recherche dans la ligne entière. +1 pour le numéro de ligne)
Me.ListBox1.ColumnWidths = "0 pt;" 'masque la première colonne de la ListBox1 (celle ou sera stocké le numéro de la ligne)
End Sub
Private Sub TextBox1_Change() 'au changement dans la TesxBox1
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Me.ListBox1.Clear 'vide la ListBox1
K = 1 'initialise la variable K
For I = 2 To NL 'boucle 1 : sur toutes les lignes I du tabelau de cellules TC (en partant de la seconde)
For J = 1 To NC 'boucle 2 : sur toutes les colonnes J du tabelau de cellules TC
If InStr(1, TC(I, J), Me.TextBox1.Value, vbTextCompare) <> 0 Then 'condition : si le texte de la TextBox1 est contenu dans la donnée ligne I colonne J (sans tenir compte de la casse)
ReDim Preserve TL(NC + 1, 1 To K) 'redimensionne le tableau de lignes TL
TL(0, K) = I 'récupère dans la ligne 0, colonne K de TL le numéro de ligne (masqué)
For l = 1 To NC 'boucle sur toutes les colonnes de TC
TL(l, K) = TC(I, l) 'récupère dans la ligne L, colonne K de TC la valeur de la ligne I , colonne L de TC (transposition)
Next l 'prochaine colonne de la boucle 2
K = K + 1 'incrémente K
Exit For 'sort de la boucle 2
End If 'fin de la condition
Next J 'prochaine colonne de la boucle 2
Next I 'prochaine ligne de la boucle 1
If K > 1 Then 'condition : si K est supérieur à 1 (au moins une occurrence a été trouvé)
If K = 2 Then ReDim Preserve TL(NC + 1, 1 To 2) 'si une seule occurrence trouvée, redimensionne TL pour pouvoir transposer
Me.ListBox1.List = Application.Transpose(TL) 'alimente la ListBox1 avec le tableau TL transposé
End If 'fin de la condition
End Sub
Private Sub ListBox1_Click() 'au clic dans la ListBox1
O.Rows(Me.ListBox1.Column(0, ListIndex)).Select 'sélectionne la ligne de l'élément sélectionné
Unload Me 'vide et ferme l'UserForm
End Sub
Private Sub Recherche_Click()
End Sub
Private Sub UserForm_Click()
End Sub
J'ai adapté un programme selon mes besoins. Par contre ce que j'ai fait n'est pas forcément l'idéal et je souhaite rendre mon programme efficace. Je m'explique, j'ai une base de données que je remplie au fur et à mesure et ce que je veux c'est faire une recherche avec une textbox et afficher le résultat de la recherche dans une listbox. J'y arrive lorsque les box sont dans la même feuille. Par contre je veux effectuer cette recherche dans une feuille différente. J'ai essayé différentes solutions sans succès quelqu'un pourrait-il m'aider ? je mets le programme en dessous :
Private O As Worksheet 'déclare la variable O (Onglet)
Private TC As Variant 'déclare la variable TC (Tableau de Cellules)
Private NL As Integer 'déclare la variable NL (Nombre de Lignes)
Private NC As Byte 'déclare la variable NC (Nombre de colonnes)
Private Sub Recherche_Initialize() 'à l'initialisation de l'UserForm
Set O = Sheets("Remplissage") 'définit l'onglet O
TC = O.Range("A2").CurrentRegion 'définit le tableau de cellules TC
NL = UBound(TC, 1) 'définit le nombre de lignes de TC
NC = UBound(TC, 2) 'définit le nombre de colonnes de TC
Me.ListBox1.ColumnCount = NC + 1 'définit le nombre de colonnes de la ListBox1 (à adapter, dans cet exemple je recherche dans la ligne entière. +1 pour le numéro de ligne)
Me.ListBox1.ColumnWidths = "0 pt;" 'masque la première colonne de la ListBox1 (celle ou sera stocké le numéro de la ligne)
End Sub
Private Sub TextBox1_Change() 'au changement dans la TesxBox1
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Me.ListBox1.Clear 'vide la ListBox1
K = 1 'initialise la variable K
For I = 2 To NL 'boucle 1 : sur toutes les lignes I du tabelau de cellules TC (en partant de la seconde)
For J = 1 To NC 'boucle 2 : sur toutes les colonnes J du tabelau de cellules TC
If InStr(1, TC(I, J), Me.TextBox1.Value, vbTextCompare) <> 0 Then 'condition : si le texte de la TextBox1 est contenu dans la donnée ligne I colonne J (sans tenir compte de la casse)
ReDim Preserve TL(NC + 1, 1 To K) 'redimensionne le tableau de lignes TL
TL(0, K) = I 'récupère dans la ligne 0, colonne K de TL le numéro de ligne (masqué)
For l = 1 To NC 'boucle sur toutes les colonnes de TC
TL(l, K) = TC(I, l) 'récupère dans la ligne L, colonne K de TC la valeur de la ligne I , colonne L de TC (transposition)
Next l 'prochaine colonne de la boucle 2
K = K + 1 'incrémente K
Exit For 'sort de la boucle 2
End If 'fin de la condition
Next J 'prochaine colonne de la boucle 2
Next I 'prochaine ligne de la boucle 1
If K > 1 Then 'condition : si K est supérieur à 1 (au moins une occurrence a été trouvé)
If K = 2 Then ReDim Preserve TL(NC + 1, 1 To 2) 'si une seule occurrence trouvée, redimensionne TL pour pouvoir transposer
Me.ListBox1.List = Application.Transpose(TL) 'alimente la ListBox1 avec le tableau TL transposé
End If 'fin de la condition
End Sub
Private Sub ListBox1_Click() 'au clic dans la ListBox1
O.Rows(Me.ListBox1.Column(0, ListIndex)).Select 'sélectionne la ligne de l'élément sélectionné
Unload Me 'vide et ferme l'UserForm
End Sub
Private Sub Recherche_Click()
End Sub
Private Sub UserForm_Click()
End Sub
A voir également:
- Utilisation TextBox ListBox en VBA
- Utilisation chromecast - Guide
- Télécharger gratuitement notice d'utilisation - Guide
- La ressource demandée est en cours d'utilisation ✓ - Forum Logiciels
- Dossier en cours d'utilisation - Forum Windows 8 / 8.1
- Cliquez sur ce lien. en n'utilisant que le clavier, quel mot obtenez-vous ? ✓ - Forum souris / Touchpad
8 réponses
Bonjour Abdou, bonjour le forum,
Le code est suffisamment commenté, me semble-t-il pour pouvoir l'adapter à tes besoins...
Par contre je veux effectuer cette recherche dans une feuille différente..
Il te suffit de modifier le nom de l'onglet dans le code !... Ou d'être un peu plus clair dans tes explications.
Le code est suffisamment commenté, me semble-t-il pour pouvoir l'adapter à tes besoins...
Par contre je veux effectuer cette recherche dans une feuille différente..
Il te suffit de modifier le nom de l'onglet dans le code !... Ou d'être un peu plus clair dans tes explications.
Re,
Il me semblait avoir demandé des explications précises... Tu veux chercher dans quel onglet ?
Il me semblait avoir demandé des explications précises... Tu veux chercher dans quel onglet ?
Je veux à partir d'un onglet qui s'appelle "Avancement" faire ma recherche sachant que les données sont stockées dans un autre onglet qui s'appelle "Remplissage" et voici le lien pour le fichier excel :
https://www.cjoint.com/c/GGviqLoSW4E
https://www.cjoint.com/c/GGviqLoSW4E
Bonjour,
Le problème se situe à deux endroits. Tout d'abord l'initialisation d'une UserForm se fait, quel que soit le nom que tu lui attribues, avec le code Userform_Initialize. Toi tu as inventé une procédure d'initiaisation sur une TextBox (Rech) ?!...
Second point, pour afficher les résultats de la recherche on utilise une ListBox et pas une ComboBox !...
Ton fichier corrigé : https://www.cjoint.com/c/GGwkULBTt2K
Le problème se situe à deux endroits. Tout d'abord l'initialisation d'une UserForm se fait, quel que soit le nom que tu lui attribues, avec le code Userform_Initialize. Toi tu as inventé une procédure d'initiaisation sur une TextBox (Rech) ?!...
Second point, pour afficher les résultats de la recherche on utilise une ListBox et pas une ComboBox !...
Ton fichier corrigé : https://www.cjoint.com/c/GGwkULBTt2K
Bonjour TauTheme !!
Je te remercie vraiment pour ton aide. J'étais pas connceté durant le WE raison pour laquelle j'ai pas réagi plus tôt. J'ai télécharger le fichier que tu as mis sur le lien. Malheureusement Excel n'arrive pas à l'ouvrir et m'affiche une erreur de version ou de fichier endommagé. Merci pour tout par avance :)
Je te remercie vraiment pour ton aide. J'étais pas connceté durant le WE raison pour laquelle j'ai pas réagi plus tôt. J'ai télécharger le fichier que tu as mis sur le lien. Malheureusement Excel n'arrive pas à l'ouvrir et m'affiche une erreur de version ou de fichier endommagé. Merci pour tout par avance :)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour Abou, bonjour le forum,
J'ai testé et téléchargé sans problème le fichier à partir du lien que je t'ai proposé. Quand tu cliques sur accéder au fichier il ne faut pas que tu demandes à ouvrir avec mais à l'enregistrer. Là, tu devrais l'ouvrir sans problème...
Quelle est ta version d'Excel ?
À plus,
ThauTheme
J'ai testé et téléchargé sans problème le fichier à partir du lien que je t'ai proposé. Quand tu cliques sur accéder au fichier il ne faut pas que tu demandes à ouvrir avec mais à l'enregistrer. Là, tu devrais l'ouvrir sans problème...
Quelle est ta version d'Excel ?
À plus,
ThauTheme
Re,
Je ne comprends pas !... J'ai retéléchargé le fichier à partir du lien que je t'ai donné. Impeccable, j'ai bien un fichier .xlsm et pas un fichier .xlsx !...
Je te refais un lien vers ce fichier : https://www.cjoint.com/c/GGynrdCfBec
Je ne comprends pas !... J'ai retéléchargé le fichier à partir du lien que je t'ai donné. Impeccable, j'ai bien un fichier .xlsm et pas un fichier .xlsx !...
Je te refais un lien vers ce fichier : https://www.cjoint.com/c/GGynrdCfBec
Re,
Oui tu as raison, là on perd notre temps.
Donc commence par supprimer la ComboBox nommée Resul et remplace la par une ListBox que tu nommeras Resul...
Puis le code (à remplacer en totalité) :
---
À plus,
ThauTheme
Oui tu as raison, là on perd notre temps.
Donc commence par supprimer la ComboBox nommée Resul et remplace la par une ListBox que tu nommeras Resul...
Puis le code (à remplacer en totalité) :
Private O As Worksheet 'déclare la variable O (Onglet) Private TC As Variant 'déclare la variable TC (Tableau de Cellules) Private NL As Integer 'déclare la variable NL (Nombre de Lignes) Private NC As Byte 'déclare la variable NC (Nombre de colonnes) Private Sub UserForm_Initialize() Set O = Sheets("Remplissage") 'définit l'onglet O TC = O.Range("A1").CurrentRegion 'définit le tableau de cellules TC NL = UBound(TC, 1) 'définit le nombre de lignes de TC NC = UBound(TC, 2) 'définit le nombre de colonnes de TC Me.Resul.ColumnCount = NC + 1 'définit le nombre de colonnes de la zone de résultat (on fait une recherche dans la ligne entière. +1 pour le numéro de ligne) Me.Resul.ColumnWidths = "0 pt;" 'masque la première colonne de la zone de résultat (celle ou sera stocké le numéro de la ligne) End Sub Private Sub Rech_Change() Dim I As Integer 'déclare la variable I Dim J As Byte 'déclare la variable J Dim K As Integer 'déclare la variable K Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes) Me.Resul.Clear 'vide la zone de recherche K = 1 'initialise la variable K For I = 2 To NL 'boucle 1 : sur toutes les lignes I du tabelau de cellules TC (en partant de la seconde) For J = 1 To NC 'boucle 2 : sur toutes les colonnes J du tabelau de cellules TC If InStr(1, TC(I, J), Me.Rech.Value, vbTextCompare) <> 0 Then 'condition : si le texte de la zone de recherche est contenu dans la donnée ligne I colonne J (sans tenir compte de la casse) ReDim Preserve TL(NC + 1, 1 To K) 'redimensionne le tableau de lignes TL TL(0, K) = I 'récupère dans la ligne 0, colonne K de TL le numéro de ligne (masqué) For l = 1 To NC 'boucle sur toutes les colonnes de TC TL(l, K) = TC(I, l) 'récupère dans la ligne L, colonne K de TC la valeur de la ligne I , colonne L de TC (transposition) Next l 'prochaine colonne de la boucle 2 K = K + 1 'incrémente K Exit For 'sort de la boucle 2 End If 'fin de la condition Next J 'prochaine colonne de la boucle 2 Next I 'prochaine ligne de la boucle 1 If K > 1 Then 'condition : si K est supérieur à 1 (au moins une occurrence a été trouvée Me.Resul.Column = TL 'alimente la zone de résultat avec le tableau TL End If 'fin de la condition End Sub Private Sub Resul_Click() 'au clic dans la zone de résultat O.Activate O.Rows(Me.Resul.Column(0, Me.Resul.ListIndex)).Select 'sélectionne la ligne de l'élément sélectionné Unload Me End Sub
---
À plus,
ThauTheme
Non Il fonctionne sur l'onglet que tu vas spécifier dans le code !...
Set O = Sheets("Remplissage") 'définit l'onglet O
Si tu ne parviens pas à l'adapter, fournis ton fichier (voir https://www.cjoint.com/ par exemple) avec des explications précises parce que : dans une feuille qui est différente de la feuille où se trouve la base de données, à moins d'avoir une boule de cristal, c'est pas très explicite !...
Je vais tenter ce que tu m'as dis et si cela ne fonctionne toujours je t'enverrai le fichier. Merci !!
Je te remercie par avance pour ton aide.