Vérifier si un élément est selectionné dans une listbox
Bonjour,
J'aimerai pouvoir faire une action uniquement pour les éléments qui sont sélectionnés dans ma listbox. Cependant, quand je lance mon programme l'action se fait pour tous les éléments présents dans ma listbox ...
Voici mon code :
Private Sub CommandButton1_Click() 'Validation
Dim cel As Range
Dim lig As Long
Dim n As Integer
Dim c As Integer
On Error Resume Next
n = ListBox1.ListCount - 1 'nombre d'élément dans ListBox1
With Sheets("Historique reservations")
For Each cel In .Range("A2:A" & Sheets("Historique reservations").Range("A" & Sheets("Historique reservations").Rows.Count).End(xlUp).Row)
If CStr(cel.Offset(0, 1).Value) = ComboBox1 And cel.Offset(0, 15).Value <> "Oui" Then
If cel.Offset(0, 2).Value = "Interne" Then
For i = 0 To n ' pour tous les éléments de la listbox
If ListBox1.Selected(i) = True And cel.Offset(0, 4).Value = ListBox1.List(i).Value Then ' si l'élément est sélectionné, et ...
MsgBox ListBox1.List(i)
cel.Offset(0, 11).Value = TextBox6.Value 'Date de réception réelle
cel.Offset(0, 15).Value = "Oui" 'location finie
cel.Offset(0, 14).Value = DateDiff("w", cel.Offset(0, 7), TextBox6) 'Duree location
End If
Next i
End If
End if
Next
End with
End subLe problème vient probablement de la syntaxe de : If ListBox1.Selected(i) = True 'blabla' Then
Si quelqu'un à la solution à mon problème je suis preneuse !
Bonjour,
Je n'ai pas trouvé grand chose à corriger:
Private Sub CommandButton1_Click() 'Validation
Dim cel As Range
Dim lig As Long
Dim n As Integer
Dim c As Integer
On Error Resume Next
n = ListBox1.ListCount - 1 'nombre d'élément dans ListBox1
With Sheets("Historique reservations")
For Each cel In .Range("A2:A" & .Range("A" & .Rows.Count).End(xlUp).Row)
If CStr(cel.Offset(0, 1).Value) = ComboBox1 And cel.Offset(0, 15).Value <> "Oui" Then
If cel.Offset(0, 2).Value = "Interne" Then
For i = 0 To n ' pour tous les éléments de la listbox
If ListBox1.Selected(i) = True And cel.Offset(0, 4).Value = ListBox1.List(i).Value Then ' si l'élément est sélectionné, et ...
MsgBox ListBox1.List(i)
cel.Offset(0, 11).Value = TextBox6.Value 'Date de réception réelle
cel.Offset(0, 15).Value = "Oui" 'location finie
cel.Offset(0, 14).Value = DateDiff("w", cel.Offset(0, 7), TextBox6) 'Duree location
End If
Next i
End If
End If
Next cel
End With
End SubJ'ai juste enlevé les sheets("historique reservations") qui ne servaient pas et mis les bonnes tabulations, mais pas de vrais changements au niveau du code, le seul souci que je peux voir c'est si tu rencontres une erreur au niveau du test, car le code passera à la ligne suivante à cause du "On error resume next", il faut voir qu'est-ce qui provoque ton erreur et tenter de l'éviter, ou gérer l'erreur différemment en écrivant par exemple:
Private Sub CommandButton1_Click() 'Validation
Dim cel As Range
Dim lig As Long
Dim n As Integer
Dim c As Integer
On Error GoTo suite
n = ListBox1.ListCount - 1 'nombre d'élément dans ListBox1
With Sheets("Historique reservations")
For Each cel In .Range("A2:A" & .Range("A" & .Rows.Count).End(xlUp).Row)
If CStr(cel.Offset(0, 1).Value) = ComboBox1 And cel.Offset(0, 15).Value <> "Oui" Then
If cel.Offset(0, 2).Value = "Interne" Then
For i = 0 To n ' pour tous les éléments de la listbox
If ListBox1.Selected(i) = True And cel.Offset(0, 4).Value = ListBox1.List(i).Value Then ' si l'élément est sélectionné, et ...
MsgBox ListBox1.List(i)
cel.Offset(0, 11).Value = TextBox6.Value 'Date de réception réelle
cel.Offset(0, 15).Value = "Oui" 'location finie
cel.Offset(0, 14).Value = DateDiff("w", cel.Offset(0, 7), TextBox6) 'Duree location
End If
suite:
Next i
End If
End If
Next cel
End With
End SubIl faut quand même vérifier la partie List(i).value, voir si elle ne génère pas une erreur à chaque valeur de i en mode débogage pas à pas, je ne suis pas sûr que List ait une propriété value par exemple, ou peut-être que List(i) pose probl-me à cause du i, ce qui m'étonnerait mais sait-on jamais, le débogage est là pour ça.
Bonjour, merci pour ce retour !
Effectivement lorsque j'enlève "On error resume Next" Une erreur 424 : objet requis survient à la ligne :
If ListBox1.Selected(i) = True And cel.Offset(0, 4).Value = ListBox1.List(i).Value Then...
Bonjour …
à tester avec ListBox1.List(i, 0)
Dim R As Range, n As Integer, i As Integer
n = ListBox1.ListCount - 1
With Sheets("Historique reservations")
For Each R In .Range("A2:A" & .Range("A" & .Rows.Count).End(xlUp).Row)
If R(1, 2).Text = ComboBox1 And R(1, 16) <> "Oui" And R(1, 3) = "Interne" Then
For i = 0 To n
If ListBox1.Selected(i) And R(1, 5) = ListBox1.List(i, 0) Then
R(1, 12).Value = TextBox6.Value
R(1, 16).Value = "Oui"
R(1, 15).Value = DateDiff("w", R(1, 8), TextBox6)
End If
Next
End If
Next
End WithNota : cela fait très longtemps que j’évite les .Offset( , )Bonjour, merci pour ce retour !
Effectivement lorsque j'enlève "
On error resume Next" Une erreur 424 : objet requis survient à la ligne :
If ListBox1.Selected(i) = True And cel.Offset(0, 4).Value = ListBox1.List(i).Value Then...
Bonjour,
quand tu utilises un espion sur ListBox1, est-ce que ça te retourne bien un contrôle? quand tu fais appel à cel, est-ce que tu as bien un Range, quand tu fais appel à ListBox.List, est-ce que ça te retourne bien quelque chose? quand ça te met objet requis c'est que tu fais appel à quelque chose qui n'existe pas, il y a donc une de tes variable objet qui est vide. Il faut donc vérifier que ListBox1 existe bien, que cel est bien déclaré et contient quelque chose, et que la List peut bien se faire appeler (voir si elle ne serait pas vide quand ça crée l'erreur).
D'accord , je ne sais pas trop comment fonctionne l'espion ..Mais pour Listbox1 j'ai réussi.
Après avoir fait tourné mon code j'obtiens ça :
Donc là j'en conclu que ma valeur est vide c'est ça ?
Pourtant dans mon useform2 ma Listbox1 n'est pas vide, et j'ai un élément de sélectionné ... :
Donc je ne sais pas quoi en déduire ...
Bonjour,
ah on avance, on semble donc bien avoir un problème avec ListBox1, peut-être le nom qui n'est pas bon? Difficile à dire avec les screen, pour moi la syntaxe de selected est bonne, quand tu vas regarder ListBox1.List et ListBox1.ListCount, est-ce que List t'affiche quelque chose si tu développes en cliquant sur +? est-ce que listcount est supérieur à 0? J'ai l'impression que ton contrôle est vide dans le code, c'est étrange mais c'est la seule piste que l'on a pour le moment, autre chose, quand tu regardes tes valeurs, est-ce que tu te situes bien dans la boucle en mode pas à pas? si la valeur de i n'est pas affectée tu ne peux pas lire ces valeurs.
Rajoute le test If Listbox1.ListCount > 0 avant de lancer la boucle, ça évitera d'aller parcourir une liste vide et nous garantira qu'elle ne l'est pas, j'ai testé les lignes sur une listbox qui n'est pas vide et je n'ai aucun problème, je joins le fichier, pas d'erreur de syntaxe donc, ça doit bel et bien être la liste qui est vide, du moins celle que tu appelles... c'est la seule piste que je vois pour le moment.
Rebonjour,
je crois avoir trouvé le problème,
sur le code VBA que tu nous avais transmis tu avais écris :
n = ListBox1.ListCount - 1mais dans le code je trouve:
n = ListBox1.ListCountQuand il y a 10 éléments dans la liste, le plantage arrive pour n = 11, car une ListBox a son premier élément à l'indice 0, quand je mets -1 ça ne pose plus de problème, si tu modifies ça de ton côté ça marche également?
d'accord merci , là ça marche !
mais du coup il faut que je parts de i = 0 non ? parce que du coup j'avais changé pour i =1...
Re
En principe je ne réponds pas quand mon code foire dans un contexte particulier que je ne connais pas. Au début, je propose une idée à adapter !
On ne peut gérer correctement que si le contexte donné est précis.
On ne sait même pas comment le contrôle ListBox est initialisé !
Ausecour (salut), je me méfie de .List(i) surtout avec plus d’une colonne.
qu’obtient-on dans chacun des cas (avec ton classeur et un bouton de plus)
Private Sub CommandButton1_Click()
For i = 0 To ListBox1.ListCount - 1
Range("C" & i + 2) = ""
If ListBox1.Selected(i) Then
If ListBox1.List(i) < 9 Then Range("C" & i + 2) = "c'est insuffisant"
End If
Next
End Sub
Private Sub CommandButton2_Click()
For i = 0 To ListBox1.ListCount - 1
Range("C" & i + 2) = ""
If ListBox1.Selected(i) Then
If ListBox1.List(i, 1) < 9 Then Range("C" & i + 2) = "c'est insuffisant"
End If
Next
End Sub
Proposition testée dans le fichier joint.d'accord merci , là ça marche !
mais du coup il faut que je parts de i = 0 non ? parce que du coup j'avais changé pour i =1...
Exactement il faut partir de i = 1, les listbox commencent par 0 pour le premier élément
Ausecour (salut), je me méfie de .List(i) surtout avec plus d’une colonne.
Quand il y a plusieurs colonnes et qu'on ne précise pas le numéro de colonne, cela nous renvoie la valeur à la colonne indiquée par "BoundColumn" si je ne me trompe pas, comme le numéro de colonne est facultatif ça fonctionne quoi qu'il arrive.
Bonjour,
Ausecour, merci beaucoup, ça fonctionne bien comme ça ! :)
Ordonc, Merci pour ce retour, mais je ne comprends pas ce que cela apporte de plus que ce que m'a dit Ausecour . Mais pas de souci! Mon problème est résolu ! merci à vous deux d'avoir voulu m'aider ! :)


