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
Moi je vous conseille de continuer avec un objet ComboBoxLiées CLs et un ControlsAssociés CAs pour la base Patient.
Leur méthode ValeurVers se charge de convertir automatiquement les textes de contrôles dont ils ont la charge en valeurs de cellules de types de données corrects. Les procédures à mettre en place sont les même que celles de mon CLsCAsContacts.xlsm du poste #2.
Si vous bloquez je prendrai la relève, mais ça vous aura fait faire un exercice …
En creant d'autre texbox14, 15 et 16 avec le calendar associé, j'ai un message de de Nom, ambigu detecté, cela reste pourtant le meme ?
Faut il faire autre chose, declarer qqpart ?
re ben ma fois le message est clair non?
il ne peut pas y avoir plusieurs btcalendar_click
chaque bouton associé a un textbox pour le calendar
doit avoir son nom unique et par conséquent son nom_click unique aussi
alors tu va faire comme suit
chaque bouton attaché a un textbox pour le calendar devra porter le nom du textbox préfixé par "BT"
exemple
pour le TextBox15 le bouton s'appellera BtTextbox15
pour le TextBox16 le bouton s'appellera BtTextBox16
on aura donc un code
VB:
Private sub BtTextBox15_Click()
TextBox15=Calendar.ShowX(TextBox15,2,0,1)
End Sub
Private sub BtTextBox16_Click()
TextBox16=Calendar.ShowX(TextBox16,2,0,1)
End Sub
'etc..
re ben ma fois le message est clair non?
il ne peut pas y avoir plusieurs btcalendar_click
chaque bouton associé a un textbox pour le calendar
doit avoir son nom unique et par conséquent son nom_click unique aussi
alors tu va faire comme suit
chaque bouton attaché a un textbox pour le calendar devra porter le nom du textbox préfixé par "BT"
exemple
pour le TextBox15 le bouton s'appellera BtTextbox15
pour le TextBox16 le bouton s'appellera BtTextBox16
on aura donc un code
VB:
Private sub BtTextBox15_Click()
TextBox15=Calendar.ShowX(TextBox15,2,0,1)
End Sub
Private sub BtTextBox16_Click()
TextBox16=Calendar.ShowX(TextBox16,2,0,1)
End Sub
'etc..
Comme je m'en doutais..... sur le coup j'ai qqpeu paniqué, et toute cette journée, j'avais cela en tete, et il m'est apparu la lumiere si, si d'un cas similaire sur un autre sujet.
Merci néanmoins
Remarque: pour prendre en compte des contrôles supplémentaires, il suffit d'ajouter des CAs.Add dans la Sub UserForm_Initialize à la suite de ceux qu'il y a déjà. Le reste ne change pas.
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
'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
Bonjour,
par contre je comprends pas où se trouve la subtilité pour extraire la donnée Coefficient du useform dans la Bdd_Patient en format nombre plutôt que texte, j'ai beau cherché dans le code, dans le format de la colonne dédiée dans la Bdd, je vois pas. S'agit il de la structure du code elle-même ?
Car ensuite je fais un TCD d'analyse, qui bien sur ne prend pas en compte
Une idee ?
Merci
En tout cas les méthode ValeursDepuis et ValeursVers de mes objets se chargent automatiquement des conversions de types de données.
Si vous voulez le savoir, pour une TextBox c'est la propriété Valeur du module de classe CassoTBx qui est invoquée.
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.