Utilisation TextBox ListBox en VBA

Fermé
AbouJustBeHappy Messages postés 13 Date d'inscription jeudi 20 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017 - 20 juil. 2017 à 14:31
AbouJustBeHappy Messages postés 13 Date d'inscription jeudi 20 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017 - 24 juil. 2017 à 15:44
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

8 réponses

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
20 juil. 2017 à 14:53
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.
0
AbouJustBeHappy Messages postés 13 Date d'inscription jeudi 20 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017
20 juil. 2017 à 15:35
Bonjour ThauTheme, je veux effectuer ma recherche et mon affichage dans une feuille qui est différente de la feuille où se trouve la base de données. Ce programme fonctionne seulement si je suis dans la feuille où se trouve ma Base de données.
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160 > AbouJustBeHappy Messages postés 13 Date d'inscription jeudi 20 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017
20 juil. 2017 à 15:47
Re,

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 !...
0
AbouJustBeHappy Messages postés 13 Date d'inscription jeudi 20 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017 > ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022
20 juil. 2017 à 15:55
Re,
Je vais tenter ce que tu m'as dis et si cela ne fonctionne toujours je t'enverrai le fichier. Merci !!
0
AbouJustBeHappy Messages postés 13 Date d'inscription jeudi 20 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017 > ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022
20 juil. 2017 à 17:48
Re ThauTheme voici le lien : https://www.cjoint.com/c/GGupUY4VnbE

Je te remercie par avance pour ton aide.
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
21 juil. 2017 à 10:53
Re,

Il me semblait avoir demandé des explications précises... Tu veux chercher dans quel onglet ?
0
AbouJustBeHappy Messages postés 13 Date d'inscription jeudi 20 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017
Modifié le 21 juil. 2017 à 10:59
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
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
22 juil. 2017 à 12:47
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


0
AbouJustBeHappy Messages postés 13 Date d'inscription jeudi 20 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017
24 juil. 2017 à 09:45
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 :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
Modifié le 24 juil. 2017 à 10:20
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
0
AbouJustBeHappy Messages postés 13 Date d'inscription jeudi 20 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017
24 juil. 2017 à 14:24
Ma version d'Excel est 2013. J'ai bien enregistré le fichier et le même problème se pose.

A plus ^^
0
AbouJustBeHappy Messages postés 13 Date d'inscription jeudi 20 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017
24 juil. 2017 à 14:29
https://www.cjoint.com/c/GGymCJfrtkE

Voici le message d'erreur que cela m'affiche.
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160 > AbouJustBeHappy Messages postés 13 Date d'inscription jeudi 20 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017
24 juil. 2017 à 15:18
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
0
AbouJustBeHappy Messages postés 13 Date d'inscription jeudi 20 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017 > ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022
24 juil. 2017 à 15:26
ça me refait toujours le même problème. Peut être en m'indiquant exactement les modifications apportées oubien en me mettant sous format txt le code serait plus simple. Moi je comprends pas pour quelle raison elle veut pas l'ouvrir. Désolé pour ce désagrément et merci pour ta disponibilité.
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
24 juil. 2017 à 15:30
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é) :

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
0
AbouJustBeHappy Messages postés 13 Date d'inscription jeudi 20 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017
24 juil. 2017 à 15:33
Merci ThauTheme,

Je te tiens au courant !!

A plus ;)
0
AbouJustBeHappy Messages postés 13 Date d'inscription jeudi 20 juillet 2017 Statut Membre Dernière intervention 24 juillet 2017
24 juil. 2017 à 15:44
Merci pour tout ThauTheme

Tout fonctionne à merveille !! :)
0