Liste déroulante qui varie, comment l'actualiser ?
Résolu
macchat
Messages postés
13
Date d'inscription
Statut
Membre
Dernière intervention
-
macchat Messages postés 13 Date d'inscription Statut Membre Dernière intervention -
macchat Messages postés 13 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je suis débutante en VBA et je travaille actuellement dans le cadre de mes études sur un logiciel destiné à des entreprises de restauration rapide.
J'ai créé un UserForm "Commandes" avec 4 listes déroulantes reprenant mes différents types de produits ( entrées, plats...) qui sont répertoriés sur une feuille Excel.
Seulement, je ne sais pas comment ma liste déroulante peut prendre en compte les produits que je peux ajouter au cours du temps, car dans Rowsource on doit mettre une plage de cellule, mais la mienne peut a tout moment être modifiée ( des produits en plus ou en moins )
QQn peut-il m'aider svp ?
Je suis débutante en VBA et je travaille actuellement dans le cadre de mes études sur un logiciel destiné à des entreprises de restauration rapide.
J'ai créé un UserForm "Commandes" avec 4 listes déroulantes reprenant mes différents types de produits ( entrées, plats...) qui sont répertoriés sur une feuille Excel.
Seulement, je ne sais pas comment ma liste déroulante peut prendre en compte les produits que je peux ajouter au cours du temps, car dans Rowsource on doit mettre une plage de cellule, mais la mienne peut a tout moment être modifiée ( des produits en plus ou en moins )
QQn peut-il m'aider svp ?
A voir également:
- Actualiser liste déroulante excel
- Liste déroulante excel - Guide
- Excel liste déroulante en cascade - Guide
- Word et excel gratuit - Guide
- Liste déroulante google sheet - Accueil - Guide bureautique
- Déplacer colonne excel - Guide
5 réponses
Bonjour,
Tu pourrais peut-être créer des noms dynamiques dans ta feuille où se trouvent tes listes.
Ensuite tu affecteras ces noms à tes zones de formulaires.
Pour créer un nom dynamique, tu utilises la fonction DECALER() avec NBVAL().
Exemple :
en $A$1 tu as le nom de ta liste : LISTE1
en $A$2:$A:$7 tu as 6 entrées de ta liste et tu veux en ajouter ou en supprimer à ta guise.
Tu crées un nom LISTE1 et tu mets la formule
A partir de là, si tu ajoutes une entrée en $A$8, LISTE1 aura 7 entrées.
Attention cependant, il ne faut pas de lignes vides dans ta liste et tu ne dois avoir que LISTE1 dans la zone $A$2:$A$1000.
Tu répètes l'opération pour les autres listes.
Ensuite, tu peux te référer à tes listes via leurs noms avec un RANGE() et toutes les méthodes de ce genre d'objet.
Cordialement
Tu pourrais peut-être créer des noms dynamiques dans ta feuille où se trouvent tes listes.
Ensuite tu affecteras ces noms à tes zones de formulaires.
Pour créer un nom dynamique, tu utilises la fonction DECALER() avec NBVAL().
Exemple :
en $A$1 tu as le nom de ta liste : LISTE1
en $A$2:$A:$7 tu as 6 entrées de ta liste et tu veux en ajouter ou en supprimer à ta guise.
Tu crées un nom LISTE1 et tu mets la formule
=DECALER($A$1,1,0,NBVAL($A$2:$A$1000),1)dans sa définition.
A partir de là, si tu ajoutes une entrée en $A$8, LISTE1 aura 7 entrées.
Attention cependant, il ne faut pas de lignes vides dans ta liste et tu ne dois avoir que LISTE1 dans la zone $A$2:$A$1000.
Tu répètes l'opération pour les autres listes.
Ensuite, tu peux te référer à tes listes via leurs noms avec un RANGE() et toutes les méthodes de ce genre d'objet.
Cordialement
Bonjour,
Rowsource est une possibilité intéressante pour ta liste déroulante (combobox) mais peut adaptée à des changements d' ajout-retrait
une tite boucle est nécessaire; par ex ta liste de plats commence en B2, feuil1
et si tu veux avoir la première valeur de la liste dans le combo
Rowsource est une possibilité intéressante pour ta liste déroulante (combobox) mais peut adaptée à des changements d' ajout-retrait
une tite boucle est nécessaire; par ex ta liste de plats commence en B2, feuil1
Option Explicit Private Sub UserForm_Initialize() Dim Lig As Byte, Derlig As Byte With Sheets(1) 'ligne de fin de liste Derlig = .Columns("B").Find("*", , , , , xlPrevious).Row 'remplissage du combo For Lig = 2 To Derlig ComboBox1.AddItem .Cells(Lig, "B") Next i End With End Sub
et si tu veux avoir la première valeur de la liste dans le combo
ComboBox1.ListIndex = 0
Merci michel_m de votre réponse. Je viens d'essayer pour mes entrées en colonnes A1 et sur la feuille Commandes.
Seulement deux messages d'erreurs apparaissent :
Derlig = .Columns("A").Find("*"),,,,x1Previous).Row ( pour celui là j'ai : Attendu fin d'instruction)
et pour ComboBox1.AddItem.Celles(Lig,"A") (j'ai attendu = )
Pourriez-vous m'éclairer si possible ?!
Je vous remercie
Seulement deux messages d'erreurs apparaissent :
Derlig = .Columns("A").Find("*"),,,,x1Previous).Row ( pour celui là j'ai : Attendu fin d'instruction)
et pour ComboBox1.AddItem.Celles(Lig,"A") (j'ai attendu = )
Pourriez-vous m'éclairer si possible ?!
Je vous remercie
bonjour
Deux petites erreurs dans la transcription du code de michel (cordiales salutations à toi)
ça doit donner (les espaces apparaitront automatiquement entre les virgules)
ça doit donner
et il en reste une autre
Next Lig au lieu de Next i
bonne suite
Deux petites erreurs dans la transcription du code de michel (cordiales salutations à toi)
Derlig = .Columns("A").Find("*"),,,,x1Previous).Row
pas de parenthèse fermante après "A"
ça doit donner (les espaces apparaitront automatiquement entre les virgules)
Derlig = .Columns("B").Find("*", , , , , xlPrevious).Row
ComboBox1.AddItem. Celles(Lig,"A")
Cells au lieu de Celles et un espace entre AddItem et .Cells
ça doit donner
ComboBox1.AddItem .Cells(Lig, "B")
et il en reste une autre
Next Lig au lieu de Next i
bonne suite
J'ai rectifié mes erreurs, effectivement je n'avais pas tout correctement retranscrit par étourderie.
Voilà ce que donne mon code :
Private Sub UserForm_Initialize()
Dim Lig As Byte, Derlig As Byte
With Sheets("Commandes")
'ligne de fin de liste
Derlig = .Columns("A").Find("*", , , , , xlPrevious).Rpw
'Remplissage du combo
For Lig = 2 To Derlig
Entrées.AddItem .Cells(Lig, "A")
Next Lig
End With
End Sub
Je viens de le relire 50 fois, peut être que j'ai trop la tête dedans, mais j'ai un nouveau message d'erreur ! " erreur d'éxécution 438 : Propriété ou méthode non gérée par cet objet"
Suis je passé à côté de qqch ?
Voilà ce que donne mon code :
Private Sub UserForm_Initialize()
Dim Lig As Byte, Derlig As Byte
With Sheets("Commandes")
'ligne de fin de liste
Derlig = .Columns("A").Find("*", , , , , xlPrevious).Rpw
'Remplissage du combo
For Lig = 2 To Derlig
Entrées.AddItem .Cells(Lig, "A")
Next Lig
End With
End Sub
Je viens de le relire 50 fois, peut être que j'ai trop la tête dedans, mais j'ai un nouveau message d'erreur ! " erreur d'éxécution 438 : Propriété ou méthode non gérée par cet objet"
Suis je passé à côté de qqch ?
With Sheets("Commandes")
Le "with", fait référence à la feuille "Commades", donc
1. si les autres listes sont dans cette feuille, un seul with et un seul end with
Pour chaque Combobox, il faudra recalculer DerLig et modifier le nom de la colonne, ça devrait donner quelque chose comme ça
2. si les autres listes sont dans d'autres feuilles, un bloc With .... End with par Combobox
bonne suite
Le "with", fait référence à la feuille "Commades", donc
1. si les autres listes sont dans cette feuille, un seul with et un seul end with
Pour chaque Combobox, il faudra recalculer DerLig et modifier le nom de la colonne, ça devrait donner quelque chose comme ça
Private Sub UserForm_Initialize() Dim Lig As Byte, Derlig As Byte With Sheets("Commandes") ' Combobox Entrées - liste colonne A 'ligne de fin de liste Derlig = .Columns("A").Find("*", , , , , xlPrevious).Row 'Remplissage du combo For Lig = 2 To Derlig Entrées.AddItem .Cells(Lig, "A") Next Lig ' Combobox Machin - liste colonne B 'ligne de fin de liste Derlig = .Columns("B").Find("*", , , , , xlPrevious).Row 'Remplissage du combo For Lig = 2 To Derlig Machin.AddItem .Cells(Lig, "B") Next Lig ' Combobox Truc .... End With End Sub
2. si les autres listes sont dans d'autres feuilles, un bloc With .... End with par Combobox
Private Sub UserForm_Initialize() Dim Lig As Byte, Derlig As Byte With Sheets("Commandes") ' Combobox Entrées - liste colonne A 'ligne de fin de liste Derlig = .Columns("A").Find("*", , , , , xlPrevious).Row 'Remplissage du combo For Lig = 2 To Derlig Entrées.AddItem .Cells(Lig, "A") Next Lig End With With Sheets(("FeuilleMachin") ' Combobox Machin - liste colonne B 'ligne de fin de liste Derlig = .Columns("B").Find("*", , , , , xlPrevious).Row 'Remplissage du combo For Lig = 2 To Derlig Machin.AddItem .Cells(Lig, "B") Next Lig End With With Sheets("FeuilleTruc") .... End With End Sub
bonne suite
Bonjour CCM, macchat
pour peut-^tre alléger le code avec une macro paramétrée
au fait ! Bonne année 2013
pour peut-^tre alléger le code avec une macro paramétrée
Private Sub UserForm_Initialize() initialiser_combo "commandes", "A", entrées initialiser_combo "feuillemachin", "B", machin End Sub Sub initialiser_combo(feuille, col, combo) Dim derlig As Byte, Lig As Byte With Sheets(feuille) derlig = .Columns(col).Find("*", , , , , xlPrevious).Row For Lig = 2 To derlig combo.AddItem .Cells(Lig, col) Next Lig End With combo.ListIndex = 0 End Sub
au fait ! Bonne année 2013
Merci Ccm81 !
Voilà ce que donne mon code :
Private Sub Commande_Initialize()
Dim Lig As Byte, Derlig As Byte
With Sheets("Commandes")
'ligne de fin de liste
Derlig = .Columns("A").Find("*", , , , , xlPrevious).Row
'Remplissage du combo
For Lig = 2 To Derlig
Entrées.AddItem .Cells(Lig, "A")
Next Lig
'ligne de fin de liste
Derlig = .Columns("C").Find("*", , , , , xlPrevious).Row
'Remplissage du combo
For Lig = 2 To Derlig
Plats.AddItem .Cells(Lig, "C")
Next Lig
'ligne de fin de liste
Derlig = .Columns("E").Find("*", , , , , xlPrevious).Row
'Remplissage du combo
For Lig = 2 To Derlig
Desserts.AddItem .Cells(Lig, "E")
Next Lig
'ligne de fin de liste
Derlig = .Columns("G").Find("*", , , , , xlPrevious).Row
'Remplissage du combo
For Lig = 2 To Derlig
Boissons.AddItem .Cells(Lig, "G")
Next Lig
End With
End Sub
Pourtant cela ne marche toujours pas...
Voilà ce que donne mon code :
Private Sub Commande_Initialize()
Dim Lig As Byte, Derlig As Byte
With Sheets("Commandes")
'ligne de fin de liste
Derlig = .Columns("A").Find("*", , , , , xlPrevious).Row
'Remplissage du combo
For Lig = 2 To Derlig
Entrées.AddItem .Cells(Lig, "A")
Next Lig
'ligne de fin de liste
Derlig = .Columns("C").Find("*", , , , , xlPrevious).Row
'Remplissage du combo
For Lig = 2 To Derlig
Plats.AddItem .Cells(Lig, "C")
Next Lig
'ligne de fin de liste
Derlig = .Columns("E").Find("*", , , , , xlPrevious).Row
'Remplissage du combo
For Lig = 2 To Derlig
Desserts.AddItem .Cells(Lig, "E")
Next Lig
'ligne de fin de liste
Derlig = .Columns("G").Find("*", , , , , xlPrevious).Row
'Remplissage du combo
For Lig = 2 To Derlig
Boissons.AddItem .Cells(Lig, "G")
Next Lig
End With
End Sub
Pourtant cela ne marche toujours pas...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Pourtant cela ne marche toujours pas...
Qu'est ce qui ne marche toujours pas, j'ai fait un essai, ça fonctionne
RQ. La proposition de michel permet effectivement de simplifier le code et elle fonctionne!
> michel
J'avais bien pensé à un truc de ce genre mais je n'ai pas l'habitude des Userforms, du coup, je n'ai pas "osé" passer un combobox en paramètre, je note, je note !!!
Bon réveillon
Qu'est ce qui ne marche toujours pas, j'ai fait un essai, ça fonctionne
RQ. La proposition de michel permet effectivement de simplifier le code et elle fonctionne!
Private Sub UserForm_Initialize() initialiser_combo "commandes", "A", Entrées initialiser_combo "commandes", "C", Plats initialiser_combo "commandes", "E", Desserts initialiser_combo "commandes", "G", Boissons End Sub Sub initialiser_combo(feuille, col, combo) Dim derlig As Byte, Lig As Byte With Sheets(feuille) derlig = .Columns(col).Find("*", , , , , xlPrevious).Row For Lig = 2 To derlig combo.AddItem .Cells(Lig, col) Next Lig End With ' combo.ListIndex = 0 End Sub
> michel
J'avais bien pensé à un truc de ce genre mais je n'ai pas l'habitude des Userforms, du coup, je n'ai pas "osé" passer un combobox en paramètre, je note, je note !!!
Bon réveillon