XL 2010 Liste filtrée pour combobox à 1 ou x colonne(s) (Titre màj)

cathodique

XLDnaute Barbatruc
Bonjour,

Je fais appel aux férus de VBA (pas comme moi, Vbiste autodidacte du dimanche).

Au fil de mes recherches j'ai trouvé dans les ressources un fichier de @Dudu2 (ICI) très pratique.

Je voudrai appliquer son code à plusieurs ComboBox. Mais je ne sais pas utilisé les modules de classe.

J'ai pourtant suivi des tutos en vidéo (l'anglais n'étant pas mon fort) sans comprendre grand chose.

Dernièrement, @patricktoulon a eu la gentillesse de corriger un code trouver sur le net et a dédié une vidéo pour expliquer ce que sont les modules de Classe. J'ai compris dans l'ensemble le principe. Mais ça coince toujours lors de l'écriture du code. Petite cervelle restera petite cervelle😢😢

Je ne joins pas de fichier, vous le trouverez en suivant le lien.

Je vous en remercie par avance.

Bon dimanche.

nb: j'ai envoyé à @Dudu2 pour l'informer
 
Dernière édition:
Solution
re
oui j'ai fais cette erreur jean-marie a corrigé
je vous lais éviter de repasser tout les items en revu en cas de grande liste
perso je corrigerais comme ça
VB:
For i = .ListCount - 1 To Application.Max(.ListCount - 3, 0) Step -1
tout ton code et tes controls fonctionnent dans mon userform

Dudu2

XLDnaute Barbatruc
Bonjour la liste,
Je voudrai appliquer son code à plusieurs ComboBox
En effet ce serait bien de mieux comprendre ce que tu veux faire.
Combien de ComboBoxes concernées ?
Car ce n'est pas parce que tu utilises le code de la ressource qu'il te faudrait le répliquer autant de fois qu'il y a de ComboBoxes. Ce code est indépendant et peut s'appliquer à plusieurs ComboBoxes.
 

cathodique

XLDnaute Barbatruc
Bonjour la liste,

En effet ce serait bien de mieux comprendre ce que tu veux faire.
Combien de ComboBoxes concernées ?
Car ce n'est pas parce que tu utilises le code de la ressource qu'il te faudrait le répliquer autant de fois qu'il y a de ComboBoxes. Ce code est indépendant et peut s'appliquer à plusieurs ComboBoxes.
Bonjour,

En fait, pour mon fichier j'en ai 4. Mais sur d'autres futurs fichiers, je sais pas au juste combien.
2, 3, 4 ou plus et pouvoir utiliser ton idée, Filtrage automatique à la saisie.
Merci.
 

Dudu2

XLDnaute Barbatruc
Si tu as 3 ComboBoxes, sur chacun des évènements propre à chaque ComboBox tu fais ce qui est décris en ressource. Faire une classe se justifierait si tu en avait 10 ou 100, mais là...
VB:
'---------
'ComboBox1
'---------
Private Sub ComboBox1_Enter()
    Call SaisieFiltréeComboBoxEnter(Me.ComboBox1, ThisWorkbook.Worksheets("Listes").ListObjects("Tableau1").DataBodyRange)
End Sub

Private Sub ComboBox1_Change()
    Call SaisieFiltréeComboBoxChange(Me.ComboBox1)
End Sub

'---------
'ComboBox2
'---------
Private Sub ComboBox2_Enter()
    Call SaisieFiltréeComboBoxEnter(Me.ComboBox2, ThisWorkbook.Worksheets("Listes").ListObjects("Tableau2").DataBodyRange)
End Sub

Private Sub ComboBox2_Change()
    Call SaisieFiltréeComboBoxChange(Me.ComboBox2)
End Sub

'---------
'ComboBox3
'---------
Private Sub ComboBox3_Enter()
    Call SaisieFiltréeComboBoxEnter(Me.ComboBox3, ThisWorkbook.Worksheets("Listes").ListObjects("Tableau3").DataBodyRange)
