ListBox - sélection en cascade

Salut les as,

je prépare un fichier-exemple pour un cousin mais voilà que je bloque sur un détail gênant!
Dans une seule et même ListBox, directement sur la feuille, je désire, en cascade, sélectionner des sections puis leurs sous-sections correspondantes.
Pas de souci pour cela mais, si une sous-section comporte plus d'items que la section supérieure sélectionnée, cette même ligne reste en surbrillance alors même que j'ai évidemment vidé la ListBox entre les étapes (excepté si la sélection a lieu sur la 1ère ligne de la ListBox!).
Pour créer une série random de sections, double-clic sur la feuille pour recommencer une batterie de sélections dans la ListBox.

Y'a un bug ou n'est-ce tout simplement pas possible directement sur la feuille (pas de Unload, évidemment)?

Merci pour votre éclairage!

33thierryapp.xlsm (27.55 Ko)

A+

Salut @curulis,

Chez moi le bug n'est pas systématique (dans le cas de la sous-liste plus longue). J'ai rajouté DoEvents à la fin de ta macro mais ça n'a pas l'air de changer grand chose… Mais est-ce grave ? Ça m'a l'air d'être simplement visuel, on peut quand même sélectionner tous les choix.

Salut Saboh,

merci de te pencher sur le sujet!

on peut quand même sélectionner tous les choix

Ah, ben, que non, chez moi, en tout cas! Une sélection en surbrillance n'est plus sélectionnable!
C'est là qu'est l'os!

Ah oui effectivement j'avais pas fait attention.

C'est très étrange, je viens de rajouter le DoEvents après listLevel.Clear et ça semblait résoudre le problème car j'avais mis un point d'arret dessus, et de fait je n'avais plus l'erreur.

Mais en enlevant le breakpoint ça "rebug".

Si tu rajoutes en 2e ligne du sub

Application.Wait Now() + TimeValue("00:00:01")

Il n'y a plus l'erreur, mais ça donne l'impression de ramer. En fait je crois que tout simplement Excel enregistre le clic 2x (1x avant et 1x pendant) mais ne lance l'event qu'une fois.

Pour le wait le problème c'est que quand je met moins de temps, l'erreur revient.

Ce qu'il serait bien ce serait de delay la mise a jour graphique, ou empêcher un clic. J'ai essayé application.screenupdating mais ça ne change rien.

Bonjour à tous ,

Une piste peut-être :

  • Trois listes (une par niveau)
  • Seul le niveau concerné est rendu visible avec les item qu'il faut, les deux autres sont rendues invisibles

C'est peut-être farfelu (je n'ai pas eu le temps d'essayer). Je ne sais pas si ça change quelque chose.

J'avais remarqué qu'une erreur annulait effectivement ce "bug" mais, bon, quand bien même ça passerait crème avec 'on error resume next', je me vois mal jouer les barbares!

Je viens d'essayer le Double-clic : pareil! Même surbrillance persistante!

Salut Mafraise,

j'y ai pensé aussi.
Je n'ai pas tenté, j'avoue, mais quelque chose me dit qu'une nouvelle volée de sections et de sélections provoqueront sans doute le même effet!

Peut-être me rabattre sur des listes de validation...
Rageant!

Quelqu'un cherchait déjà la solution en... 2005!
Déjà à cette époque!

On n'est pas sauvés!

J'aime bien la solution/contournement de mafraise.

Perso j'aurai probablement fait une macro "constructeur" de listbox, et suppression/creation d'une nouvelle listbox à chaque validation. On laisse la poussière sous le tapis…

Ah, ah, genre simple!
On ferait joujou entre...

ActiveSheet.OLEObjects.Add(ClassType:="Forms.ListBox.1", Link:=False, _
        DisplayAsIcon:=False, Left:=432.75, Top:=222.75, Width:=221.25, Height _
        :=84.75).Select

et...

ActiveSheet.Shapes.Range(Array("ListBox1")).Delete

Mais, enrichissant!
À défaut, je creuse.
À suivre...

A+

Salut de nouveau,

Bon je n'y connais vraiment rien aux objets OLE. Mais en trifouillant un peu, si je fais cela :

Sub addOLE(rngAddress As String)

    For Each it In ActiveSheet.OLEObjects
      Debug.Print it.Name
      it.Delete
    Next it

    With ActiveSheet.OLEObjects.Add(ClassType:="Forms.ListBox.1", Link:=False, _
        DisplayAsIcon:=False, Left:=432.75, Top:=222.75, Width:=221.25, Height:=84.75)
      .ListFillRange = rngAddress
    End With

End Sub

Sub test()
  ActiveSheet.Calculate
  addOLE "a1:a10"
End Sub

' ----- code worksheet
Private Sub ListBox1_Click()
  MsgBox "click at " & ListBox1.ListIndex
End Sub

Je supprime et créé sans problème une listbox. En plus, je peux dans le code de la feuille garder l'event car la listbox prend toujours le meme nom. Donc le problème est simplement de trouver la range où se trouvent les valeurs à utiliser, mais sinon ça me semble faisable.

Salut Saboh, Mafraise,

avec OLE, je n'arrive à rien pour l'instant mais, bon, ne désespérons pas!

Par contre, "l'astuce" de Saboh que j'ai placé là fonctionne très bien.
Merci, Microsoft!

If iLevel < 3 Then
    Application.Wait Now() + TimeValue("00:00:01")
    iLevel = iLevel + 1

Si je devais, ou vous d'ailleurs, trouver la solution, Wait (ah, ah) and see, je reviendrais évidemment vous la présenter.

Merci pour le coup de main!
A+

Bonjour,

On peut réduire le temps d'attente sous la seconde.

If iLevel < 3 Then
    Dim t As Double
    t = Timer
    Do While Timer < t + 0.25
        DoEvents ' Laisser Excel répondre aux événements pendant l'attente
    Loop
    iLevel = iLevel + 1

Bizz

re,

et un listbox type "ActiveX", cela n'est pas plus pratique ?

(PS. par contre, dans le future MO ne supportera plus cet ActiveX dans ces nouvelles versions 365 )

Salut tout le monde,

@Bizarre : j'ai essayé, tu penses bien, mais sans effet. Peut-être, je dis bien, peut-être parce que c'est "du code qui roule" au contraire de 'WAIT' qui bloque l'exécution comme le ferait une erreur!

@BsAlv : c'était bien une ListBox ActiveX.

(PS. par contre, dans le future MO ne supportera plus cet ActiveX dans ces nouvelles versions 365 )

Ah, bon? Remplacé par ListView?

A+

"google translate" is your best friend

https://tweakers.net/nieuws/226304/microsoft-gaat-activex-standaard-uitschakelen-in-office-2024.html

donc à partir d'Office 2024, on utilisera un "DisableAllActiveX-policy"

J'ai lu quelque part que le nom 'Office' disparaît pour ne laisser que '365'.

Bonjour curulis57,

Krosoft a rebaptisé tout ce qui tournait autour d'office 365 et des outils collaboratifs du nom Microsoft 365.

un essai

15thierryapp.xlsm (36.27 Ko)

Salut tout le monde,
Salut BsAlv,

malheureusement, je ne vois pas d'amélioration!
Dans la configuration ci-jointe (mais qui peut être dans toute configuration), si tu choisis '2A' en Level 1, ce même item sera toujours sélectionné en Level 2.
Pareil alors en choisissant '2A-C' en Level 2, l'item restera encore sélectionné.
Le seul cas sans problème, c'est quand le 1er item de la ListBox est sélectionné. Est-ce une piste...?

A+

Rechercher des sujets similaires à "listbox selection cascade"