Liste déroulante avec renvoi vers cellule

Bonjour,

Je souhaiterai créer une liste déroulante qui, lorsqu'on clique sur un des choix de la liste, renvoie à une cellule sur la même feuille. La feuille de base sur laquelle je travaille est très longue et comporte environ 1000 lignes (je ne peux pas la casser car toutes les infos doivent être dans cette même feuille). Il y a des titres pour chaque section et l'idée est de créer un menu en haut de la feuille qui permet de naviguer plus facilement sur la feuille. Par exemple, si j'ai 10 sections et que je veux aller dans la section 4, je clique sur le menu, fait dérouler la liste puis clique sur section 4, et cela me renvoie directement au titre section 4 plus bas dans la feuille.

J'ai joint un petit fichier excel pour servir d'exemple sur à quoi ma feuille de base ressemble.

Merci d'avance pour votre aide !

C.A.

Bonjour et sur le forum,

Je te propose cette solution:

Je te laisse voir les codes dispersés un peu partout

Bonjour Ausecour et merci beaucoup pour ta réponse, c'est exactement ce que je cherche !

Est-ce que tu pourrais m'expliquer les codes que tu as écrit et dans quel ordre il faut le faire? Le VBA c'est encore un peu du chinois pour moi...

Merci d'avance !

Re!

Pas de souci, je peux expliquer les codes:

Sub MajListe()
Dim ligFin As Long
Dim tableau As Variant

With Feuil1
    ligFin = .Range("c" & Rows.Count).End(xlUp).Row
    tableau = .Range("c" & 8, "c" & ligFin)
    .ListBox21.Clear
    .ListBox21.Height = 45
    .ListBox21.Width = 178.5
    For i = LBound(tableau, 1) To UBound(tableau, 1)
        If tableau(i, 1) Like "Section *" Then
            .ListBox21.AddItem 7 + i
            .ListBox21.List(.ListBox21.ListCount - 1, 1) = tableau(i, 1)
        End If
    Next i
End With
End Sub

C'est le code le plus important, il permet d'initialiser la liste déroulante, ça remplis les informations qu'il lui faut qui serviront pour la suite.

Pour lui donner des informations, il faut que je sache où se trouvent les sections, donc pour ça il faut déjà que je parcours les lignes pour les trouver, seulement premier souci, tu peux avoir un nombre de lignes variables, c'est pour ça que je calcule au début du programme une valeur que j'enregistre dans ligFin.

Pour ligFin, je prends le numéro de ligne de la première cellule remplie que je trouve, quand je pars de la cellule colonne C, dernière ligne du fichier (Rows.Count qui renvoie le nombre de lignes de la feuille), vers le haut, jusqu'à m'arrêter (.end(xlUp)).

Pour que la macro aille plus vite, j'enregistre la colonne C qui va m'intéresser dans un tableau VBA, qui est plus rapide à parcourir que des celules, pour ça j'écris tableau = .Range("c" & 8, "c" & ligFin), ce qui enregistre toutes les valeurs des cellules dans un tableau à 2 dimensions, lignes et colonnes).

une fois que j'ai ce tableau, je vide ma listbox actuelle, je lui définis une largeur et une hauteur, puis je fais une boucle pour chercher mes sections dans mon tableau, comme mon tableau est de taille variable, j'utilise LBound et UBound pour faire référence aux premier et au dernier numéros de ligne du tableau, je mets 1 sur ces fonctions pour dire que je veux la première dimension, si je mets 2, ça me renverra les numéros de colonne.

Dans ma boucle, j'utilise If tableau(i, 1) Like "Section *" pour vérifier si le contenu de la cellule ressemble à quelque chose commençant par "Section ", l'étoile est ce qu'on appelle une Wild Card, ça permet de dire "une chaîne de texte", avec l'opérateur Like ça se traduirait par: "Section " suivi de texte, il existe # pour dire un chiffre, et ? pour dire un caractère.

Si c'est une section, j'ajoute une entrée à ma listbox avec additem, je donne 7+i en paramètre, la première ligne du tableau est la ligne 8, il faut donc prendre ce décalage en compte, ça c'est ma première colonne qui est masquée, car j'ai mis 0,1 en largeurs de colonnes, en gros, la première représente 0% de la largeur de la liste, et la deuxième 100%.

Pour la deuxième colonne de ma liste qui sera visible, avec le nom de la section, j'utilise .List, je mets le nombre d'entrées dans la liste -1 car la liste commence par le numéro 0, et 1 pour la deuxième colonne.

Une fois que ça s'est fait, je ferme ma condition, ma boucle, mon With, le With permet de ne pas répéter quelque chose plein de fois comme:

DansMonFrigo.tomates
DansMonFrigo.lait
DansMonFrigo.moutarde
DansMonFrigo.fromage

en écrivant:

With DansMonFrigo
    .tomates
    .lait
    .moutarde
    .fromage
End With

Voilà, j'espère que ce sera déjà plus clair

Bonjour,

Une autre méthode avec simplement un sélecteur de Numéro de section.

Private Sub ComboBox1_Change()
Dim ligne As String
Dim trouveligne As String
ligne = ComboBox1.ListIndex + 1
trouveligne = CDbl(ligne * 6) + 2
Cells(trouveligne, 3).Select
End Sub

En utilisant les multiple de 6 puisque tes section semble revenir toutes les six lignes.

Bonjour Ausecour j'avais compris jusqu'au momment ou tu as parlé de ton Frigo LOL

Du coup je sais pas si je vais quand même avoir du fromage ce soir

Merci à tous les deux pour vos réponses. Ca m'est vraiment très utile.

Merci Ausecour pour tes explications, je comprends mieux comment le code fonctionne. Si ça ne te dérange pas, je voudrais te poser quelques questions car j'essaie de l'adapter à ma feuille et j'ai quelques soucis... Je t'envoie un autre fichier Excel pour être plus explicite.

Q1: comment faire si les titres ne sont pas "numérotés"? (à la place de section 1,2,3... j'ai par exemple, Revenus, Operations, Capital...).

Q2: est-ce que le fait qu'il n'y ait pas le même nombre de lignes entre les titres a un impact sur le code?

Q3: je souhaiterai faire une liste déroulante (comme un combobox).

Merci beaucoup pour ton temps !

Bonjour,

Je vais tâcher de répondre à tes questions

Q1: il faut changer de façon de procéder, j'ai vu que tes titres de Section étaient toujours suivis d'une cellule vide, je m'en suis servis pour le code, et j'ai utilisé une variable, pour dire si oui ou non, la cellule qui précède la cellule vide est un titre de Section, parce que tu as aussi une cellule vide en dessous de tes lignes de contenu.

Q2: ça n'a pas du tout d'impact, la macro va juste réagir quand elle va croiser une cellule vide

Q3: Pour une combobox c'est possible aussi, le code ne change pas en fait à part le nom du contrôle

Voici le fichier avec modification:

Bonjour Ausecour j'avais compris jusqu'au momment ou tu as parlé de ton Frigo LOL

Du coup je sais pas si je vais quand même avoir du fromage ce soir

Ah ben pourtant je pensais que ça te parlerait comme exemple! Tu as eu du fromage au final?

Ça fonctionne nickel sur mon gros fichier! Merci beaucoup pour ton aide !

Ah super!

Merci d'avoir passé le sujet en résolu

Rechercher des sujets similaires à "liste deroulante renvoi"