XL 2013 Tri d'une listbox sur 2 combobox en cascade

franxy

XLDnaute Junior
Bonjour à tous,
J'essaie de creer une petite gestion de patient. N'étant pas un pro de vba, plutot un bidouilleur j'ai du mal à faire le filtre sur une deuxieme combobox qui actualise ma listbox
Données issues de Bdd_ngap
1- à l'ouverture le formulaire1 doit s'ouvrir
2- je filtre sur la cbb4 => actualisation de la listbox

A ce stade, les cas restant sont deja filtrables plus aisement, mais j'aimerai affiner par la Cbb5 car selon le choix de la ccb4, il y a encore pas mal de possibilité

3- je voudrais filtrer sur la Cbb5
4- Ensuite en cliquant sur la ligne voulue, j'incremente dans les textbox lettre clé et coefficient
5- j'insere dans la bdd_patient via le bouton en bas à gauche

J'ai bien vu qq exemples ça et là, mais mon niveau de bidouilleur est encore très largement insuffisant pour traduire cela dans mes codes.
Si vous aviez qq idées, cela serait vraiment très sympa de m'en faire part
Merci beaucoup
 

Pièces jointes

  • Projet appli_Copie3.xlsm
    43.3 KB · Affichages: 7

Dranreb

XLDnaute Barbatruc
Mon objet ComboBoxLiées se charge des listes des ComboBox et des choix sans qu'il n'y ait à les programmer dans l'UserForm..
Sur Nom et Prénom dans ce classeur.
 

Pièces jointes

  • CLsCAsContacts.xlsm
    171.4 KB · Affichages: 5

Dranreb

XLDnaute Barbatruc
Je vous ai réécrit toute cette partie avec utilisation d'un ComboBoxLiées que j'ai appelé CLsNGap et non simplement CLs comme je fais d'habitude, parce que je ne le vois pas comme un objet principal pour la mise à jour de la base Patient.
 

Pièces jointes

  • CBxLiéesFranxy.xlsm
    114.6 KB · Affichages: 5

franxy

XLDnaute Junior
Je vous ai réécrit toute cette partie avec utilisation d'un ComboBoxLiées que j'ai appelé CLsNGap et non simplement CLs comme je fais d'habitude, parce que je ne le vois pas comme un objet principal pour la mise à jour de la base Patient.
Bonjour,
Un grand merci pour ce travail qui correspond à celui voulu.
Je vais me pencher dessus pour comprendre un peu plus l'imbrication, pourquoi dans le projet, ces modules, ces combobox liées ou Mmbr ?
Si j'arrive à lire des textes assez simple, tout ce qui est écrit et à 90% indéchiffrable pour moi, et c'est aussi ce genre de support que je recherche, j'ai beau fouiné en librairie ou sur le net, je ne trouve rien d'explicite,
les "pour les nuls" ( le titre correspond bien pour moi.... ) mais à mon sens n'explique pas toutes les objets, contexte etc etc.
Merci beaucoup, je vais essayer d'avancer maintenant sur ce projet
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Le module de classe ComboBoxLiées définit ce type d'objet.
Le ComboBoxMmbr définit une classe support pour une ComboBox membre dont on lui aura confié la charge au moyen de sa méthode Add.
Le module de service standard MSujetCBx est spécialisé dans la constitution de sujets, c'est à dire de listes classées et sans doublon accompagnées de listes de numéros de lignes de leurs provenances.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Bonjour à tous
Juste en passant
Alors j'ai repris le fichier en post #1

que dire?
tu travaille avec une base de donnée donc travaille la comme tel
c'est a dire chercher la dernière ligne et créer la range en string n'est pas nécessaire travaille avec des tableaux structurés

tu me diras pourquoi tes listes préétablies pour les combobox ne sont pas des tableaux structurés
car là aussi leur accès est plus simple

et là on est dans la bavure totale
mais pourquoi coquin de sort utilise tu un symbole "*" alors que ce symbole est un symbole très utile en VBA
tu ne peux pas en utiliser un autre ? (bien sur que si)




donc pour ces 3 raisons je reprends le fichier et ses tableaux en bon et due forme
on a donc

dans une feuille
un tableau "_Tdata" qui est la bdd
un tableau "ListCBB4" qui est la liste pour la combobox4
un tableau"ListCBB5" qui est la liste pour la combobox5

et dans l'autre feuille
un tableau "BDD_Patient" qui est le tableau dynamiquement rempli par ton userform
d'ailleurs au passage il ne doit pas y avoir de ligne vide dans un tableau structuré

1711535941403.png


bon pour les feuilles et tableau on est paré
passons a l'userform
dans l'initialise on remplira simplement les controls avec le value des ranges précédemment citées
VB:
Private Sub UserForm_Initialize()
   BtCalendar.Picture = Application.CommandBars.GetImageMso("ContentControlDate", 30, 30)
   With ListBox1
        .ColumnCount = 5
        .ColumnWidths = "30;30;175;60;120"
        .List = ThisWorkbook.Sheets("Bdd_ngap").Range("_Tdata").Value
    End With
    ComboBox4.List = ThisWorkbook.Sheets("Bdd_ngap").[ListCBB4].Value
    ComboBox5.List = ThisWorkbook.Sheets("Bdd_ngap").[ListCBB5].Value
