Séléction ListBox - Débogage
Bonjour à tous,
Je dispose d'un UserForm munit de ComboBox en cascade. Une fois la sélection faite dans les ComboBox, une ListBox s'affiche. Après sélection et clic sur un bouton, les valeurs sélectionnées sont implémenté dans un onglet "historique ".
Le code fonctionne bien, sauf quand l'utilisateur ne sélectionne rien dans la ListBox. J'aimerai que lorsqu'il ne sélectionne rien, un message s'affiche, et qu'aucune copie ne soit effectuée. Voici, une partie du code permettant la copie des valeurs vers l'historique. Je pense qu'il y a un problème dans la définition des conditions de la ListBox:
'IMPLEMENTATION HISTORIQUE
Private Sub CommandButton1_Click() 'Bouton valider
If ComboBox1.Value = "" Or ComboBox2.Value = "" Or ComboBox4.Value = "" Or ListBox1.ListIndex = -1 Or OptionButton1 = False And OptionButton2 = False Then
MsgBox "Veuillez remplir tous les champs"
Else: Dim lig As Long
With Sheets("Historique ").Range("B" & Rows.Count).Rows.AutoFit
lig = Sheets("Historique ").Range("B" & Rows.Count).End(xlUp).Row + 1
Sheets("Historique ").Range("B" & lig).Value = ComboBox1.Value
Sheets("Historique ").Range("C" & lig).Value = ComboBox2.Value
Sheets("Historique ").Range("E" & lig).Value = ComboBox4.Value
Sheets("Historique ").Range("F" & lig).Value = TextBox1.Value
Sheets("Historique ").Range("H" & lig).Value = TextBox2.Value
End With
If OptionButton1 = True Then
Sheets("Historique ").Range("G" & lig).Value = "Résolu"
End If
If OptionButton2 = True Then
Sheets("Historique ").Range("G" & lig).Value = "Irrésolu"
End If
For i = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(i) = True Then
Texte = Texte & ListBox1.List(i) & Chr(10)
End If
Next i
If ListBox1.ListIndex = -1 Then
MsgBox "Merci de remplir tous les champs"
Else: Sheets("Historique ").Range("D" & lig) = Left(Texte, Len(Texte) - 1)
With Sheets("Historique ").Range("B" & Rows.Count).Rows.AutoFit
End With
ThisWorkbook.Save
If TextBox3.Value = "..." And OptionButton2 = True Then
MsgBox "TEST"
Else: MsgBox "TEST 2"
End If
End If
End If
End SubLe débogage intervient sur la ligne suivante:
Else: Sheets("Historique ").Range("D" & lig) = Left(Texte, Len(Texte) - 1)En espérant avoir été clair, merci par avance de votre aide
Bonjour,
Les conditions du message sont bien indiqués dans ton vba mais tu ne dis pas quoi faire ensuite :
If ComboBox1.Value = "" Or ComboBox2.Value = "" Or ComboBox4.Value = "" Or ListBox1.ListIndex = -1 Or OptionButton1 = False And OptionButton2 = False Then
MsgBox "Veuillez remplir tous les champs", ,"test"
Exit subLe Exit sub si toutes les cases ne sont pas renseignées il est ou ?
D'ailleurs je mettrai même pas un Else après juste un end if.
Après le code continu normalement si la première condition est ok.
C'est exact, je te remercie. Par ailleurs, même après cette modification : lorsque je ne sélectionne rien dans la ListBox, j'ai une erreur d’exécution "5" (argument ou appel de procédure incorrect). Le débogueur me renvoi à cette ligne :
Else: Sheets("Historique ").Range("D" & lig) = Left(Texte, Len(Texte) - 1)Et même avec l'Exit Sub, si je sélectionne tout sauf la ListBox, tout se copie avec un vide en colonne D (celle destinée à la copie de la ListBox).
Je pense que c'est le And
And OptionButton2 = False
Tu as mis que des "or" alors pourquoi And à ce moment
Tu n'aurais pas un fichier test avec les infos personnelles en moins ?
Fais un arrêt sur exit sub et juste avant écris :
x=Listbox1.listIndex
pour vérifier que la valeur est bien égale à -1
Un des OptionButton est destiné à copier "Résolu" en colonne "G", et l'autre à copier "Irrésolu". D'où le "And", car il faut forcément que l'un des deux soit sélectionné. Si je met "Or", le code s'arrête à l'Exit Sub.
Malheureusement, ça risque d'être compliqué pour un fichier test, la base de données est monstre et l'intégralité du code serait à modifier
Faire un arrêt sur Exit Sub ? Qu'entends-tu par là ? J'ai bien ajouté "x=Listbox1.listIndex" avant l'Exit, mais rien n'y fait.. Lorsque je ne sectionne rien dans la ListBox, le débogueur me renvoi toujours à la même ligne. Elle semble pourtant correcte:
Else: Sheets("Historique ").Range("D" & lig) = Left(Texte, Len(Texte) - 1)Ne vois-tu pas une erreur dans les lignes ci-dessous ?
For i = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(i) = True Then
Texte = Texte & ListBox1.List(i) & Chr(10)
End If
Next i
If ListBox1.ListIndex = -1 Then
MsgBox "Merci de remplir tous les champs"
Else: Sheets("Historique ").Range("D" & lig) = Left(Texte, Len(Texte) - 1)
With Sheets("Historique ").Range("B" & Rows.Count).Rows.AutoFit
End WithMême en répétant la condition de la sélection, toujours ce même problème.
Si non, je peux éventuellement renommer le sujet: "Obligation de sélection ListBox".
Merci par avance de ton retour.
Re bonjour,
Peut être en séparant la condition de la listbox pour la mettre en premier ? un peu comme ceci :
Private Sub CommandButton1_Click() 'Bouton valider
if ListBox1.ListIndex = -1 then
MsgBox "Veuillez faire une sélection dans la liste"
Exit sub
End if
If ComboBox1.Value = "" Or ComboBox2.Value = "" Or ComboBox4.Value = "" Or OptionButton1 = False And OptionButton2 = False Then
MsgBox "Veuillez remplir tous les champs"
Else: Dim lig As Long
With Sheets("Historique ").Range("B" & Rows.Count).Rows.AutoFit
lig = Sheets("Historique ").Range("B" & Rows.Count).End(xlUp).Row + 1
Sheets("Historique ").Range("B" & lig).Value = ComboBox1.Value
Sheets("Historique ").Range("C" & lig).Value = ComboBox2.Value
Sheets("Historique ").Range("E" & lig).Value = ComboBox4.Value
Sheets("Historique ").Range("F" & lig).Value = TextBox1.Value
Sheets("Historique ").Range("H" & lig).Value = TextBox2.Value
End With
If OptionButton1 = True Then
Sheets("Historique ").Range("G" & lig).Value = "Résolu"
End If
If OptionButton2 = True Then
Sheets("Historique ").Range("G" & lig).Value = "Irrésolu"
End If
For i = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(i) = True Then
Texte = Texte & ListBox1.List(i) & Chr(10)
End If
Next i
If ListBox1.ListIndex = -1 Then
MsgBox "Merci de remplir tous les champs"
Else: Sheets("Historique ").Range("D" & lig) = Left(Texte, Len(Texte) - 1)
With Sheets("Historique ").Range("B" & Rows.Count).Rows.AutoFit
End With
ThisWorkbook.Save
If TextBox3.Value = "..." And OptionButton2 = True Then
MsgBox "TEST"
Else: MsgBox "TEST 2"
End If
End If
End IfL'idée était bien, mais me renvoyait toujours à la même erreur. J'ai fini par réussir en bricolant un petit peu sur tout. Pour finir, j'ai mi la valeur de la ListIndex à 0, surprenant mais ça fonctionne. Voilà ce que ça donne:
Private Sub CommandButton1_Click() 'Bouton valider
If ListBox1.ListIndex = 0 Or ComboBox1.Value = "" Or ComboBox2.Value = "" Or ComboBox4.Value = "" Or OptionButton1 = False And OptionButton2 = False Then
MsgBox "Veuillez remplir tous les champs"
Exit Sub
Else: Dim lig As Long
With Sheets("Historique ").Range("B" & Rows.Count).Rows.AutoFit
lig = Sheets("Historique ").Range("B" & Rows.Count).End(xlUp).Row + 1
Sheets("Historique ").Range("B" & lig).Value = ComboBox1.Value
Sheets("Historique ").Range("C" & lig).Value = ComboBox2.Value
Sheets("Historique ").Range("E" & lig).Value = ComboBox4.Value
Sheets("Historique ").Range("F" & lig).Value = TextBox1.Value
Sheets("Historique ").Range("H" & lig).Value = TextBox2.Value
End With
If OptionButton1 = True Then
Sheets("Historique ").Range("G" & lig).Value = "Résolu"
End If
If OptionButton2 = True Then
Sheets("Historique ").Range("G" & lig).Value = "Irrésolu"
End If
For i = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(i) = True Then
Texte = Texte & ListBox1.List(i) & Chr(10)
End If
Next i
Sheets("Historique ").Range("D" & lig) = Left(Texte, Len(Texte) - 1)
With Sheets("Historique ").Range("B" & Rows.Count).Rows.AutoFit
End With
ThisWorkbook.SaveMerci d'avoir pris du temps pour m'aider en tout cas, et pour le Exit Sub
C'est pour çà que je voulais dans un message précédent tester la valeur
x=listbox1.Listindex.value
un mettant une pause juste aprés pour lire la valeur. ( pause = clic dans la marge lors de la saisie des codes vba --> point couleur marron ) pour faire un arrêt à cette endroit lors des tests.
Ah d'accord, je n'avais pas mi le "value" derrière, et j'ignorais comment faire la pause.
Cependant, je pensais qu'en ListBox, le -1 obligeait la sélection d'une ou plusieurs valeur, et que le 0 obligeait la sélection d'une seule et même valeur.
Ah d'accord, je n'avais pas mi le "value" derrière, et j'ignorais comment faire la pause.
Cependant, je pensais qu'en ListBox, le -1 obligeait la sélection d'une ou plusieurs valeur, et que le 0 obligeait la sélection d'une seule et même valeur.
Re, non le -1 c'est pour vérifier que la listebox n'est pas vide. cela ne veut pas dire pour autant que la sélection
dans la liste est effectuée.