Alimenter un combobox par une liste filtrée suivant les résultats d'autres combobox

fgehin

XLDnaute Junior
Bonjour,

Je souhaite alimenter la liste d'un combobox qui s'appelle "code_produit_1" suivant les résultats de 2 combobox "categorie_article_1" et "genre_1".
J'ai une base de données qui contient des colonnes nommées "nature_du_produit", "genre" et nom_du_produit".

Mes 3 combobox se situent dans un userform. J'initialise les combobox "categorie_article_1" et "genre_1" par 2 listes. Je récupère les valeurs sélectionnées dans des variables publiques "categoriearticle1" et "genre1".

Je voudrais maintenant filtrer ma BDD (colonne "nature_du_produit" filtrée par le critère "categoriearticle1" et colonne "genre" filtrée par le critère "genre1") et récupérer les données filtrées dans une liste qui vienne alimenter le combobox "code_produit_1".

Quelqu'un pourrait-il m'aider ?...

Merci beaucoup d'avance pour votre aide.

Faustine
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Les filtres de listes de ComboBox basées sur différentes colonnes d'un même tableau sont complètement automatiques avec mes objets ComboBoxLiées. Aucune programmation n'est à prévoir dans l'UserForm pour les assumer.
Il y a juste à instruire l'objet de son cahier de charges dans la Sub UserForm_Initialize.
 

fgehin

XLDnaute Junior
Bonjour et merci de vos réponses.

J'aimerais bien comprendre comment les combobox liées peuvent résoudre mon problème, j'ai consulté quelques articles de forum à ce sujet mais ça reste assez obscur pour moi.

J'ai mis mon fichier en PJ :
  • le userform est lancé depuis l'onglet "interface" en cliquant sur le bouton "nouveau devis"
  • on choisit ensuite un élément de la liste dans le combobox "catégorie article" et dans le combobox "genre"
  • je voudrais ensuite récupérer les sélections de ces 2 combobox et filtrer le range "nom_du_produit" dans l'onglet "tailles"
  • enfin, je voudrais retrouver la liste filtrée par ces 2 critères dans le 3e combobox intitulé "produit"

Je vous remercie infiniment de votre aide

Faustine
 

Pièces jointes

  • devis - forum xl.xlsm
    178 KB · Affichages: 53

Dranreb

XLDnaute Barbatruc
Bonjour.
Pas possible si Tissus doit proposer les tissus de 6 colonnes différentes.
Dans l'idéal le tableau doit contenir une ligne pour chaque article et une colonne pour chaque ComboBox. Les éléments communs doivent être répétés sur chacune. À la rigueur plusieurs tissus pourraient être indiqué dans une même cellule en les considérant comme des mots clés (le module MSujetCBx permet de fabriquer un sujet de mots clés pour certaines ComboBox et il est possible de faire accepter celui ci par le module de classe ComboBoxLiées). Pas de table annexes: toute les listes classées et sans doublon proposées seront extraites de la base (et restreintes en fonction des choix déjà effectués dans certaines. Là où il n'en reste plus qu'un, celui ci est assumé automatiquement.).
 
Dernière édition:

fgehin

XLDnaute Junior
Pour l'instant la question ne concerne pas Tissus mais sur produits, pour lesquels il n'y a qu'une colonne et une seule ligne par modèle. Donc dans ce cas-là quelle est la solution ?...

Pour les tissus, je compte gérer le contenu de la combobox par la création d'une matrice séparée qui récapitule les couples modèles / tissus. Je pensais utiliser une fonction lookup pour alimenter la combobox tissu.
 

Dranreb