End Sub
c'est pas plus compliqué que cela ;)

il va falloir gérer les event change des combobox pour filtrer la listbox
et bien c'est simple on doit filtrer la colonne 3 et 4 en fonction de combobox 4 et 5
on va donc appeler une fonction
qui va gérer le value des combo en tant qu'argument
et c'est là que je reviens sur le symbole de tout à l'heure ( le "*")
que l'on va tester dans une boucle avec like
si la combo est vide l'argument sera "*" sinon sa valeur
terminé tout le monde descends
VB:
'evenement change des comboboxs
Private Sub ComboBox4_Change():
    If ActiveControl.Name = "ComboBox4" Then filter_data_in_listbox: TextBox12 = "": TextBox13 = ""
End Sub

Private Sub ComboBox5_Change():
    If ActiveControl.Name = "ComboBox5" Then filter_data_in_listbox: TextBox12 = "": TextBox13 = ""
End Sub
'la fonction filtre
Code:
Function filter_data_in_listbox()
    Dim ArgmT1, ArgmT2, Tablo, I&, C&
    If ComboBox4.Value <> "" Then ArgmT1 = ComboBox4.Value Else ArgmT1 = "*"    'si la combo4 est vide l'argument de recherche dans la colonne 3  sera  le "*" sinon sa valeur
    If ComboBox5.Value <> "" Then ArgmT2 = ComboBox5.Value Else ArgmT2 = "*"    'si la combo5 est vide l'argument de recherche dans la colonne 4 sera  le "*" sinon sa valeur
    Tablo = ThisWorkbook.Sheets("Bdd_ngap").Range("_Tdata").Value
    ListBox1.Clear
    For I = 1 To UBound(Tablo)
        If Tablo(I, 3) Like ArgmT1 And Tablo(I, 4) Like ArgmT2 Then
            ListBox1.AddItem ""
            For C = 1 To UBound(Tablo, 2)
                ListBox1.List(ListBox1.ListCount - 1, C - 1) = Tablo(I, C)
            Next
        End If
    Next
End Function

il faudra aussi gérer le click dans la listbox pour remplir les textbox
VB:
'evenement change de la listbox
Private Sub ListBox1_Change()
    With ListBox1
        If .ListIndex = -1 Then Exit Sub
        ComboBox4 = .List(.ListIndex, 2)
        ComboBox5 = .List(.ListIndex, 3)
        TextBox12 = .List(.ListIndex, 0)
        TextBox13 = .List(.ListIndex, 1)
    End With
End Sub
tu constatera que les event change des combo sont conditionnés par le activecontrol.name
tout simplement par ce que l'on veut que ça agisse quand on clique dedanscar les event se déclenche de différente manière (un click dessus, un nouveau remplissage, un clear,etc...)

pour le bouton d'envoie vers le tableau des patients là ENCORE UNE FOIS!!!! apprenez à travailler avec un tableau structuré puisque c'est ce que vous utilisez
allez hop l'event bouton et sa fonction attaché ! (bien que je vois pas l'utilité ici de séparer mais bon)
VB:
'bouton d'envoie vers le tableau bdd_client
Private Sub CommandButton1_Click(): copy_from_form: End Sub
Function copy_from_form()
   Dim Ctrl
   For Each Ctrl In Me.Controls
    If Ctrl.Tag = "x" Then If Ctrl.Value = "" Then MsgBox "veuillez remplir tout les champs SVP": Exit Function
   Next
    With ThisWorkbook.Sheets("Bdd_patient").Range("Bdd_patient").ListObject.ListRows.Add.Range
        .Cells(1).Value = TextBox1.Value
        .Cells(2).Value = TextBox2.Value
        .Cells(3).Value = TextBox9.Value
        .Cells(4).Value = TextBox12.Value
        .Cells(5).Value = TextBox13.Value
    End With
End Function
pour le coup sur ton textbox 9 pour la date de soin je t'ai ajouté mon calendar avec un joli bouton représentatif
pour le reste c'est de l’aménagement

voilà comme tu peux le voir les codes sont plus simples quand on travaille avec la bonne clé à mollette hein

ça donne quoi au fait ?
demo.gif



demo.gif


le code complet du userform

Code:
'exemple  recréé par patricktoulon
Option Explicit


'affiche le calendar   pour le textbox9
Private Sub BtCalendar_Click()
TextBox9 = Calendar.ShowX(TextBox9, 2, 0, 1)
End Sub

Private Sub UserForm_Initialize()
   BtCalendar.Picture = Application.CommandBars.GetImageMso("ContentControlDate", 30, 30)
   With ListBox1
        .ColumnCount = 5
        .ColumnWidths = "30;30;175;60;120"
        .List = ThisWorkbook.Sheets("Bdd_ngap").Range("_Tdata").Value
    End With
    ComboBox4.List = ThisWorkbook.Sheets("Bdd_ngap").[ListCBB4].Value
    ComboBox5.List = ThisWorkbook.Sheets("Bdd_ngap").[ListCBB5].Value
