Utilisation TextBox ListBox VBA
AbouD
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Bonjour,
J'ai adapté un programme selon mes besoins. Par contre ce que j'ai fait n'est pas forcément l'idéal 8O 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 :aie: 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
Bonjour,
J'ai adapté un programme selon mes besoins. Par contre ce que j'ai fait n'est pas forcément l'idéal 8O 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 :aie: 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 VBA
- Utilisation chromecast - Guide
- Télécharger gratuitement notice d'utilisation - Guide
- Excel compter cellule couleur sans vba - Guide
- La ressource demandée est en cours d'utilisation ✓ - Forum Logiciels
- Vba textbox date format dd/mm/yyyy - Forum VB / VBA
1 réponse
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonsoir, peux-tu partager le code qui fonctionne bien lorsque les box sont dans la même feuille?
il est probablement facile à adapter.
il est probablement facile à adapter.
Voici le lien. Merci par avance :)
https://www.cjoint.com/c/GGupUY4VnbE
Je suis désolé mais j'avais oublié de mettre le fichier excel. Tu le trouveras avec le lien suivant : https://www.cjoint.com/c/GGviqLoSW4E
avant toute autre chose, peux-tu ajouter "option explicit" au début de chaque page de code, et compiler ton projet, afin de vérifier que toutes tes variables sont bien déclarées?
ensuite, partager ton fichier corrigé?