XLDnaute Barbatruc
La solution est la même que pour toutes les applications utilisant un ComboBoxLiées
Déclarez en têtre un Private WithEvents CL As ComboBoxLiées
dans la Sub UserForm_Initialize faire Set CL = New ComboBoxLiées
ensuite Cl.Plage ThisWorkbook.Worksheet("Tailles").Rows(3)
ensuite Autant de CL.Add Me.ComboBox, colonne qu'il y en a à gérer
enfin CL.Actualiser
Selectionnez CL dans la liste de gauche qui surmonte la fenêtre de code, et dans celle de droite les noms des procédures qu'il vous faut pour être informé des changements.
Vous trouverez pour chacune des commentaires explicatif derrière chaque instruction Event dans le module de classe ComboBoxLiées.
Ne vous amusez pas à refaire des Worksheet("Tailles").Cells(…: Travaillez partout avec CL.PlgTablo

Remarque: Une fois installés les 5 modules de service dont 3 de classe, le fonctionnement autonome des 3 ières ComboBox est déjà totalement assumé par cette programmation :
VB:
Option Explicit
Private WithEvents CL As ComboBoxLiées

Private Sub Userform_Initialize()
Set CL = New ComboBoxLiées
CL.Plage Sheet3.Rows(3)
CL.Add Me.categorie_article_1, "nature_du_produit"
CL.Add Me.genre_1, "genre"
CL.Add Me.code_produit_1, "nom_du_produit"
CL.CorrespRequise = True
CL.Actualiser
End Sub

Supprimez ce MultiPage.
À la rigueur on pourrait s'accommoder d'un TabStrip.
Mais le mieux serait une ListBox 'panier'.
À moins qu'il y ait rarement plus de 3 articles différents commandés.
 

Pièces jointes

  • CbxLiéesFgehin.xlsm
    256.5 KB · Affichages: 54
Dernière édition:

Dranreb

XLDnaute Barbatruc
J'insiste vraiment: le plus simple à mettre au point serait d'avoir une ligne par article disponible, avec sa taille, son tissu, son prix et sa quantité disponible qui lui sont propres. On pourrait alors même limiter les propositions dans les listes aux articles dont la quantité dispo > 0
 

fgehin

XLDnaute Junior
Merci Dranareb, c'est vraiment formidable comme contenu... et comme apprentissage.

J'ai relu votre message plus haut me suggérant d'utiliser le module MSujetCbx et j'ai tenté (peut-être maladroitement en terme de syntaxe) d'écrire le code suivant mais manifestement ça ne marche pas :

Private Sub Userform_Initialize()

Dim CM As ComboBoxMmbr

Set CL = New ComboBoxLiées
Set CM = New ComboBoxMmbr

CL.Plage Sheet3.Rows(3)
CL.Add Me.categorie_article_1, "nature_du_produit"
CL.Add Me.genre_1, "genre"
CL.Add Me.code_produit_1, "nom_du_produit"
CL.CorrespRequise = True
CL.Actualiser
CM.SujetBdD = SujetCBx(CL.PlgTablo.Columns(42))

End Sub

Maintenant je ne comprends pas comment j'affecte à la combobox "code_tissu_1" la liste contenue dans CM.
 

Pièces jointes

  • devis - forum v2 xl.xlsm
    2 MB · Affichages: 40
Dernière édition:

Dranreb

XLDnaute Barbatruc
Comment faire si 1 de ses propriétés est multiple ?

Par exemple :
  • à chaque produit correspond une liste de tissus dans lesquels l'article peut être confectionné, elle-même décomposée en plusieurs sous-listes (car attachés à des prix différents)
Répétez ce code produit sur toutes les lignes des différents tissus. CL, l'objet ComboBoxLiées ne le proposera qu'une fois dans la liste de la ComboBox correspondante, si toutefois on n'aura pas commencé par choisir un tissu ou une taille, par exemple, en lesquels il n'existe pas.
Si j'affecte plusieurs lignes à la description des possibilités de tissus et de taille, alors je n'ai plus une ligne unique par produit.
Et alors, qu'est ce que ça peut faire ? Le gain de souplesse et de simplicité l'emporte largement sur l'inconvénient de devoir répéter les infos, notamment la désignation, si vraiment il y a rarement à la faire différer légèrement selon ces nuances. Toutefois, si pour un même code article vous tenez vraiment toujours à ce qu'il y ait exactement la même désignation, il serait possible de mettre celle ci dans un autre tableau ne contenant qu'une ligne par code. Mais ça interdirait la possibilité d'une recherche de cette désignation, en particulier une recherche par mots clés ou par groupes de caractères (recherche intuitive) dont on peut enrichir la recherche standard effectuée par l'objet.

Je n'arrive pas à ouvrir votre dernier classeur. Avez vous remplacé le MultiPage par un TabStrip (Contrôle Onglet) ?
 

fgehin

XLDnaute Junior
Il est trop complexe de démultiplier, à la main, chacune des 1000 et quelques références de cette BDD, en autant de tissus, de tailles, d'options qu'il est possible de rassembler, qui n'ont même pas un nombre unique de l'une à l'autre.

J'ai donc changé mon fusil d'épaule (cf message ci-dessus utilisant MSujetCbx), qui me semble plus adapté à ma problématique. Mais le pb n'est tjs pas résolu (cf nouveau fichier joint)

Par ailleurs, si j'ai bien compris les fonctionnalités de TabStrip, ça m'obligera à dédoubler tous les objets systématiquement d'un tab à l'autre. Je voudrais cependant, pendant l'établissement du devis, pouvoir naviguer d'un tab à l'autre en gardant en mémoire les choix / commentaires / quantités indiqués par l'utilisateur, afin qu'il puisse vérifier le formulaire avant de lancer le calcul du devis total. Est-ce que ce ne serait pas bloquant avec TabStrip ?

Bien cordialement,

Faustine
 

Dranreb

XLDnaute Barbatruc
Avec un ComboBoxLiées, non, ça ne devrait pas être bloquant si on conserve les infos dans des tableaux globaux dimensionnés comme la propriété Tabs du TabStrip. Seules les numéros de lignes dans CL.PlgTablo et les infos modifiables tels que les quantité et peut être les commentaires seraient à conserver. Celles, récupérées de la base, non modifiables devraient d'ailleurs être affichées dans des Label, non dans des TextBox.
Il est trop complexe de démultiplier, à la main, chacune des 1000 et quelques références de cette BDD, en autant de tissus, de tailles, d'options qu'il est possible de rassembler, qui n'ont même pas un nombre unique de l'une à l'autre.
C'est vraiment dommage. Tellement dommage que vous devriez quand même essayer. Surtout qu'il y a un nombre d'exemplaires disponibles de chaque article. Alors ça pourrait peut être déboucher sur une application de tenue de stock…
D'ailleurs ça ne me parait pas clair. Ils sont en quels tissus ceux que vous avez en stock ?
 
Dernière édition:

fgehin

XLDnaute Junior
Merci Dranreb pour ces précisions. Serait-il possible de me donner également un petit coup de main sur mon message précédent au sujet de l'utilisation de MSujetCbx ?

Merci Dranareb, c'est vraiment formidable comme contenu... et comme apprentissage.

J'ai relu votre message plus haut me suggérant d'utiliser le module MSujetCbx et j'ai tenté (peut-être maladroitement en terme de syntaxe) d'écrire le code suivant mais manifestement ça ne marche pas :

Private Sub Userform_Initialize()

Dim CM As ComboBoxMmbr

Set CL = New ComboBoxLiées
Set CM = New ComboBoxMmbr

CL.Plage Sheet3.Rows(3)
CL.Add Me.categorie_article_1, "nature_du_produit"
CL.Add Me.genre_1, "genre"
CL.Add Me.code_produit_1, "nom_du_produit"
CL.CorrespRequise = True
CL.Actualiser
CM.SujetBdD = SujetCBx(CL.PlgTablo.Columns(42))

End Sub

Maintenant je ne comprends pas comment j'affecte à la combobox "code_tissu_1" la liste contenue dans CM.
 

Dranreb

XLDnaute Barbatruc
C'est peut être ça que vous voulez :
VB:
Private Sub Userform_Initialize()
Set CL = New ComboBoxLiées
CL.Plage Sheet3.Rows(3)
CL.Add Me.categorie_article_1, "nature_du_produit"
CL.Add Me.genre_1, "genre"
CL.Add Me.code_produit_1, "nom_du_produit"
CL.Add code_tissu_1 ' Colonne volontairement non précisée pour provoquer l'évènement SujBdDPersoSVP de CL
CL.CorrespRequise = True
CL.Actualiser
End Sub
Private Sub CL_SujBdDPersoSVP(ByVal CBM As ComboBoxMmbr)
If CBM.CBx Is Me.code_tissu_1 Then
  CBM.SujetBdD = SujetMotsClés(CL.PlgTablo.Columns(42), vbLf)
  End If
End Sub
Attention, il y a des cellules qui n'ont pas les vbLf soit =CAR(10)
 

fgehin

XLDnaute Junior
Merci infiniment Dranreb pour votre temps et votre expertise. Je touche au but... grâce à vous.

J'ai effectué les quelques modifications suggérées (remplacement du multipage par un TabStrip, modification de certaines textbox en labels).

Dans cette dernière version, je rencontre de manière inexpliquée un bug au niveau de la fonction CBx_change() du module ComboBoxMmbr.

Par ailleurs, pour reprendre votre précédente réponse, comment gérer la conservation dans des variables séparées des "numéros de lignes dans CL.PlgTablo" et des "infos modifiables tels que les quantité et peut être les commentaires".

Merci encore infiniment d'avance.

Bien cordialement,

Faustine
 

Pièces jointes

  • Devis forum v3.xlsm
    2 MB · Affichages: 52

Discussions similaires

Statistiques des forums

Discussions
312 180
Messages
2 085 993
Membres
103 081
dernier inscrit
jeromeolivier.raymond@wat