VBA & listbox

Résolu/Fermé
Pascal-77 Messages postés 16 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 20 juin 2011 - 19 juin 2011 à 16:32
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 - 20 juin 2011 à 21:28
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.

4 réponses

Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
19 juin 2011 à 17:02
Bonjour,

C'est marrant. D'habitude, les messages où on ne comprend rien sont bourrés de fautes de français.

A+
0
Pascal-77 Messages postés 16 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 20 juin 2011
19 juin 2011 à 19:41
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.
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
19 juin 2011 à 20:53
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+
0
Pascal-77 Messages postés 16 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 20 juin 2011
20 juin 2011 à 00:39
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.
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
Modifié par Zoul67 le 20/06/2011 à 20:17
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+
0
Pascal-77 Messages postés 16 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 20 juin 2011
20 juin 2011 à 21:02
Salut Zoul67,

Un grand, grand merci, c'est énorme.
Heureusemenbt qu'il y a des gens comme toi pour éclairer ceux qui se perdent dans l'obscurité des codes ...

Encore merci.
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
20 juin 2011 à 21:28
C'était un plaisir. Les ListBox sont toujours un peu "casse-gueule". Mieux vaut n'utiliser que les propriétés les plus simples de ces monstres.
Peux-tu passer le sujet en "Résolu" ?
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
20 juin 2011 à 20:32
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
0
Pascal-77 Messages postés 16 Date d'inscription dimanche 28 juin 2009 Statut Membre Dernière intervention 20 juin 2011
20 juin 2011 à 21:06
Salut eriiic,

C'est noté. C'est vrai que je me lance dans le code sans faire d'organigramme et même parfois à l'aveuglette ce qui n'est très efficace.

Encore merci à tous.
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
20 juin 2011 à 21:23
Bien vu, eric ! En plus, je l'ai, ce plug-in, mais je n'ai ni pensé à l'utiliser en reprenant le fichier, ni conseillé à Pascal.
0