Userform : Comportement de ListIndex

Bonjour,

Est ce que quelqu’un pourrait m’aider à comprendre le comportement de ListIndex ?

Voir le fichier joint :

25test.xlsm (42.18 Ko)

J’ai créé un UserForm avec 5 ListBox vides.

Je souhaite initialiser cet UserForm, avant de pouvoir l’utiliser, en affectant à chaque ListBox la même liste de choix mais en sélectionnant au depart une valeur différente dans chaque List Box.

D’où le code :

Public LISTEx() As Variant
Public NBx As Integer

Sub Runinit()
init
initUF
End Sub

Sub init()
NBx = 6
ReDim LISTEx(1 To NBx)
LISTEx(1) = "A"
LISTEx(2) = "B"
LISTEx(3) = "C"
LISTEx(4) = "D"
LISTEx(5) = "E"
LISTEx(5) = "F"
End Sub

Sub initUF()
UserForm1.ListBox1.List = LISTEx
UserForm1.ListBox2.List = LISTEx
UserForm1.ListBox3.List = LISTEx
UserForm1.ListBox4.List = LISTEx
UserForm1.ListBox5.List = LISTEx

UserForm1.ListBox1.ListIndex = 0
UserForm1.ListBox2.ListIndex = 1
UserForm1.ListBox3.ListIndex = 2
UserForm1.ListBox4.ListIndex = 3
UserForm1.ListBox5.ListIndex = 4

UserForm1.Show

End Sub

Lorsque j’active le UserForm, j’ai bien les 5 ListBox remplies avec la bonne valeur sélectionnée,

capture

mais par contre, si je veux utiliser la valeur ou le texte de la Listbox (UserForm1.ListBox1 tout court, ou UserForm1.ListBox1.Value, ou ListBox1.Text par exemple), pour certaines ListBox on a bien en retour la bonne valeur mais pour d’autres, il n’y a rien …

capture

Comment cela s’explique t’il ?....

Merci d'avance !

Bonjour,

Range("A1:D5").ClearContents

With UserForm1.ListBox1
     Cells(1, 1) = "ListBox1 = " & .List(.ListIndex, 0)
     Cells(1, 4) = "ListBox1.ListIndex = " & .ListIndex
End With

With UserForm1.ListBox2
     Cells(2, 1) = "ListBox2 = " & .List(.ListIndex, 0)
     Cells(2, 4) = "ListBox2.ListIndex = " & .ListIndex
End With

With UserForm1.ListBox3
     Cells(3, 1) = "ListBox3 = " & .List(.ListIndex, 0)
     Cells(3, 4) = "ListBox3.ListIndex = " & .ListIndex
End With

With UserForm1.ListBox4
     Cells(4, 1) = "ListBox4 = " & .List(.ListIndex, 0)
     Cells(4, 4) = "ListBox4.ListIndex = " & .ListIndex
End With

With UserForm1.ListBox5
     Cells(5, 1) = "ListBox5 = " & .List(.ListIndex, 0)
     Cells(5, 4) = "ListBox5.ListIndex = " & .ListIndex
End With

Merci, mais cela ne répond pas à ma question.
Je ne cherche pas un autre moyen pour arriver au résultat que vous me montrez, je cherche à comprendre pourquoi ListIndex semble avoir un comportement aléatoire en fonction de la ListBox traitée.

Est ce un bug de Visual Basic ?

Parce que vous n'utilisez pas la bonne syntaxe.

Merci mais je pense que vous ne comprenez pas ma question.

En quoi "UserForm1.ListBox1.ListIndex = 0" serait une syntaxe incorrecte ?
Pourquoi "UserForm1.ListBox1.ListIndex = 0" donne t'il à ListBox1.Value la valeur "A" alors que "UserForm1.ListBox2.ListIndex = 1" donne à ListBox2.Value la valeur "" et non la valeur "B" ?

En quoi "UserForm1.ListBox2.ListIndex = 1" serait une syntaxe incorrecte ?

Bonjour,

Moi je me demande d'ou ça sort cette nouvelle méthode pour charger les UserForm ? Ça fait le deuxième en moins d'une semaine qui nous sort un truc comme ça.

Je voudrais pas passer pour un donneur de leçon parce que je ne suis pas un professeur... Mais jusqu'à 'aujourd'hui j'ai toujours vu qu'un UserForm ça se charge dans son Activate ou dans son Initialize. Sinon à mon avis tu dois tomber sur des problèmes de synchronisation. (VBA est asynchrone : Jusqu'à quel point je ne sais pas mais cette méthode me semble loufoque.

La meilleur preuve en est que si dans tes procédures de UserForm tu mets :

Private Sub ListBox1_Click()
MsgBox ListBox1.Text
End Sub

Private Sub ListBox2_Click()
MsgBox ListBox2.Text
End Sub

Private Sub ListBox3_Click()
MsgBox ListBox3.Text
End Sub

Private Sub ListBox4_Click()
MsgBox ListBox4.Text
End Sub

Private Sub ListBox5_Click()
MsgBox ListBox5.Text
End Sub

Là tu vas avoir des retours correct... (Avec Click ou avec Change peu importe.

Mais tes tests sur Feuil1 et ton chargement via Module1 à mon avis tu devrais oublier... Retour aux classiques conseillé !

A+

Bonjour Galopin01,

Il faut sans doute comprendre qu'il s'agit d'un test.

Quant au chargement d'une listbox, je n'utilise jamais les méthodes que tu préconises, mais c'est seulement une question d'habitude.

Oui ben pour moi c'est un test ALAKON ! Cette réflexion ne concerne que la méthode hein... Pas le mec qui est tombé sur cette méthode par hasard !

Je ne préconise rien du tout : L'évènement Click que je cite c'est APRES affichage du UserForm.

Le test de notre ami se situe AVANT affichage du UserForm. Et dans ce cas, l'évènement Click est toujours aussi Faux.

Donc la seule chose que je préconise c'est le lancement classique du UserForm et l'utilisation de Activate et du Initialize.

L'abandon des Variables publiques inutiles.

La déclarations systématique des variables dans chaque Sub.

L'utilisation de Mot-clef Me à l'intérieur du UserForm et là on n'aura pas besoin de réinventer la roue...

A+

Sujet clos pour moi.

Pour plus de clarté, j'ai mis le code suivant dans le userform :

Private Sub ListBox1_Click()
MsgBox "ListBox1.Text = " & ListBox1.Text
End Sub
Private Sub ListBox2_Click()
MsgBox "ListBox2.Text = " & ListBox2.Text
End Sub
Private Sub ListBox3_Click()
MsgBox "ListBox3.Text = " & ListBox3.Text
End Sub
Private Sub ListBox4_Click()
MsgBox "ListBox4.Text = " & ListBox4.Text
End Sub
Private Sub ListBox5_Click()
MsgBox "ListBox5.Text = " & ListBox5.Text
End Sub

Malheureusement, le résultat est le même :

capture

Et svp, ne me proposez pas d'autre façons de faire cela, j'ai déjà trouvé un moyen de contourner le problème.

Ce que je cherche à comprendre c'est comment fonctionnne (ou ne fonctionne pas) ListIndex, en particulier quand on l'utilise dans la forme : UserForm1.ListBox1.ListIndex = 0

Bonjour,

A priori, il ne faut pas dans ce cas laisser la propriété TextColumn des ListBox à -1 car cela produit un résultat aléatoire. Il faut la positionner à 0.

Effectivement, en passant la propriété TextColumn des ListBox à 0, ça marche !

Je ne comprends pas pourquoi, mais Merci !!

Rechercher des sujets similaires à "userform comportement listindex"