End Sub

Private Sub ComboBox3_Change()
    Call SaisieFiltréeComboBoxChange(Me.ComboBox3)
End Sub
 

cathodique

XLDnaute Barbatruc
Bonjour la liste,

En effet ce serait bien de mieux comprendre ce que tu veux faire.
Combien de ComboBoxes concernées ?
Car ce n'est pas parce que tu utilises le code de la ressource qu'il te faudrait le répliquer autant de fois qu'il y a de ComboBoxes. Ce code est indépendant et peut s'appliquer à plusieurs ComboBoxes.
Bonjour,

Sur le fichier de @Dudu2, la combobox se filtre à la saisie c'est ce que je voudrais faire sur certaines comboboxs. Le nombre de combobox peut être variable, dans le sens d'avoir un code réutilisable dans différents userform.
Oui, le code est indépendant. Comment pourrait-on transformer ce code en module de classe?
J'espère @patricktoulon que j'ai été plus clair.

Merci beaucoup.
 

Pièces jointes

  • Saisie assistée ComboBox.xlsm
    76.9 KB · Affichages: 3

cathodique

XLDnaute Barbatruc
Si tu as 3 ComboBoxes, sur chacun des évènements propre à chaque ComboBox tu fais ce qui est décris en ressource. Faire une classe se justifierait si tu en avait 10 ou 100, mais là...
VB:
'---------
'ComboBox1
'---------
Private Sub ComboBox1_Enter()
    Call SaisieFiltréeComboBoxEnter(Me.ComboBox1, ThisWorkbook.Worksheets("Listes").ListObjects("Tableau1").DataBodyRange)
End Sub

Private Sub ComboBox1_Change()
    Call SaisieFiltréeComboBoxChange(Me.ComboBox1)
End Sub

'---------
'ComboBox2
'---------
Private Sub ComboBox2_Enter()
    Call SaisieFiltréeComboBoxEnter(Me.ComboBox2, ThisWorkbook.Worksheets("Listes").ListObjects("Tableau2").DataBodyRange)
End Sub

Private Sub ComboBox2_Change()
    Call SaisieFiltréeComboBoxChange(Me.ComboBox2)
End Sub

'---------
'ComboBox3
'---------
Private Sub ComboBox3_Enter()
    Call SaisieFiltréeComboBoxEnter(Me.ComboBox3, ThisWorkbook.Worksheets("Listes").ListObjects("Tableau3").DataBodyRange)
End Sub

Private Sub ComboBox3_Change()
    Call SaisieFiltréeComboBoxChange(Me.ComboBox3)
End Sub
Oui, je suis d'accord avec toi.
J'ai ouvert ce fil dans un double objectif: apprendre les modules de classe et résoudre mon actuel problème.
Il y a des élèves qui comprennent et assimilent rapidement. Hélas, je fais partie de ceux qui n'ont
cette facilité de compréhension et d'assimilation.
Merci beaucoup.
 

Dudu2

XLDnaute Barbatruc
Tu vas t'emméler les crayons avec un module de classe, et pour si peu ce n'est pas utile.

Mais si tu veux vraiment le faire alors voici un exemple simple de mise en œuvre d'une classe avec évènements pour des TextBoxes de UserForm. A adapter pour tes ComboBoxes, sachant que sur l'évènement _Enter() il faudra passer une référence à la liste des items spécifique de la ComboBox ce qui sera un problème supplémentaire car il faudra trouver une convention ou une table liant le nom de la ComboBox et sa liste d'items dédiée.

C'est un Classe indépendante (ma préférence) mais @patricktoulon pourrait te faire un exemple avec la classe du UserForm lui-même instanciée autant de fois que nécessaire.
 

Pièces jointes

  • VBA UserForm avec WithEvents sur TextBox Module de Classe.xlsm
    25.6 KB · Affichages: 3
Dernière édition:

cathodique

