VBA & listbox
Résolu
Pascal-77
Messages postés
16
Date d'inscription
Statut
Membre
Dernière intervention
-
Zoul67 Messages postés 1959 Date d'inscription Statut Membre Dernière intervention -
Zoul67 Messages postés 1959 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai créé une macro ou j'écris une nom qui filtre une listbox. La source se décale correctement et, une fois que j'ai terminé de taper le nom que je cherche, le premier choix sur ma listbox est bien celui que j'ai écrit.
Seulement, quand je clique sur un nom dans ma listbox, je récupère des informations relatifs à ce nom. Ces infos sont complètement décalées.
C'est à dire que lorsque ma listbox est complète, la correspondance est parfaite, dès que je la modifie avec ma fonction de recherche, elle n'est plus calée.
Est ce quelqu'un a une solution ?
Merci de votre aide.
J'ai créé une macro ou j'écris une nom qui filtre une listbox. La source se décale correctement et, une fois que j'ai terminé de taper le nom que je cherche, le premier choix sur ma listbox est bien celui que j'ai écrit.
Seulement, quand je clique sur un nom dans ma listbox, je récupère des informations relatifs à ce nom. Ces infos sont complètement décalées.
C'est à dire que lorsque ma listbox est complète, la correspondance est parfaite, dès que je la modifie avec ma fonction de recherche, elle n'est plus calée.
Est ce quelqu'un a une solution ?
Merci de votre aide.
4 réponses
Bonjour,
C'est marrant. D'habitude, les messages où on ne comprend rien sont bourrés de fautes de français.
A+
C'est marrant. D'habitude, les messages où on ne comprend rien sont bourrés de fautes de français.
A+
Bon c'est vrai que je n'ai peut être pas été assez clair.
J'ai une listbox avec des noms. Lorsque je sélectionne un nom j'affiche sur ma userform des infos ( numéro de téléphone, adresse, etc ...). Si en A1 se trouve le nom, le téléphone est en B1, l'adresse en C1 etc ...
J'ai un textbox qui me permet de filtrer ma listbox. Si je cherche un martin, je tape martin, la listbox va commencer par martin. Jusqu'ici tout va bien.
Mon problème est que, une fois mon martin affiché en haut de liste de la listbox, lorsque je le sélectionne, ce ne sont pas ses informations qui s'affichent, il y a un décalage. Si martin se trouve en A42, je ne retrouve pas les informations de B42 et C42. mais d'autres infos. Ce décalage n'est pas constant aussi je ne peux pas le corriger simplement dans la condition de changement de la listbox.
J'espère que cette fois c'est limpide.
Merci de votre aide.
J'ai une listbox avec des noms. Lorsque je sélectionne un nom j'affiche sur ma userform des infos ( numéro de téléphone, adresse, etc ...). Si en A1 se trouve le nom, le téléphone est en B1, l'adresse en C1 etc ...
J'ai un textbox qui me permet de filtrer ma listbox. Si je cherche un martin, je tape martin, la listbox va commencer par martin. Jusqu'ici tout va bien.
Mon problème est que, une fois mon martin affiché en haut de liste de la listbox, lorsque je le sélectionne, ce ne sont pas ses informations qui s'affichent, il y a un décalage. Si martin se trouve en A42, je ne retrouve pas les informations de B42 et C42. mais d'autres infos. Ce décalage n'est pas constant aussi je ne peux pas le corriger simplement dans la condition de changement de la listbox.
J'espère que cette fois c'est limpide.
Merci de votre aide.
J'arrête mon cynisme pour essayer de t'aider...
Peux-tu déposer ton fichier sur un site comme www.cjoint.com puisque tu as dû implémenter pas mal de choses ?
Je crains l'utilisation de l'index d'origine et non ListBox1.Value a priori...
A+
Peux-tu déposer ton fichier sur un site comme www.cjoint.com puisque tu as dû implémenter pas mal de choses ?
Je crains l'utilisation de l'index d'origine et non ListBox1.Value a priori...
A+
Salut Zoul67,
https://www.cjoint.com/?3FuaKNutOT8
Tu vas vite t'apercevoir du caractère amateur du fichier. L'organisation du code est à l'image de la clarté de mon premier message. Disons que je me qualifierais plus de bricoleur VBA que programmeur.
C'est la partie "annuaire" qui pose problème.
Merci de ton aide.
https://www.cjoint.com/?3FuaKNutOT8
Tu vas vite t'apercevoir du caractère amateur du fichier. L'organisation du code est à l'image de la clarté de mon premier message. Disons que je me qualifierais plus de bricoleur VBA que programmeur.
C'est la partie "annuaire" qui pose problème.
Merci de ton aide.
Salut Pascal-77,
Le VBA Excel est conçu pour faire du bricolage... Ton fichier est pas mal et les UserForms assez jolis.
Quelques conseils toutefois :
- indente le code ;
- nomme les objets pour clarifier le code (ex. OK_Click est plus clair que CommandButton1_Click)
- règle les valeurs de TabIndex pour faciliter la saisie au clavier (la touche Tabulation permet de passer d'un TextBox au suivant).
Comme je le pensais, le problème provenait d'un index qui se met à jour de façon erronée. Comme on fait bouger la ListBox1, je pense qu'il est plus simple de se baser sur ListBox1.Value.
Je n'ai pas trop aimé le principe du RowSource, parce que tu ne supprimais pas les dernières valeurs (ex saisir "daniel" ne supprime pas "zazie"). J'ai donc utilisé AddItem et basé le filtrage sur l'ensemble de la chaîne de caractères (des fois que tu te souviennes de "metro" et non de "zazie").
Le code :
Public derlig As Integer
Public Sub UserForm_Initialize()
derlig = Range("A65536").End(xlUp).Row
For i = 5 To derlig
ListBox1.AddItem Cells(i, 1).Value
Next i
End Sub
Private Sub CommandButton1_Click()
TextBox5.Value = ""
commerciaux.Hide
Menu.Show
End Sub
Private Sub CommandButton2_Click()
For i = 5 To derlig
If Cells(i, 1).Value = ListBox1.Value Then
Cells(i, 2).Value = TextBox2.Value
Cells(i, 3).Value = TextBox1.Value
Cells(i, 4).Value = TextBox3.Value
Cells(i, 5).Value = TextBox4.Value
Exit Sub
End If
Next
End Sub
Private Sub ListBox1_Change()
If ListBox1.ListIndex = -1 Then
TextBox1.Value = ""
TextBox2.Value = ""
TextBox3.Value = ""
TextBox4.Value = ""
Exit Sub
End If
For lig = 5 To derlig
If ListBox1.Value = Cells(lig, 1).Value Then
TextBox1.Value = Cells(lig, 3).Value
TextBox2.Value = Cells(lig, 2).Value
TextBox3.Value = Cells(lig, 4).Value
TextBox4.Value = Cells(lig, 5).Value
Exit Sub
End If
Next lig
End Sub
Public Sub TextBox5_Change()
ListBox1.ListIndex = -1
ListBox1.Clear
For i = 5 To derlig
If InStr(Cells(i, 1).Value, TextBox5.Value) > 0 Then ListBox1.AddItem Cells(i, 1).Value
Next i
End Sub
A+
Le VBA Excel est conçu pour faire du bricolage... Ton fichier est pas mal et les UserForms assez jolis.
Quelques conseils toutefois :
- indente le code ;
- nomme les objets pour clarifier le code (ex. OK_Click est plus clair que CommandButton1_Click)
- règle les valeurs de TabIndex pour faciliter la saisie au clavier (la touche Tabulation permet de passer d'un TextBox au suivant).
Comme je le pensais, le problème provenait d'un index qui se met à jour de façon erronée. Comme on fait bouger la ListBox1, je pense qu'il est plus simple de se baser sur ListBox1.Value.
Je n'ai pas trop aimé le principe du RowSource, parce que tu ne supprimais pas les dernières valeurs (ex saisir "daniel" ne supprime pas "zazie"). J'ai donc utilisé AddItem et basé le filtrage sur l'ensemble de la chaîne de caractères (des fois que tu te souviennes de "metro" et non de "zazie").
Le code :
Public derlig As Integer
Public Sub UserForm_Initialize()
derlig = Range("A65536").End(xlUp).Row
For i = 5 To derlig
ListBox1.AddItem Cells(i, 1).Value
Next i
End Sub
Private Sub CommandButton1_Click()
TextBox5.Value = ""
commerciaux.Hide
Menu.Show
End Sub
Private Sub CommandButton2_Click()
For i = 5 To derlig
If Cells(i, 1).Value = ListBox1.Value Then
Cells(i, 2).Value = TextBox2.Value
Cells(i, 3).Value = TextBox1.Value
Cells(i, 4).Value = TextBox3.Value
Cells(i, 5).Value = TextBox4.Value
Exit Sub
End If
Next
End Sub
Private Sub ListBox1_Change()
If ListBox1.ListIndex = -1 Then
TextBox1.Value = ""
TextBox2.Value = ""
TextBox3.Value = ""
TextBox4.Value = ""
Exit Sub
End If
For lig = 5 To derlig
If ListBox1.Value = Cells(lig, 1).Value Then
TextBox1.Value = Cells(lig, 3).Value
TextBox2.Value = Cells(lig, 2).Value
TextBox3.Value = Cells(lig, 4).Value
TextBox4.Value = Cells(lig, 5).Value
Exit Sub
End If
Next lig
End Sub
Public Sub TextBox5_Change()
ListBox1.ListIndex = -1
ListBox1.Clear
For i = 5 To derlig
If InStr(Cells(i, 1).Value, TextBox5.Value) > 0 Then ListBox1.AddItem Cells(i, 1).Value
Next i
End Sub
A+
Bonjour tout le monde,
Conseil de Zoul : indente le code
Pour ça je te conseille un addin : Smart Indenter
Très bien fait, un clic-droit sur le code et tout est indenté correctement.
Ca facilite grandement la lecture et le contrôle des boucles.
Compatible excel 2007-2010 même si ce n'est pas écrit sur le site : http://www.oaltd.co.uk/Indenter/
(ne pas oublier de lire le post 6 de Zoul...)
eric
Conseil de Zoul : indente le code
Pour ça je te conseille un addin : Smart Indenter
Très bien fait, un clic-droit sur le code et tout est indenté correctement.
Ca facilite grandement la lecture et le contrôle des boucles.
Compatible excel 2007-2010 même si ce n'est pas écrit sur le site : http://www.oaltd.co.uk/Indenter/
(ne pas oublier de lire le post 6 de Zoul...)
eric