XL 2016 Résolu: Comportement bizarre Listbox avec liste dans Table vb

fanch55

XLDnaute Accro
Bonjour à Tous,
J'en appelle à la sagacité et l'oeil neuf de nos intervenants pour analyser le code ci-joint qui me laisse perplexe ... o_O

J'explique la problématique ( je tente d'aider un autre participant dans sa demande ) :

On charge une listbox à partir d'une variable Table(...,..) .
Cette listbox est une multiselect/multicolonnes .
La liste peut être longue, bien plus que la hauteur de la listbox.
Aussi l'idée est de ramener toutes les sélections en début de liste avant toute validation .

Dans le code, la listbox est donc chargée à partir de la variable Tbl .
A chaque sélection de ligne dans la listbox, donc dans l'événement Change ,
on reconstruit la variable Tbl en ramenant la ligne sélectionnée en haut de Table.
puis on recharge la listbox avec Tbl et on surligne ce qui a été sélectionné .

Problème:
tant que l'événement Change est en cours (semblerait-il) , la listbox n'est pas rafraîchie mais contient bien la bonne liste.
Énervant .... car si on la recharge par la suite (avec le bouton présent uniquement à cause de celà ), la listbox est correcte !!!

lbx.gif


1 Userform avec une listbox , un boutton et son code :
1589641529233.png

VB:
Dim Tbl()
Dim Sel

Private Sub UserForm_Activate()
    Nrows = 30
    With ListBox1
        .ColumnCount = 2
        .ColumnWidths = "40,60"
        ReDim Tbl(1 To Nrows, 1 To .ColumnCount)
    End With
    For i = 1 To Nrows
      Tbl(i, 1) = Format(Date + i - 1, "dddd")
      Tbl(i, 2) = Date + i - 1
    Next i

    Charge_Listbox
End Sub

Sub Charge_Listbox()
    With Me.ListBox1
       .Clear
       .List = Tbl
       .Enabled = False
       On Error Resume Next
        For i = 1 To Sel
            .Selected(i - 1) = True
        Next i
       .Enabled = True
    End With
End Sub

Private Sub CommandButton1_Click()
    Charge_Listbox
End Sub
Private Sub ListBox1_Change()
    With ListBox1
        If .Enabled Then
             S = 0
             For i = 1 To .ListCount
                 If .Selected(i - 1) Then
                     S = S + 1
                     For j = 1 To .ColumnCount
                         Tbl(S, j) = .List(i - 1, j - 1)
                     Next j
                 End If
             Next i
             Sel = S
             For i = 1 To .ListCount
                 If Not .Selected(i - 1) Then
                     S = S + 1
                     For j = 1 To .ColumnCount
                         Tbl(S, j) = .List(i - 1, j - 1)
                     Next j
                 End If
             Next i
             Charge_Listbox
        End If
    End With

End Sub

Private Sub UserForm_Initialize()
On Error Resume Next
With ActiveSheet.Shapes(Application.Caller)
    L = Application.Left + (Application.Width - Application.UsableWidth)
    T = Application.Top + (Application.Height - Application.UsableHeight)
    Me.Move .Left + L, .Top + .Height + T
End With
End Sub

1 Feuille avec un Shape pour lancer l'userform :
1589641707217.png
1589641644073.png



Le fichier en entier garanti sans malice .
Merci par avance à tous .
 

Pièces jointes

  • Lbx.xlsm
    22.9 KB · Affichages: 7

_Thierry

XLDnaute Barbatruc
Bonjour @fanch55 , le Forum

J'ai regardé, oui ce n''est pas évident, surtout qu'on ne capte plus l'évènement Click de la ListBox en multi-Select...
Tout sur l'évènement Change lui complique la vie à cette pauvre ListBox !

Un paliatif, (au bouton) "demander au demandeur" de DoubleClicker en ayant ajouté ceci :

VB:
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Charge_Listbox
End Sub

@+Thierry
 

_Thierry

XLDnaute Barbatruc
Bonsoir Job75 aussi

Oui je partage ton avis on cherche les ennuis..

Ou encore un autre paliatif, lui proposer une seconde ListBox "Tampon" où les choix viendraient s'incrémenter au fur et à mesure dans l'ordre...

Bien à vous
@+Thierry
 

fanch55

XLDnaute Accro
Bon, finalement,
pas de doubleclick, pas de .list = Table
mais reconstruction complète de la Listbox et à charge au Mouseup d'effectuer le travail.


Quelqu'un sait-il comment clore cette discussion, comme c'est moi qui l'ai créée, je ne peux pas me mettre en Solution :p
Merci pour vos contributions
 
Dernière édition:
Haut Bas