ListBox pas très docile

Bonjour le forum,

bonjour les cracks,

un nouveau problème, si pas un mystère pour moi, m'amène vous demander votre avis éclairé.

Dans le projet ci-joint pour un de nos hôtes, j'exécute (enfin, j'aimerais! ) des tris en cascade avec affichage dans une unique ListBox.

  • d'abord, les pays différents en BDD, colonne A ;
  • ensuite les banques différentes selon le choix du pays en BDD, colonne B ;
  • et enfin, les codes BIC différents selon le choix de la banque du pays, toujours en BDD, colonne C.

Simple, me direz-vous, sauf que, après avoir obéi pour les pays, la ListBox ne veut plus remplir son office dès le deuxième tri alors même, que, manifestement, le tableau destiné à recevoir les données les reçoit bien, les MsgBox disséminés dans la procédure ci-dessous me les renseignant correctement.

Public Sub CalculTab(ByVal iFlag As Integer)
'
Dim tMulti
Dim tTab()
'
Application.EnableEvents = False
'
With Worksheets("BDD")
    iRow = .Range("A" & Rows.Count).End(xlUp).Row
    If iFlag = 1 Then
        sFlag = "A"
        iFlag1 = 1
    Else
        sFlag = IIf(iFlag = 2, "B", "C")
        iFlag1 = IIf(iFlag = 2, 2, 3)
    End If
    tMulti = .Range("A2:" & sFlag & iRow)
End With
'
iUB = 1
ReDim Preserve tTab(iUB)
iFlag2 = 0
'
For x = 2 To iRow - 1
    iOK = 1
    Select Case iFlag
        Case 2
            iOK = IIf(tMulti(x, 1) = Cells([AAA1], 1), 1, 0)
        Case 3
            iOK = IIf(tMulti(x, 1) = Cells([AAA1], 1) And tMulti(x, 2) = Cells([AAA1], 2), 1, 0)
    End Select
    If iOK = 1 Then
        iTemp = 0
        For y = 0 To UBound(tTab) - 1
            If Trim(tMulti(x, iFlag1)) = tTab(y) Then
                iTemp = 1
                Exit For
            End If
        Next
        If iTemp = 0 Then
            If iFlag2 = 1 Then
                iUB = iUB + 1
                ReDim Preserve tTab(iUB)
            End If
            iFlag2 = 1
            tTab(iUB - 1) = Trim(tMulti(x, iFlag1))
            MsgBox tTab(iUB - 1)
        End If
    End If
Next
'
Me.lstMulti.Clear
Me.lstMulti.List = tTab
Me.lstMulti.Height = iUB * 16
Me.lstMulti.Visible = True
'
Application.EnableEvents = True
'
End Sub

Si vous connaissez le truc que je ne connais pas sur les ListBox ou si vous décelez mon erreur, je vous serais très reconnaissant de partager vos lumières!

A+

14multilist.xlsm (29.80 Ko)

Bonsoir,

Je ne comprends pas ce que tu fais, et dès lors je ne vois pas où est le problème ! Et il est tard pour se concentrer !

Pas compris ce que tu mets dans ta Listbox : tu as l'air de dire que tu mets à la suite pays, banques et BIC ! Ça me paraît curieux.

Et pourquoi des tris, ta base est triée non ? Sinon on la trie sur place.

Je crois avoir compris que tu affiche la liste des pays : ça, ça se lance de l'extérieur de la LBox. Un filtrage avancé des pays me semble une des méthodes les plus rapide...

Ensuite tu cliques dans la LBox. Cela implique que tu aies un indicateur qui te permet de savoir sur quoi tu cliques : Pays, Banques ou autres, à tout moment. Tu cliques un pays : ta base étant triée, tu peux facilement cibler la plage banques du pays, et pareil en faire un filtrage avancé qui te fournit la liste à substituer.

Même chose pour la 3e phase.

D'où j'ai du mal à percer comment tu procèdes et ça me paraît compliqué.

Cordialement.

Bonjour le forum,

Bonjour MFerrand,

merci d'avoir déjà jeté un oeil!

Au-delà de l'apparente complexité (pur exercice pour moi! J'avoue ne pas avoir cherché d'autres voies!) du code, le problème est l'affichage des 2e et 3e tris (banques, BIC) dans la LBox.

En chipotant, j'ai trouvé ceci:

  • après le 2e tri, ListBox vide donc, je passe en mode création, je change la BackColor de la LBox, je repasse sur la feuille Base... les données sont là, permettant le clic...
  • 3e tri, même chose!

J'ai évidemment essayé cette ânerie dans le code, directement! Marche pas!

Bref! Beau blocage!

Merci à vous qui vous penchez sur cette petite énigme!

A+

17multilist.xlsm (30.79 Ko)

Salut !

Là j'ai pas le temps de voir... J'avais essayé de rejeter un oeil au réveil mais j'ai abandonné après avoir commencé par ta SelectionChange (sur la feuille Base, vide !) alors qu'elle paraîtrait devoir être sur BDD, car ça me paraissait une énigme de démarrer sur un tel évènement...

Laisse tomber les accessoires (colorations, etc.), tu auras le temps de décorer ensuite, pour te concentrer sur le fil directeur des enchainements, où je ne vois pas sur quoi tu butes... Et je comprends pas pourquoi tu insistes sur la notion de tris, alors qu'un tri sur les 3 colonnes de la base doit être fait au départ et il n'y a plus à y revenir, tes listes seront nécessairement ordonnées sans autre tri !

Cordialement.

Bonjour MFerrand,

notre hôte utilisera les résultats de ces LBox sur d'autres feuilles que BDD! Ne me demande pas à quoi ça sert, je n'en sais rien!

Donc, un clic dans Base (nom donné par moi, par hasard!) déclenchera la macro qui affichera ses résultats (Pays, Banque, Bic) sur ABC de la ligne sélectionnée (d'où coloration de la ligne).

Alors, oui, BDD est triée mais tu remarqueras que certaines banques sont reprises plusieurs fois par pays car ayant plusieurs codes BIC.

Ma macro trie donc le bon grain de l'ivraie en ne reprenant ces banques qu'une seule fois, but de la manoeuvre!

Le problème, encore une fois, n'est pas le code en lui-même (Omnibus viis Romam pervenitur) mais le non-affichage des résultats des 2e et 3e tris dans la LBox... en tout cas, sur mon ordi.

Bonne journée!

Bonjour, bonsoir,

j'ai trouvé!

A force de retourner le problème dans tous les sens, j'ai pointé le problème sur 'EnableEvents'.

J'ai dû le placer en 'False' dans ListBox_MouseDown, exécuter les opérations sur les données en ListBox_MouseUp avant de le remettre sur 'True' après le calcul et le chargement des données suivantes.

Private Sub lstMulti_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'
Application.EnableEvents = False
'
End Sub

Private Sub lstMulti_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'
'Opérations sur les données de la ListBox
'
Call Calcul(iFlag)
'
End Sub

Public Sub Calcul(ByVal iFlag As Integer)
'
'Nouveau calcul et chargement des nouvelles données dans la ListBox.
'
Application.EnableEvents = True
'
End Sub

Ouf! On peut avancer!

Merci à ceux qui ont fait chauffer les neurones!

A+

Rechercher des sujets similaires à "listbox pas tres docile"