End Sub

'evenement change des comboboxs
Private Sub ComboBox4_Change():
    If ActiveControl.Name = "ComboBox4" Then filter_data_in_listbox: TextBox12 = "": TextBox13 = ""
End Sub

Private Sub ComboBox5_Change():
    If ActiveControl.Name = "ComboBox5" Then filter_data_in_listbox: TextBox12 = "": TextBox13 = ""
End Sub

'la fonction filtre
Function filter_data_in_listbox()
    Dim ArgmT1, ArgmT2, Tablo, I&, C&
    If ComboBox4.Value <> "" Then ArgmT1 = ComboBox4.Value Else ArgmT1 = "*"    'si la combo4 est vide l'argument de recherche dans la colonne 3  sera  le "*" sinon sa valeur
    If ComboBox5.Value <> "" Then ArgmT2 = ComboBox5.Value Else ArgmT2 = "*"    'si la combo5 est vide l'argument de recherche dans la colonne 4 sera  le "*" sinon sa valeur
    Tablo = ThisWorkbook.Sheets("Bdd_ngap").Range("_Tdata").Value
    ListBox1.Clear
    For I = 1 To UBound(Tablo)
        If Tablo(I, 3) Like ArgmT1 And Tablo(I, 4) Like ArgmT2 Then
            ListBox1.AddItem ""
            For C = 1 To UBound(Tablo, 2)
                ListBox1.List(ListBox1.ListCount - 1, C - 1) = Tablo(I, C)
            Next
        End If
    Next
End Function

'evenement change de la listbox
Private Sub ListBox1_Change()
    With ListBox1
        If .ListIndex = -1 Then Exit Sub
        ComboBox4 = .List(.ListIndex, 2)
        ComboBox5 = .List(.ListIndex, 3)
        TextBox12 = .List(.ListIndex, 0)
        TextBox13 = .List(.ListIndex, 1)
    End With
End Sub

'bouton d'envoie vers le tableau bdd_client
Private Sub CommandButton1_Click(): copy_from_form: End Sub
Function copy_from_form()
   Dim Ctrl
   For Each Ctrl In Me.Controls
    If Ctrl.Tag = "x" Then If Ctrl.Value = "" Then MsgBox "veuillez remplir tout les champs SVP": Exit Function
   Next
    With ThisWorkbook.Sheets("Bdd_patient").Range("Bdd_patient").ListObject.ListRows.Add.Range
        .Cells(1).Value = TextBox1.Value
        .Cells(2).Value = TextBox2.Value
        .Cells(3).Value = TextBox9.Value
        .Cells(4).Value = TextBox12.Value
        .Cells(5).Value = TextBox13.Value
    End With
End Function


Private Sub CommandButton10_Click(): Unload Me: End Sub

Voila comme je l'ai dit en haut c'était juste en passant ;)
 

Pièces jointes

  • Projet appli_Copie V pat .xlsm
    109.1 KB · Affichages: 11

franxy

XLDnaute Junior
Quel boulot !!!! Je ne connaissais pas cette fonction calendar.... Au passage j'ai réussi à corriger la date dans le code pour les 10 Novembre.... remplacer par le 1 Novembre... 💪

1711542458303.png


Je chargeai ma Cbb4 avec la colonne G de Bdd_ngap
Je laissai une cellule vide en premier pour charger toute la liste dans la listbox, ensuite viennent les actes le plus couramment utilisés et non par ordre alphabétique.
Si toutefois, l'acte cherché apparaissant dans la liste, un click sur cette listbox chargeait les textbox de la ligne voulue
Sauf que certains items de la colonne G, en regardant de plus pres dans la colonne Cbb4 offrent une multitude de choix. Filtrant avec la Cbb5 pour affiner

1711543984214.png


De meme pour la colonne I, si je ne mettait pas de * ( ou autre chose, je le concède) le chargement de la listbox après selection dans Cbb4, ne mettait pas les items sans sc ou ac. ma bidouille s'arrete là, je ne sais expliquer pourquoi.

Merci encore
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
la fonction calendar n'est pas une fonction mais bien un interface calendrier personnel multilingue ,conçu dans un userform par mes soins
et compatible windows et Mac
tu le trouvera ici
listbox après selection dans Cbb4, ne mettait pas les items sans sc ou ac. ma bidouille s'arrete là, je ne sais expliquer pourquoi.
bon ben alors fait comme je te dis et çà marchera beaucoup mieux
la tes deux combos sont syncro dans le filtre
 

franxy

XLDnaute Junior
J'ai peur que le filtre par date dans ma feuille bbd_patient ne se fasse que sur les jours et ne tienne pas compte du mois et année. Celà provient il de la forme du calendrier ?
Toutes mes colonnes date étant pourtant au format date dd/mm/yyyy
 

Discussions similaires

Statistiques des forums

Discussions
312 520
Messages
2 089 297
Membres
104 092
dernier inscrit
karbone57