Liste déroulante sur VBA

Bonjour,

J'aurais besoin d'aide sur un problème de Fonction.

Je cherche a faire 2 lignes deroulante dynamique sur VBA avec Excel comme sur YouTube

(https://www.youtube.com/watch?v=_OG4ZG4HemU)

Pour cela je defini d abord mes lignes et colonnes en gris qui me serviront a faire 2 listes:

Donc dans "formulas" -> "activators di nombres" je definir la liste verticale (comme expliqué sur youtube) que j'appel Code1.(Formule appliqué =DECALER(1ere case;0;0;Nbval(colonne)) et elle marche)

Pour la liste "horizontale" que j appel code 2 je rencontre un problème : ça me selection une colonne et non une ligne

Formule =DECALER(1ere case;0;0;Nbval(ligne))

Et je vois pas l'erreur, je vous met mon excel en piece jointe

j'ai un Excel espagnol ça aide pas

9probleme.xlsx (9.92 Ko)

Bonjour,

Tu as dû remarquer que la fonction DECALER() possède entre autres un argument "hauteur" et un argument "largeur" et comme tu peux voir, ces deux arguments sont entourés de crochets [ et ] ceci signifie qu'ils sont facultatifs (pas obligé de les renseigner) c'est pour cette raison que dans le cas d'une liste verticale (comme en colonne A) l'argument "largeur" n'est pas renseigné puisque on ne souhaite pas faire un décalage sur les colonnes d'à coté mais pour ta liste en ligne 1, le décalage doit être sur les colonnes mais pas sur les lignes donc la formule que tu as pour ton Nom Code1 : =DECALER(Hoja1!$A$2;0;0;NBVAL(Hoja1!$A:$A))

qui pourrait être : =DECALER(Hoja1!$A$2;0;0;NBVAL(Hoja1!$A:$A);1)

doit devenir pour Code2 : =DECALER(Hoja1!$B$1;0;0;1;NBVAL(Hoja1!$1:$1)-1)

Mais ceci ne va malgré tout pas résoudre ton problème car la propriété RowSource du ComboBox attend une liste verticale donc, dans une colonne et pour l'utiliser si elle est en ligne il va falloir la transposer mais la fonction TRANSPOSE() ajoutée à la formule ne permet pas de l'avoir complète dans la ComboBox donc, il faut passer par VBA et dans ce cas, il faut utiliser la proriété "List" et non "RowSource" !

Dans le module du formulaire il te faut coller ces trois lignes de code :

Private Sub UserForm_Initialize()

    ComboBox2.List = Application.Transpose(Range("Code2"))

End Sub

Et afin de ne pas entrer en "dur" dans les propriétés du 1er ComboBox, tu peux ajouter une ligne de code au 3 autres et le code devient :

Private Sub UserForm_Initialize()

    ComboBox1.RowSource = Range("Code1").Address'ici, ça fonctionne bien puisqu'en colonne
    ComboBox2.List = Application.Transpose(Range("Code2"))

End Sub

Merci beaucoup pour ta réponse ! Je suis a mes debuts avec VBA, tu viens de me retirer 2 problemes en 1 merci

As tu une idée pour que je puisse croiser la liste code 1 et code 2 pour cocher des cases en fonction de ce que je selectionne dans ces lignes de deroulement ?

Re,

Tu poses un CommandButton sur ton formulaire et tu colles le code ci-dessous dans le module du formulaire sous le code que je t'ai déjà donné :

Private Sub CommandButton1_Click()

    If ComboBox1.Text <> "" And ComboBox2.Text <> "" Then
        Cells(ComboBox1.ListIndex + 2, ComboBox2.ListIndex + 2).Value = "X"
    End If

End Sub

Ca a l'air super simple pour toi ahah

Je galere depuis 3 jours dessus.

Merci beaucoup pour tes reponses rapidez et precises !

Derniere question: Dans le code VBA un moment tu marques combobox.listIndex + 2 ça correspond a quoi?

L'index des ComboBox retourner par la propriété ListIndex commence à 0 pour le premier élément de la liste comme tes listes commencent à la ligne 2 pour la colonne A et à la colonne B pour la ligne 1, il faut compenser en rajoutant +2 donc, si tu sélectionnes les deux premiers éléments pour chaque ComboBox les valeurs des deux propriétés ListIndex sont égales à 0 donc en rajoutant +2 à chacune, tu tombes sur la cellule B2 !

Franchement Merci Beaucoup ! Je vais essayer de l'appliquer sur mon cas "complexe": Un tableau qui commence pas en haut a gauche de la feuille Excel !

Si j'ai bien compris les seuls parametres a changer seront cette histoire de + 2

Et Si par Exemple, j'ai en dessous de ma liste en colonne (à l'horizontale) une ligne que je veux pas prendre en compte par exemple c'est la meme chose je suppose

Et si je veux rajouter une fonction pour decocher je suppose un code assez similaire aussi

Je creer un autre bouton prend la fonction (Buttom1 et met "" a la place de "X")

Bonjour,

Le code attaché au même bouton devient :

Private Sub CommandButton1_Click()

    If ComboBox1.Text <> "" And ComboBox2.Text <> "" Then

        With Cells(ComboBox1.ListIndex + 2, ComboBox2.ListIndex + 2)

            If .Value = "X" Then .Value = "" Else .Value = "X"

        End With

    End If

End Sub

Si il y a un "X" il est supprimé sinon, il y est inscrit !

Merci à toi ENCORE !

J'ai préféré rajouter un bouton effacer pour ne pas faire d'erreur en supprimant par accident

Je comprend mieux VBA grace a toi MERCI !

RE,

Code pour le bouton, d'effacement. Le bouton est nommé "CommandButton2" :

Private Sub CommandButton2_Click()

    If ComboBox1.Text <> "" And ComboBox2.Text <> "" Then
        Cells(ComboBox1.ListIndex + 2, ComboBox2.ListIndex + 2).Value = ""
    End If

End Sub
Rechercher des sujets similaires à "liste deroulante vba"