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   -
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   Statut Membre Dernière intervention   160
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   160 > AbouJustBeHappy Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   > ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   > ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   160
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   160
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   160
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
https://www.cjoint.com/c/GGymCJfrtkE

Voici le message d'erreur que cela m'affiche.
0
ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention   160 > AbouJustBeHappy Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   > ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention  
 
ç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   Statut Membre Dernière intervention   160
 
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   Statut Membre Dernière intervention  
 
Merci ThauTheme,

Je te tiens au courant !!

A plus ;)
0
AbouJustBeHappy Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour tout ThauTheme

Tout fonctionne à merveille !! :)
0