Liste déroulante qui varie, comment l'actualiser ?

Résolu/Fermé
macchat Messages postés 13 Date d'inscription vendredi 28 décembre 2012 Statut Membre Dernière intervention 4 janvier 2013 - 28 déc. 2012 à 19:03
macchat Messages postés 13 Date d'inscription vendredi 28 décembre 2012 Statut Membre Dernière intervention 4 janvier 2013 - 31 déc. 2012 à 13:56
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 ?



A voir également:

5 réponses

JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
29 déc. 2012 à 07:01
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
=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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
29 déc. 2012 à 09:24
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
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

0
macchat Messages postés 13 Date d'inscription vendredi 28 décembre 2012 Statut Membre Dernière intervention 4 janvier 2013
29 déc. 2012 à 15:56
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
0
macchat Messages postés 13 Date d'inscription vendredi 28 décembre 2012 Statut Membre Dernière intervention 4 janvier 2013
29 déc. 2012 à 16:04
Finalement, j'ai retapé et maintenant je n'ai plus ces deux erreurs mais une nouvelle -_-

Pour le i après Next : "Erreur de Compilation : Référence de variable de contrôle incorrecte dans Next"
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
29 déc. 2012 à 16:07
re,

relis bien la syntaxe de mon envoi
pour find: 5 virgules et non 4 ;xlprevious et non x1previous
cells(Lig,"A") et non celles(...

et aussi
with sheets("commandes")
0
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
Modifié par ccm81 le 29/12/2012 à 16:15
bonjour

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
0
macchat Messages postés 13 Date d'inscription vendredi 28 décembre 2012 Statut Membre Dernière intervention 4 janvier 2013
29 déc. 2012 à 16:25
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 ?
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
29 déc. 2012 à 17:12
Rpw ---- Row

au passage, Merci CCM81
0
macchat Messages postés 13 Date d'inscription vendredi 28 décembre 2012 Statut Membre Dernière intervention 4 janvier 2013
29 déc. 2012 à 19:47
Effectivement ! Merci beaucoup !

Dernière petite question : Si je le fais pour toutes mes listes, dois-je mettre Tous les end with à la fin ?
0
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
Modifié par ccm81 le 30/12/2012 à 10:53
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

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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
30 déc. 2012 à 11:44
Bonjour CCM, macchat

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
0
macchat Messages postés 13 Date d'inscription vendredi 28 décembre 2012 Statut Membre Dernière intervention 4 janvier 2013
30 déc. 2012 à 18:48
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
Modifié par ccm81 le 30/12/2012 à 19:39
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!

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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
31 déc. 2012 à 09:24
Bonjour CCM81
La proposition de michel permet effectivement de simplifier le code et elle fonctionne!

hé Oui! ce coup ci j'ai testé mes bidouilles ! :-D

bonne année
0
macchat Messages postés 13 Date d'inscription vendredi 28 décembre 2012 Statut Membre Dernière intervention 4 janvier 2013
31 déc. 2012 à 13:56
Effectivement cela marche maintenant ! Merci beaucoup et bonnes fêtes !
0