Acceder à une valeur d'une listbox

A

Arsene

Guest
Re bonjour tout le monde,
Voilà une nouvelle question de ma part, et devinez sur quoi: les listbox! lol

Je vous résume le probleme: un formulaire avec une combobox qui comprends les valeurs (Toto, Tata,Titi, Tutu)et une listbox qui contient les choix validé dans la combobox( en fait un récapitulatif des valeurs sélectionnées par l'utilisateur ).
Mon souci c'est que si l'utilisateur valide une deuxieme fois "Titi", je ne veux pas qu'il aille se mettre à nouveau dans ma listbox, c'est pourquoi je dois comparer la valeur validé par l'utilisateur (dans la combobox), avec les valeurs déja présentes dans la listbox.
Et malheureusement pour moi je n'arrive pas à accéder aux valeurs de ma listbox...
Si quelqu'un a une idée qu'il se gêne pas pour me la donner.

Merci d'avance
 
@

@+Thierry

Guest
Bonjour Arsene, le Forum

Il y a bien des moyens de faire ce que tu veux, mais en fait tout dépend de la manière dont tu t'y prends pour alimenter ta ComboBox et ta ListBox.

Pour une exemple simple je suis parti sur le principe de AddItem qui est le plus facile d'emploi. Conjointement à AddItem, on pourrait carrément utiliser la méthode RemoveItem aussi ce qui serait radical !

Mais pour commencer voici un exemple le plus simple possible sur le principe de la comparaison de valeur :

Le Matériel :
1 UserForm
1 Combobox (ComboBox1)
1 Listbox (ListBox1)

Le code :
Option Explicit

Private Sub UserForm_Initialize()
With Me.ComboBox1
.AddItem "Toto"
.AddItem "TaTa"
.AddItem "Titi"
.AddItem "Tutu"
End With
End Sub


Private Sub ComboBox1_Click()
Dim i As Integer, Dup As Byte
For i = 0 To Me.ListBox1.ListCount - 1
If Me.ComboBox1.Value = Me.ListBox1.List(i) Then
Dup = Dup + 1
End If
Next
If Dup = 0 Then
Me.ListBox1.AddItem Me.ComboBox1
Else: MsgBox "Valeur " & Me.ComboBox1 & " déjà sélectionnée"
End If
End Sub


Ceci dit comme précisé plus haut on peut être beaucoup plus radical et encore plus simple avec un RemoveItem à chaque click sur un Item de la ComboBox comme suit :

Option Explicit

Private Sub UserForm_Initialize()
With Me.ComboBox1
.AddItem "Toto"
.AddItem "TaTa"
.AddItem "Titi"
.AddItem "Tutu"
End With
End Sub


Private Sub ComboBox1_Click()
With Me
.ListBox1.AddItem (.ComboBox1)
.ComboBox1.RemoveItem (.ComboBox1.ListIndex)
End With
End Sub

Enfin disons que tout dépend du but recherché.

Bon Aprèm
@+Thierry
 
A

Arsene

Guest
Merci beaucoup pour ces explications détaillées! Ca répond à ma question, et le cas qui m'interesse est ta premiere explication.
Encore merci!
Je crois d'ailleurs que je vais vite reposer une question sur un autre sujet^^
 
A

Arsene

Guest
Bonjour Thierry, bonjour le forum
Pour en revenir à mon problème, je n'ai pas encore testé ta solution Thierry, car j'ai tenté de faire un petit truc tout seul, qui ne marche pas très bien, et pourtant je ne vois pas d'erreur...

En gros l'ajout dans la listbox se fait a partir d'un bouton "Ajouter".

Donc les objets du formulaire sont:
- Une combobox
- Une listbox
- Un bouton d'ajout "Valider"

On sélectionne une valeur de la combobox, on valide en cliquant sur "Valider", et la valeur va se mettre dans la listbox uniquement si cette valeur n'y est pas déja présente.

J'ai donc écrit une fonction qui renvoie un booléen pour savoir si oui ou non la valeur est présente. La voici:

Private Function verif() As Boolean
Dim I As Integer

I = ListBox1.ListCount

While (I > -1) And (Not verif)
ListBox1.ListIndex = I - 1
MsgBox ListBox1.List(I - 1) -->Affichage juste pour voir
MsgBox ComboBox1.Value --> Affichage juste pour voir
If ListBox1.List(I - 1) = ComboBox1.Value Then
verif = True

End If
I = I - 1
Wend
End Function

Et ce qui se trouve derriere le bouton:

Private Sub CommandButtonAdd_Click()
If ComboBox1.Value <> "" And passage <> 1 Then

If Not verif Then --> Si l'élément n'est pas déja présent
ListBox1.AddItem (ComboBox1.Value)
Else
MsgBox " élément déja présent dans la liste"
End If

Else
If passage = 1 Then --> Le premier passage je vérifie pas l'unicité
ListBox1.AddItem (ComboBox1.Value)
Else
MsgBox " Aucune Valeur de la combobox n'a été sélectionnée, veuillez en sélectionner une"
End If
End If
passage = passage + 1 --> passage est initialisée à 1 à l'ouverture du formulaire

End sub

Alors ça marche au premier passage d'une valeur, ça marche au second passage si je donne une valeur identique à la premiere( il ne me rajoute donc pas la valeur dans la liste ), mais au deuxieme passage si je donne une valeur autre que la premiere valeur passée, la programme plante et le déboggeur pointe sur :
MsgBox ListBox1.List(I - 1) -->Affichage juste pour voir
ou sur:
If ListBox1.List(I - 1) = ComboBox1.Value Then
si j'enleve la msgbox.

Le message d'erreur est le suivant: Impossible de lire la propriété List. Index de table de propriétés non valide.

Et je ne comprends vraiment pas ce qui se passe car la message box s'affiche correctement avec la bonne valeur, et pourtant ça semble pas plaire à l'execution...

Pleaze help!
Merci d'avance du temps passé à lire mon probleme et a tenter de le résoudre.
 
A

Arsene

Guest
LOL c'est bon, pas la peine de vous donner du mal pour répondre à ma question, j'ai trouvé une solution qui fonctionne, j'ai juste remplacé
I = Listbox1.ListCount
par I = Listbox1.ListCount - 1

et dans la fonction au lieu d'avoir Listbox1.list( I -1 ) j'ai mis Listbox1.ListCount( I ), et là ça marche...

Je comprends pas trop la différence d'ailleurs... m'enfin! Ca fonctionne donc on va pas se plaindre! lol

Par contre si quelqu'un avait un peu de temps pour m'expliquer ce à quoi correspond le "Me. (quelquechose)" utilisé dans le code de Thierry, ça serait très sympa, car je vois ce truc dans pas mal de solutions que vous apportez, et je ne sais toujours pas à quoi ça correspond.

Merci d'avance, et encore désolé de remplir des pages pour poser une question à laquelle je fini par réussir à répondre! ^^
Bonne journée a tous.
 
@

@+Thierry

Guest
Salut Arsene, le Forum

Me.... Hey it's me !! lol

Essaie depuis une Private Module contenant des Controls ActiveX de Taper "Me."

Tu verras de suite à quoi celà sert !

En fait le "Me" n'est valable que dans un Private Module soit de UserForm, soit de Feuille, soit de de ThisWorkbook.
Il n'est pas indispensable, mais est ultra efficace pour les développeurs comme moi qui aiment taper le moins possible (et sans erreur !)

Sinon ta fonction est probablement pas mal , et comme tu t'es rendu compte toi-même une ComboBox ou une ListBox démarre par zéro et il faut donc prendre en considération une décalage de - 1.

Par contre ta solution me semble bien lourde juste pour faire ceci... Et aussi attention ! ... je tape sur les doigts des gens qui ne déclarent pas leurs variables (ceci dit au "passage" lol)

Bon Aprèm
@+Thierry
 
A

Arsene

Guest
Oki doki! Je vois maintenant que Me peut être un outil qui me sera sans doute utile pour la suite! Pour mon code, il n'est sans doute pas très optimisé, mais me semble pas beaucoup plus lourd que le tien.^^

Et quand tu parles de var non déclarées, j'aimerai savoir où se situe le probleme! Car si c'est de ma variable "passage", elle est déclaré et initialisé, mais se comporte comme une var globale, donc j'avais pas besoin de la déclarer et de l'initialiser dans mon code là! NA! :p

Encore merci! ;)
 