XLDnaute Barbatruc
@Dudu2 : à quoi pourrait servir cette procédure
La ligne MsgBox est mise en commentaire. J'ai supprimé l'apostrophe. Dans quel cas, ce message s'affiche?
VB:
Private Sub ComboBox1_Change()
    If ComboBoxChange(Me.ComboBox1) Then
        'MsgBox "Valeur choisie = <" & Me.CobAutre.List(Me.ComboBox1.ListIndex) & ">"
    End If
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
perso je ne m'ennuie pas avec tout ça
j'ai ma toute petite fonction applicable a toute mes combo
si je clique sur le dropbutton j'ai ma liste complète
si je tape ben j'ai la liste filtrée
exemple avec un userform et une combobox "ComboBox1"
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
Option Explicit

Dim tablo

Private Sub UserForm_Activate()
    Dim LiG&
    With Range("tableaulivres")
        tablo = .Resize(, .Columns.Count + 1).Value
        For LiG = 1 To UBound(tablo): tablo(LiG, UBound(tablo, 2)) = LiG: Next
        ComboBox1.List = tablo
        ComboBox1.ColumnWidths = .Columns(1).Width & ";" & .Columns(2).Width
    End With
End Sub

Private Sub ComboBox1_DropButtonClick()
    ComboBox1.List = tablo
End Sub

Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    ListeFiltree ComboBox1, tablo    ' si pas d'argument colonne la recherche se fait dans toute les colonnes
End Sub


Function ListeFiltree(combo As Object, tablo, Optional col As Long = -1)
    Dim A&, LiG, C, tbl(), ok As Boolean, ArgmT$, CoL1&, CoL2&, Cx&
    ArgmT = combo.Value: If combo.Value = "" Then ArgmT = "*"
    If col = -1 Then CoL1 = LBound(tablo): CoL2 = UBound(tablo, 2) Else CoL1 = LBound(tablo): CoL2 = LBound(tablo)
    If combo.Value = "" Then combo.Clear: Exit Function
    For LiG = 1 To UBound(tablo)
        ok = False
        For C = CoL1 To CoL2
            If UCase(tablo(LiG, C)) Like "*" & UCase(ComboBox1.Value) & "*" Then ok = True
        Next
        If ok Then
            A = A + 1: ReDim Preserve tbl(1 To 3, 1 To A)
            For Cx = 1 To UBound(tbl): tbl(Cx, A) = tablo(LiG, Cx): Next
        End If
    Next
    If A > 0 Then
        If A > 1 Then combo.List = Application.Transpose(tbl) Else combo.Column = tbl
    Else
        combo.Clear
    End If
    combo.DropDown
End Function

et je fait la même opération pour les autres combobox
terminé ;)
la sub peut rester dans le userform ou un module on s'en fou
 

cathodique

XLDnaute Barbatruc
re
perso je ne m'ennuie pas avec tout ça
j'ai ma toute petite fonction applicable a toute mes combo
si je clique sur le dropbutton j'ai ma liste complète
si je tape ben j'ai la liste filtrée
exemple avec un userform et une combobox "ComboBox1"
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
Option Explicit

Dim tablo

Private Sub UserForm_Activate()
    Dim LiG&
    With Range("tableaulivres")
        tablo = .Resize(, .Columns.Count + 1).Value
        For LiG = 1 To UBound(tablo): tablo(LiG, UBound(tablo, 2)) = LiG: Next
        ComboBox1.List = tablo
        ComboBox1.ColumnWidths = .Columns(1).Width & ";" & .Columns(2).Width
    End With
End Sub

Private Sub ComboBox1_DropButtonClick()
    ComboBox1.List = tablo
End Sub

Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    ListeFiltree ComboBox1, tablo    ' si pas d'argument colonne la recherche se fait dans toute les colonnes
End Sub


