Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
XL 2013Tri d'une listbox sur 2 combobox en cascade
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
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.
Il n'y a pas une seule boucle dans mon UFmContact. Il n'y en a que dans la programmation de service, c'est à dire le module standard MSujetCBx et les modules de classe.
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.
Il n'y a pas une seule boucle dans mon UFmContact. Il n'y en a que dans la programmation de service, c'est à dire le module standard MSujetCBx et les modules de classe.
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
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.
re
Bonjour à tous
Juste en passant
Alors j'ai repris le fichier en post #1
que dire? 1° 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
2° 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
3° 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é
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 ?
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
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...
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
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.
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
Bonjour a tous voici ma dernière version de mon calendrier all excel version Une video très courte en bas dette présentation vous montre comment j'installe le calendar de mon fichier dans un autre fichier une autre video dans les mises a...
excel-downloads.com
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.
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
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.