XL 2010 Trier avec 4 cascades ...

Sirberthoult

XLDnaute Occasionnel
Bonjour le Forum

je cherche à créer une application dans le but d'imprimer des étiquettes à coller sur des biberons pour indiquer leur contenus.

j'aimeraiss qu'à l'aide d'un formulaire, on puisse rentrer les différentes informations de l'etiquette.

le formulaire est fait et j'ai commencé à rediger le code ... mais n'étant pas expert je peine sur certaines choses...

dans le frame "dietetique" de mon formulaire actuellement je choisis une "classe" de lait, puis un premier type, puis un second et parfois même un troisieme ... le code fonctionne bien mais j'aimerais 2 améliorations :

premierement, comme vous pouvez voir dans mes données, un même lait peut appartenir à 2 voir 3 classes mais presenter les même types.
exemple: le Modilac Riz 1 est à la fois un 1er age et un Lait de Régime. il est Form. Epaissie et Hydrolysat. mais je n'arrive pas a le faire apparaitre dans la liste des laits 1er ages et des lait de régime.

deuxiement, j'ai des cases blanches dans mes ComboBox car il existe des possibilités en cascade et j'aimerais pouvoir schinter 1 ou 2 cascades pour reduire ma liste.
exemple le Modilac expert riz 1 est 1er Age form.epaissie et je dois choisir la case blanche de la Combobox 4 pour acceder au possibilité de la Combobox 5 , or j'aimerais acceder sans passer par la case blanche.

j'espere qu'avec le fichier cela sera plus clair... merci d'avance pour votre aide.

cordialement
sirberthoult
 

Pièces jointes

  • New Diet.xls
    116.5 KB · Affichages: 39

Dranreb

XLDnaute Barbatruc
Bonjour.
Cette fourniture devrait vous permettre de ne passer que par les ComboBox que vous voulez avec ce code dans l'UserForm :
VB:
Option Explicit
Private WithEvents CL As ComboBoxLiées
Private TLgn() As Long

Private Sub UserForm_Initialize()
Set CL = Création.ComboBoxLiées
CL.Plage Feuil2.[B3:I3], True
CL.Add ComboBox2, 2
CL.Add ComboBox3, 5
CL.Add ComboBox4, 6
CL.Add ComboBox5, 7
CL.Actualiser
End Sub

Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
ListBox2.Clear
End Sub

Private Sub CL_Résultat(Lignes() As Long)
Dim TDon(), TLBx(), LLBx, LDon
TLgn = Lignes
TDon = CL.PlgTablo.Value
ReDim TLBx(1 To UBound(TLgn), 1 To 2)
For LLBx = 1 To UBound(TLBx, 1)
   LDon = TLgn(LLBx)
   TLBx(LLBx, 1) = TDon(LDon, 1)
   TLBx(LLBx, 2) = TDon(LDon, 2)
   Next LLBx
ListBox2.List = TLBx
End Sub
Ne pas oublier de cocher la référence à CBxL dans le projet VBA de votre classeur d'application après installation de la fourniture.
 

Pièces jointes

  • CBxL.xlsm
    112.1 KB · Affichages: 38

Sirberthoult

XLDnaute Occasionnel
Bonsoir le Forum, Bonsoir Dranred,

Merci pour ton aide. j'ai tâtonné pour comprendre et mettre en oeuvre ta proposition et cela fonctionne très bien finalement. Cela résout parfaitement mon deuxième problème.

Maintenant est il possible de modifier cela pour résoudre mon premier problème exposé plus haut... c'est a dire que parfois un même lait peu appartenir a 2 voir 3 classe différentes...
ainsi si je choisi un lait de régime, le modilac riz 1, doit être proposé dans les solutions...

J'ai modifié mon userform et serait il possible par la même occasion, lors d'un click (ou double click peu importe...) sur un lait de la liste apparu que celui ci s'affiche dans la textbox 42.

merci encore.
 

Pièces jointes

  • New Diet 2.xls
    128.5 KB · Affichages: 36

Dranreb

