[VBA] Listbox avec sélection conditionnelle ?

micaub

XLDnaute Nouveau
Bonjour à tous.

Dans le cadre du suivi de risque d'un projet, j'ai tenté de programmer le remplissage d'un tableau en VBA avec l'aide d'un Userform. Dans le lot, j'ai rajouté une listbox "Produits concernés" (qui se remplit en fonction d'une colonne d'un tableau) et pour laquelle j'ai permis la sélection multiple.
Toutefois, je me demandai s'il était possible de rajouter une condition : ainsi, je voudrai empêcher que l'on puisse cliquer sur certains produits et sur "Tous" en même temps. Pour cela, il faudrait :
- soit une condition qui bloque la macro et affiche un message d'erreur si "Tous" et une autre case ont été cochées.
- soit faire en sorte que lorsque l'on clique sur "Tous", cela décoche l'ensemble des autres produits, et inversement que lorsque l'on clique sur un produit quelconque, cela décoche tous.

Mais je ne sais pas du tout si c'est réalisable... :confused:
Je suis encore totalement novice dans la programmation VBA et sans l'aide de nombreuses personnes parmis vous, je crois que je n'aurais jamais pu avancer. Mais malgré mes dernières recherches, je n'ai pas réussi à trouver la solution à mon problème. Probablement un manque d'expérience...

D'avance merci à tous ceux qui se seront donné la peine de lire mon post. :D

Cordialement.

MA

PJ : Une version simplifiée de mon prog pour présenter mon problème.
 

Pièces jointes

  • SuiviRisque_exemple.xls
    43.5 KB · Affichages: 277

jp14

XLDnaute Barbatruc
Re : [VBA] Listbox avec sélection conditionnelle ?

Bonjour

Ci dessous un code à tester.

Code:
Private Sub ListeProduits_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim i As Byte
Dim j As Byte
With ListeProduits
If .MultiSelect > 0 Then ' si on a la multiselection
    For i = 0 To .ListCount - 1 ' on compte le nombre de sélection
        If .Selected(i) = True Then j = j + 1
    Next i
        ' si tout est sélectionné
        If j = .ListCount Or j = .ListCount - 1 Then
            'alors on affiche un message
            Call MsgBox("Vous devez cocher ""Tous""" _
                        & vbCrLf & "" _
                        , vbInformation, Application.Name)
            ' et on supprime les sélections
            For i = 0 To .ListCount - 1
            .Selected(i) = False
            Next i
            Exit Sub
        End If
        ' si "tous" est sélectionné en dernière position
        If .Selected(.ListCount - 1) = True Then
            ' on supprime la multisélection et se positionne sur tous
            .MultiSelect = 0
            .ListStyle = 0
            .ListIndex = .ListCount - 1
        End If
Else
' si pas de multisélection
    If .ListIndex = .ListCount - 1 Then Exit Sub
    ' si pas de multisélection et si on change le produit sélectionné
    ' on rétablit la multisélection
    j = .ListIndex
    .MultiSelect = fmMultiSelectMulti
    .ListStyle = fmListStyleOption
    ' on coche le produit
    .Selected(j) = True
End If
End With
End Sub

JP
 

micaub

XLDnaute Nouveau
Re : [VBA] Listbox avec sélection conditionnelle ?

Je te remercie sincèrement jp14.

J'ai un peu adapté le programme et tenté de le comprendre : c'était pas évident pour moi ^^ Mais dans l'ensemble, il fait exactement tout ce que je voulais.

Je me posais juste une dernière question, d'ordre purement esthétique : est-il possible de garder la forme "case à cocher" dans une listbox lorsque l'on n'est pas en sélection multiple, au lieu des rond de sélection (je ne sais pas exactement comment on les appelle) ?

En tout cas, encore merci pour l'aide.

A bientôt.

MA
 

jp14

XLDnaute Barbatruc
Re : [VBA] Listbox avec sélection conditionnelle ?

Bonjour

Eventuellement une modification à apporter
Code:
................................
For i = 0 To .ListCount [COLOR="Red"]- 2 [/COLOR]' on compte le nombre de sélection
        [COLOR="Red"]If .Selected(i) = True Then j = j + 1[/COLOR]
    Next i
        ' si tout est sélectionné
        If j = .ListCount  Then
...............................
Pour ne pas tenir compte de "tous" lors du comptage.

Code à rajouter pour éviter des erreurs
Code:
Dim j As Byte
With ListeProduits
[COLOR="Red"]If .ListIndex = -1 Then Exit Sub[/COLOR]

Cette combinaison donne des ronds
ListeProduits.MultiSelect = 0
ListeProduits.ListStyle = 1
.ListStyle ne peut prendre que 2 valeurs 0 et 1


JP
 
Dernière édition:

Discussions similaires

Réponses
9
Affichages
153
Réponses
8
Affichages
330
Réponses
26
Affichages
377

Statistiques des forums

Discussions
312 177
Messages
2 085 971
Membres
103 073
dernier inscrit
MSCHOE16