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 sub

Le 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 Sub

J'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 Sub

Il 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 With
Nota : cela fait très longtemps que j’évite les .Offset( , )

Bonjour, et bien malheureusement cela ne fonctionne pas non plus ..

J'ai l'erreur suivante qui s'affiche :

capture8

au niveau de la ligne : If ListBox1.Selected(i) And cel(1, 5) = ListBox1.List(i, 0) Then

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 :

capture12

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é ... :

capture13

Donc je ne sais pas quoi en déduire ...

Je crois avoir trouvé le problème !

capture14

Par contre je ne sais pas quoi en déduire non plus, est ce que c'est la syntaxe qui est erronée?

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.

30classeur1.xlsm (13.79 Ko)

Alors mon n correspond à ListBox1.ListCount, et n'est pas nul!

voici les espions demandés :

capture16

je vous joints également mon fichier, ça sera surement plus simple ...

Le code se trouve dans l'useform2, dans le code CommandButton1_Click(). qui s'active quand le bouton valider est activé

Rebonjour,

je crois avoir trouvé le problème,

sur le code VBA que tu nous avais transmis tu avais écris :

n = ListBox1.ListCount - 1

mais dans le code je trouve:

n = ListBox1.ListCount

Quand 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
40listbox-list.xlsm (18.99 Ko)
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 ! :)

Rechercher des sujets similaires à "verifier element selectionne listbox"