XLDnaute Barbatruc
On peut ajouter une ComboBox supplémentaire pour la 3ième colonne du tableau.
Mais je pense qu'il vaudrait mieux répéter les lignes de produits appartenant à plusieurs classes.
Mais il y aurait éventuellement une autre solution légèrement plus compliquée, qui serait de fabriquer un sujet spécial pour la classe et de le soumettre à une procédure CL_SujBdDPersoSVP.
Mais du coup la classe ne serait plus renseignée dans la ComboBox2 si las choix sont uniquement effectués dans les autres.

Edit: c'est curieux: ce serait plus simple si les classes étaient dans une seule colonne, séparées par des virgules, car on pourrait lui fabriquer aisément un sujet de mots clés avec ça…
il suffirait en principe de ne pas préciser la colonne 2 au CL.Add ComboBox2 et d'ajouter cette procédure :
VB:
Private Sub CL_SujBdDPersoSVP(ByVal CBM As CBxL.ComboBoxMmbr)
CBM.SujetBdD = SujetMotsClés(CL.PlgTablo.Columns(2), ",")
End Sub
 
Dernière édition:

Sirberthoult

XLDnaute Occasionnel
l'objectif n'ai pas de trouver les lait appartenant à plusieurs classe...( donc pas de combobox supplémentaire), mais bien de trouver le lait recherché a plusieurs endroit si je veux le rechercher .

Je me doutais bien que ce serais compliqué cette histoire d'appartenance à plusieurs classes... j'ai bien pensé a répéter plusieurs fois le lait concerné en changeant de classe a chaque fois ... mais le pourcentage de reconstitution associé est amené à changer en fonction du temps et du bon vouloir des laboratoires et si on oubli de changer ce taux dans chaque répétition cela pourras entraîner des erreurs ...

on pourrait pas imaginer que la colonne 3 et 4 soit dans le prolongement de la 2 avec en plus un décalage des résultats associé pour les combobox... je dis ça mais j'en sais rien du tout et en suis incapable ceci dit ...
 

Sirberthoult

XLDnaute Occasionnel
Ou je ne comprend pas bien ta proposition ou alors non car je vais alors avoir comme classe : lait 1er age; lait 2eme age; lait pré; lait de régime; lait 1er age/de Régime; lait 2eme age / de Régime; .... je ne vais plus avoir 7 classes possible mais 12 voir plus ...
ce que j'aimerai c'est que l'on trouve par exemple le Modilac Riz 1 à la fois dans les 1er age mais egalement dans les lait de régime ...
 

Dranreb

XLDnaute Barbatruc
Alors mettons cette formule en J3, à propager sur 42 lignes :
Code:
=$C3&SI($D3<>"";", "&$D3&SI($E3<>"";", "&$E3;"");"")
et dans l'UserForm :
VB:
Private Sub UserForm_Initialize()
Set CL = Création.ComboBoxLiées
CL.Plage Feuil2.[B3:J3], True
CL.Add ComboBox2 ' Colonne non précisée.
CL.Add ComboBox3, 5
CL.Add ComboBox4, 6
CL.Add ComboBox5, 7
CL.Actualiser
End Sub

Private Sub CL_SujBdDPersoSVP(ByVal CBM As CBxL.ComboBoxMmbr)
CBM.SujetBdD = SujetMotsClés(CL.PlgTablo.Columns(9), ",")
End Sub

Cela dit ça n'augmenterait peut être pas tant que ça le nombre de classes combinées, dans la mesure où c'est une histoire de compatibilités, et qu'il n'y en a peut être pas tant que ça…
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
VB:
Private Sub ListBox2_Click()
TextBox42.Text = ListBox2.Text
End Sub
Si vous aviez besoin de récupérer d'autres informations dans la base à la ligne correspondante :
VB:
Private Sub ListBox2_Click()
Dim LCou As Long, TVLgn()
LCou = TLgn(ListBox2.ListIndex + 1)
TVLgn = CL.PlgTablo.Rows(LCou).Value
TextBoxLambda.Text = TVLgn(1, UneDesColonnes)
etc.
End Sub
 

Sirberthoult

XLDnaute Occasionnel
Bonjour le forum, bonjour Dranreb

effectivement c’était tout simple... mais il était tard hier pour ma défense...;)

en tout cas tout est parfait

Merci Beaucoup pour tout !!! seul j'en étais incapable.

y a plus qu'à maintenant ... surement que vous me reverrez sur le forum avec le même fichier :p