Topindex sur une zone de liste (contrôle de formulaire)

Salut à tous,

Au vue de la petite liste des méthodes de ce contrôle, il me semble que l'on ne peut pas faire ça :/

Mais peut etre auriez vous une technique/astuce malgré ça (la pauvreté des propriétés de ce contrôle) pour afficher (afficher, pas selectionner donc) en haut de la listbox, un index particulier dans(contrôle formulaire, et non activeX)?

ça doit surement commencer par ça :

ThisWorkbook.Sheets("Feuille_1").Shapes("Liste_fichiers_sources").ControlFormat.

Merci beaucoup pour votre aide.

PS: après coup, je sais que j'aurai du utiliser un contrôle activeX à la place d'un contrôle de formulaire, mais c'est trop tard, j'ai trop avancé dans mon code, je serai obligé de refaire trop de chose pour remplacer les contrôles formulaires par des activeX...

Bonjour ced-le-dingue

A+

Bonsoir Ced_le_dingue,

Tout est possible...avec astuce.

en haut de la listbox, un index particulier

Donc, pour une zone de liste placé en I3:J3 avec cellule liée en I3. Une source de O1 à O9. Et un évènementiel en K3. Voir ci-dessous.

image
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$K$3" Then
Avt = Range("O1")
Prem = Range("O" & [I3])
Range("O1") = Prem
Range("O" & [I3]) = Avt
End If
End Sub

Sélection par exemple, de l'item4 dans la zone de liste puis sélection ensuite de la cellule K3.

image

Et ce-dernier passe en haut de la liste.

image

On peut aussi, si l'on ne ne souhaite pas passer par une colonne (K ou autre) associée à la zone de liste. Pendre alors une forme par exemple:

image

Et lui affecter la macro postée dans un module plutôt que dans le code évènementiel de la feuille. Adapter selon placement de la zone de liste et zone source.

Salut à tous,

Merci pour ta réponse constructive Bruno XD

Merci pour ta réponse XCellus. En fait je me suis très mal exprimé, ce que je souhaiterai c'est, passer de ça:

image

à ça:

image

Autrement dit, afficher le Xème item de la Listbox en haut dans la zone visible (comme une listbox classique avec: ListBox1.TopIndex = 2 'par exemple)

Cependant, je n'ai pas encore eu le temps de lire ton code en détail, mais à priori c'est de cette manière qu'on pourrait procéder (sauf que moi je lancerai le bout de code en changeant d'onglet via l'évènement activate de ma feuille, mais en ayant lu rapidement ce que tu proposes, ça en revient au même t'inquiètes).

Juste ce qu'il faut, ce n'est pas changer l'ordre mais mettre la selection actuelle visible en haut de la listbox (car elle est très longue et mon item est parfois tout en bas)

N.B. : Je suis au taff donc je ne peux que répondre en coup de vent et je pourrai regarder ça en détail après le taff.

bonjour le fil,

je ne sais pas comment vous voulez utiliser cette liste, mais ici un essai. Si cela n'est pas 100%, expliquez le fonctionnement ...

Macro "INIT" est une initialisation, macro "test" est pour mettre un item au top.

4dep.xlsb (25.85 Ko)

A nouveau,

Juste ce qu'il faut, ce n'est pas changer l'ordre mais mettre la sélection actuelle visible en haut de la listbox (car elle est très longue et mon item est parfois tout en bas)

En fait ce que tu recherches est un accélérateur. Comme un scroll (ascenseur) rapide qui peut t'amener sur des paliers différents rapidement.

Donc, il faut juste modifier la macro évènementielle et préciser l'index cherché.

Je reprends les données postées hier à 20:04. En augmentant la source à 20 items pour la zone de liste nommée ListBoxCed.

Au début la zone de liste est ainsi

image

On souhaite que ce soit à partir de l'item15 qu'on recherche soit ce dernier soit des éléments assez proche de celui-ci en dessous.

image

Pour cela, on change la valeur en K3, en tapant 15. L'item15 se retrouve alors en haut de liste.

Puis un clic (obligatoire) sur l'item15 ou sur l'un des items plus bas.

Ci-dessous la macro.

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$K$3" Then
ActiveSheet.Shapes.Range(Array("ListBoxCed")).Select
Selection.ListFillRange = "$O$" & Target.Value & ":$O$20"
Range("I3") = Target.Value
Range("J3").Select
End If
End Sub

En I3, toujours la cellule liée de la zone de liste. Mais en J3 inscrire la formule =I3-1+K3.

C'est cette cellule J3 qui sera l'index. Pour revenir à l'item1, mettre 1 en K3 et clic sur l'item.

Suite,

On peut se passer du clic à réaliser.

En ajoutant à la macro, après le Range("J3"). Select

Range("I3") = 1

Ainsi l'item placé au top sera automatiquement sélectionné.

re,

une autre possibilité = agrandir le listbox, voir listbox à partir de K2 et vous sélectionnez K1. Un scroll avec ce type de listbox en VBA est impossible, je crois, mais si nécessaire on peut montrer seulement une partie des données, par exemple les items de 1-50 ou de 51-100 ou tous les fichiers à partir de oct-2022 ou ... (on n'utilise pas le "ListFillRange" ! https://wellsr.com/vba/2016/excel/complete-guide-to-excel-vba-form-control-listboxes/#edit)

3dep.xlsb (30.45 Ko)
Rechercher des sujets similaires à "topindex zone liste controle formulaire"