@

@+Thierry

Guest
Hihihi Alors si le passage était furtivement déclaré Public oki doki ;-)

Par contre, çà me fait penser à Obelix quand il dit qui est gros ?, une Function sur une boucle While qui tourne systématiquemnt avec une condition sur elle-même munie d'un If, puis une Sub qui utilise cette Function avec trois If imbriqués de Else... Plus une variable Public, pour moi c'est de la grosse artillerie !

Mais comme disait très justement Maître Vebeha on ne trouve rien de plus beau que ce que l'on construit de ses mains, et le principal... c'est que çà fonctionne ;-)

Maitre_vebeha.jpg


Bonne Soirée, l'avant dernière de 2003 !
@+Thierry
 
A

Arsene

Guest
Quelle grande sagesse ce maître Vébeha! ^^
Oui bon c'est vrai... c'est pas forcemment optimisé, mais ça fonctionne très bien, et ma boucle "while" est mieux que ta "boucle" for je te signale, car moi je teste jusqu'à ce que je trouve une valeur identique, alors que toi tu boucles encore et encore même si tu a trouvé une occurence, ce qui fait que sur une liste comportant beaucoup d'éléments tu vas faire beaucoup de comparaisons, et la complexité de ton algo est donc plus grande que la mienne en moyenne! héhé ;)

Mais je m'égare, et je suis loin de pouvoir te donner des leçons, donc on va dire que tu as raison, et que ce que je viens de dire n'est que fadèses et billevesées! lol

Amicalement, à très bientôt et bonné année bien sûr!
 

Discussions similaires

Réponses
9
Affichages
716

Membres actuellement en ligne

Statistiques des forums

Discussions
312 677
Messages
2 090 824
Membres
104 677
dernier inscrit
soufiane12