Function ListeFiltree(combo As Object, tablo, Optional col As Long = -1)
    Dim A&, LiG, C, tbl(), ok As Boolean, ArgmT$, CoL1&, CoL2&, Cx&
    ArgmT = combo.Value: If combo.Value = "" Then ArgmT = "*"
    If col = -1 Then CoL1 = LBound(tablo): CoL2 = UBound(tablo, 2) Else CoL1 = LBound(tablo): CoL2 = LBound(tablo)
    If combo.Value = "" Then combo.Clear: Exit Function
    For LiG = 1 To UBound(tablo)
        ok = False
        For C = CoL1 To CoL2
            If UCase(tablo(LiG, C)) Like "*" & UCase(ComboBox1.Value) & "*" Then ok = True
        Next
        If ok Then
            A = A + 1: ReDim Preserve tbl(1 To 3, 1 To A)
            For Cx = 1 To UBound(tbl): tbl(Cx, A) = tablo(LiG, Cx): Next
        End If
    Next
    If A > 0 Then
        If A > 1 Then combo.List = Application.Transpose(tbl) Else combo.Column = tbl
    Else
        combo.Clear
    End If
    combo.DropDown
End Function

et je fait la même opération pour les autres combobox
terminé ;)
la sub peut rester dans le userform ou un module on s'en fou
Je te remercie beaucoup. J'espère m'en sortir.

Une chose importante que j'ai omis de préciser, est qu'une combo me sert aussi à ajouter dans le tableau qui l'alimente, ce que j'ai saisi dans la combo.

Problème avec le code de @Dudu2, il plante lorsque le tableau alimentant la combobox contient une seule ligne ou vide (array=empty).

Tu m'as bien fourni et expliquer un code pour pallier à ce genre de problème.

J'espère y arriver avec ton présent code.

Merci beaucoup.
 

patricktoulon

XLDnaute Barbatruc
re
je n'ai pas regardé son code
mais je suis étonné que @Dudu2 ai oublié ce petit problème à régler

je repete
dans le cas d'un tableau(x lignes ,y colonnes)
si le filtre donne
1 ligne sur ces colonnes alors control.column=tableau
2 si il est vide alors clear
sinon control.list=le tableau
 

patricktoulon

XLDnaute Barbatruc
re
@Dudu2
des fois à te lire je me demande si tu a bien compris comment ca marche
quand je lis ça dans ton code
'--------------------------------------------------------------
'Placement de toutes les TextBoxes en Classe_ContrôleTVATextBox
'--------------------------------------------------------------


VB:
'-----------------------
'Initialisation UserForm
'-----------------------
Private Sub UserForm_Initialisation()
    Dim Control As Control
    Dim k As Integer
    '--------------------------------------------------------------
    'Placement de toutes les TextBoxes en Classe_ContrôleTVATextBox
    '--------------------------------------------------------------
    k = 0
    For Each Control In Me.Controls
        If TypeOf Control Is msforms.TextBox Then
            k = k + 1
            ReDim Preserve TabTextBoxes(1 To k)
            Set TabTextBoxes(k).TextBox = Control
        End If
    Next Control
End Sub

et quand tu dis

C'est un Classe indépendante (ma préférence) mais @patricktoulon pourrait te faire un exemple avec la classe du UserForm lui-même instanciée autant de fois que nécessaire.
pourquoi dans ta classe ça se passe différemment ??
il n'y a qu'une instance ?🤣🤣


on place pas un controls dans une classe!

on instancie une instance de classe avec une gestion d' event (avec ou pas d'autres membres ou property) pour chaque controls de même type (ou x controls) ;)
ton exemple en l'occurrence ; 2 textboxs =2 instances de classe
ce qui se passerais de même manière si je le faisais avec le module du userform en tant que classe

pour l'exemple je reprends ton code a la lettre près
sauf pour le"As New Classe_TextBox" qui devient "As Niew UserForm2"
et tout le reste du code de ta classe est transféré dans le userform
 

Pièces jointes

  • VBA UserForm avec WithEvents sur TextBox Module de Classe.xlsm
    20.2 KB · Affichages: 5
Dernière édition:

Statistiques des forums

Discussions
313 265
Messages
2 096 665
Membres
106 703
dernier inscrit
cbl