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

Résolu
macchat Messages postés 13 Statut Membre -  
macchat Messages postés 13 Statut Membre -
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 ?

5 réponses

  1. JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention   859
     
    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
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
    1. macchat Messages postés 13 Statut Membre
       
      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
    2. macchat Messages postés 13 Statut Membre
       
      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
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    1. macchat Messages postés 13 Statut Membre
       
      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
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Rpw ---- Row

      au passage, Merci CCM81
      0
    3. macchat Messages postés 13 Statut Membre
       
      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
  4. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
    2. macchat Messages postés 13 Statut Membre
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
    2. macchat Messages postés 13 Statut Membre
       
      Effectivement cela marche maintenant ! Merci beaucoup et bonnes fêtes !
      0