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: 10

Dranreb

XLDnaute Barbatruc
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 …
 

franxy

XLDnaute Junior
re
en vba utilise cdate ou datevalue
et dans le bouton du userform
VB:
.Cells(3).Value = cdate(TextBox9.Value)
tes cellules auront bien des dates à l'intérieur et donc tes autofilter chrono fonctionneront
voila voila ;)
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 ?

1711608106622.png
 

patricktoulon

XLDnaute Barbatruc
Bonjour
🤣 🤣
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..
 

franxy

XLDnaute Junior
Bonjour
🤣 🤣
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 👍
 

franxy

XLDnaute Junior
l'incrémentation d'un nouveau
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é

Regarde la pièce jointe 1193613

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 ?
Regarde la pièce jointe 1193615


Regarde la pièce jointe 1193616

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 ;)
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
 

Dranreb

XLDnaute Barbatruc
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.
 

Discussions similaires

Statistiques des forums

Discussions
315 093
Messages
2 116 133
Membres
112 667
dernier inscrit
foyoman