Aide sur code ?
Bonjour à tous
Je viens de créer un code mais je bloque sur un petit détail dont je vous résume.
Cela concerne un If, voilà je souhaite créer un message d'alerte en obligeant le renseignement de certains objets avant l'enregistrement des données.
Dans mon UF il y a une ListBox à choix multiples dont le renseignement est obligatoire mais je n'arrive pas à l'inclure dans mon code ci après.
J'ai réussi à faire ce code qui fonctionne très bien,
If ComboBox1 = "" Or ComboBox2 = "" Or ComboBox3 = "" Or ComboBox4 = "" Or TbHeureDeb = "" Or TbHeureFin = "" Then
MsgBox "Le repère * indique renseignement obligatoire.", vbOKOnly + vbInformation, "Information"
Exit Sub
End Ifj'ai bien tenté Or ListBox1-1 / Or ListBox1.Select="" mais ne marche.
J'aimerai l'alerte si rein n'ai sélectionné dans ListBox, svp.
Merci de votre aide.
Cdlt
Bonsoir,
La propriété Selected est celle utilisable pour définir les éléments sélectionnés dans une ListBox.
Généralement on l'utilise dans une boucle pour récupérer les éléments sélectionnés...
L'aide de VBA précise que cette propriété renvoie un tableau. Je tenterai donc de tester cette propriété avec une fonction comme Match en recherchant True, s'il n'y en a pas Match renvoie une erreur...
Sous réserve de test...
Cordialement.
Bonsoir,
Personnellement lorsque je veux voir si une Listbox est vide, j'utilise toujours ListBox.ListIndex = -1 qui permet de signaler qu'il n'y a aucune valeur dans la ListBox ou que celle-ci ne fait pas parti des valeurs prédéfinies.
En espérant t'avoir aidé.
Bonne soirée
Bonsoir sharney,
Oui pour une ListBox unisélection, ListIndex est inopérant pour une multisélection/
Bonjour MFerrand et Sharney
Merci de vous êtes arrêté sur mon post et d'y avoir proposé des solutions.
En suivant vos conseils et un peu aide sur internet je suis arrivé à une solution qui fonctionne, en espèrant n'avoir pas trop fais d'erreur.
J'ai fais un For CptLb = 0 To (ListBox1.Lis.......... / Next CptLb que j'ai inclus dans mon bouton CommandButton1_Click, mais avant il fallait mettre dans Initialize ceci :
Private Sub UserForm_Initialize()
ListBox1.ListIndex = -1
End Subet ensuite mon code :
'Bouton Valider, enregistre les infos du formulaire dans feuille "Enrg Mouvts"
Private Sub CommandButton1_Click()
Dim num As Long 'N° de la ligne
Dim i, J As Integer
Dim Lg
Dim CptLb As Single
'Si les parties avec le repère * n'est pas renseigné alors message d'alerte
If ComboBox1 = "" Or ComboBox2 = "" Or ComboBox3 = "" Or ComboBox4 = "" Or TbHeureDeb = "" Or TbHeureFin = "" Then
MsgBox "Le repère * indique renseignement obligatoire.", vbOKOnly + vbInformation, "Information"
Exit Sub
End If
'Si aucune sélection dans ListBox alors message d'alerte
For CptLb = 0 To (ListBox1.ListCount - 1)
If ListBox1.ListIndex = -1 Then
MsgBox "Sélectionnez au moins un nom.", vbOKOnly + vbInformation, "Information"
Exit Sub
End If
Next CptLb
'Si tout est renseigné, un message de confirmation s'affiche
If MsgBox("Confirmez-vous cet enregistrement ?", vbYesNo, "Demande de confirmation") = vbNo Then
Exit Sub
Else
With Sheets("Enrg Mouvts")
num = Sheets("Enrg Mouvts").Range("A65536").End(xlUp).Row + 1
For Lg = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(Lg) = True Then
.Range("A" & num).Value = CDate(TextBox1)
.Range("B" & num).Value = TextBox2
.Range("C" & num).Value = ComboBox1
.Range("D" & num).Value = ComboBox2
.Range("E" & num).Value = ComboBox3
.Range("F" & num).Value = Format(Me.TbHeureDeb.Value, "hh:mm")
.Range("G" & num).Value = Format(Me.TbHeureFin.Value, "hh:mm")
.Range("I" & num).Value = ComboBox4
.Range("J" & num).Value = ListBox1.List(Lg)
.Range("K" & num).Value = TextBox8
num = num + 1
End If
Next
If MsgBox("Voulez-vous faire un autre mouvement ?", vbYesNo) = vbYes Then
Unload Me
UF_Formation.Show
TextBox2 = Time
Else
Unload Me
End If
End With
End If
End Subvoilà mon chef d'œuvre que je partage avec plaisir, si ça peu aider.
Cdlt
Salut,
Je suis sceptique sur ton test s'agissant de ListBox à miultisélection (Multiselect = True). Seule la propriété Selected indique l'élément est sélectionné ou non.
Mais tu verras bien...
Re
Sceptique !! C'est à dire ?
Le ListBox1.ListIndex = -1 ne conviendrai pas ?
Que ferai tu toi de ton côté comme code ?
Bonsoir,
En reprenant ton dernier code de test :
For CptLb = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(CptLb) Then Exit For
Next CptLb
If CptLb >= ListBox1.ListCount Then
MsgBox "Sélectionnez au moins un nom.", vbOKOnly + vbInformation, "Information"
Exit Sub
End IfDans mon post précédent sur ton sujet, j'avais évoqué (avec prudence !!!) l'idée d'essayer de tester cette propriété en tant que tableau, mais après quelques recherches et tests infructueux, il semble (sauf peut-être sous Access) qu'il n'y ait pas d'autre moyen que de défiler les éléments pour voir s'il y en a de sélectionné.
Dans une ListBox multisélection, ListIndex ne prend pas la valeur de l'élément sélectionné, mais de la ligne qui le focus,et Value prend la valeur Null. C'est la propriété Selected qui permet de savoir quels sont les éléments sélectionnés.
J'ai supprimé tes parenthèses sur la ligne For... (pas la peine d'en abuser quand rien n'est à isoler). On teste la propriété Selected de chaque élément, dès qu'elle renvoie True on sort de la boucle et on teste la valeur de CptLb : s'il n'y a pas d'élément sélectionné elle a été jusqu'au bout et la dernière valeur ListCount-1 a été incrémentée, elle a donc atteint ListCount...
Cordialement.
Bonjour
Effectivement, tu l'a bien précisé précédemment, je l'avais essayé mais mal positionné dans mon code, c'est bien à moi que reviens l'erreur.
Je viens de tester ton code et ça marche très bien, merci pour tout.
Pour moi tout est bon donc peu mettre résolu.
Bonne continuation
Cdlt.