Développement d'une macro VBA

Résolu/Fermé
nonossov Messages postés 611 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 17 janvier 2020 - Modifié par Whismeril le 4/04/2015 à 13:46
nonossov Messages postés 611 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 17 janvier 2020 - 6 avril 2015 à 10:30
Bonjour,
j'ai une macro de recherche conditionnelle et j'ai besoin de votre aide pour la developper le critére multichoix,
dans cette macro, j'ai la possibilité de recherche sur un seul critére par exemple:
-Non aplicable
-fini
-encours
je veux la possibilité de multichoix, que je puisse cocher deux options
voila le code
Private [/contents/446-fichier-sub Sub] UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim TX(3, 1) As String 'déclare le tableau TX (4 lignes [de 0 à 3], deux colonnes [de 0 à 1])
Dim I As Byte 'déclare la variable I (Incrément)

Set O = Sheets("Feuil1") 'définit l'onglet O
TC = O.Range("A1").CurrentRegion 'définit le tableau de cellules TC
TX(0, 0) = "Tous" 'définit la variable (0, 0) du tableau TX
TX(0, 1) = "Tous" 'définit la variable (0, 1) du tableau TX
TX(1, 0) = "" 'définit la variable (1, 0) du tableau TX
TX(1, 1) = "En Cours" 'définit la variable (1, 1) du tableau TX
TX(2, 0) = "X" 'définit la variable (2, 0) du tableau TX
TX(2, 1) = "Dossier Fini" 'définit la variable (2, 1) du tableau TX
TX(3, 0) = "NA" 'définit la variable (3, 0) du tableau TX
TX(3, 1) = "Non Applicable" 'définit la variable (3, 1) du tableau TX
Me.ComboBox1.AddItem "Toutes" 'ajoute le texte à la ComboBox1
For I = 2 To O.Cells(1, Application.Columns.Count).End(xlToLeft).Column
    Me.ComboBox1.AddItem O.Cells(1, I)
Next I
With Me.ComboBox2 'prend en compte la ComboBox2
    .ColumnCount = 2 'définit le nombre de colonnes [2]
    .ColumnWidths = "0 pt;" 'masque la première colonne
    For I = 0 To 3 'boucle sur les 4 élément du tableau TX
        .AddItem 'ajoute un élément
        .Column(0, I) = TX(I, 0) 'ajoute dans la colonne 0 de la ComboBox2 (masquée) la variable (0,I) du tableau TX
        .Column(1, I) = TX(I, 1) 'ajoute dans la colonne 1 de la ComboBox2 la variable (1,I) du tableau TX
    Next I 'prochain élément de la boucle
End With 'fin de la prise en compte de la ComboBox2
Me.ComboBox2.ListIndex = 0 'affiche le premier élément de la ComboBox2
Me.ComboBox1.ListIndex = 0 'affiche le premier élément de la ComboBox1
End Sub

Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
Dim I As Integer 'déclare la variable I (Incrément de ligne)
Dim J As Integer 'déclare la variable J (incrément de colonne)
Dim K As Integer 'déclare la variable K (incrément de colonne)

'si la valeur affichée dans la ComboBox1 n'est pas une des valeur qu'elle contient, sort de la procédure
If Me.ComboBox1.ListIndex < 0 Then Exit Sub

' condition 1 : si la ComboBox1 affiche "Toutes"
If Me.ComboBox1.Value = "Toutes" Then
    Me.ListBox1.Clear 'vide la Listbox1
    Me.ListBox1.ColumnCount = UBound(TC, 2) 'définit le nombre de colonnes de la ListBox1 (autant que le tableau TC)
    
    'agit en fonction de la valeur de la ComboBox2
    Select Case Me.ComboBox2.Value
        
        Case "Tous" 'cas ou la ComboBox2 affiche "Tous"
            Me.ListBox1.List = TC 'alimente la ListBox1 avec l'intégralité du tableau TC
        
        Case Else 'tous les autres cas
            Me.ListBox1.Clear 'vide la ListBox1
            
            'première ligne de titres de la ListBox1
            With Me.ListBox1 'prend en compte la Listbox1
                .AddItem 'ajoute un élément
                .Column(0, .ListCount - 1) = "Sociétés" 'ajoute le texte à la colonne 0 de la ListBox1
                .Column(1, .ListCount - 1) = "TVA" 'ajoute le texte à la colonne 1 de la ListBox1
                .Column(2, .ListCount - 1) = "Taxe Pro" 'ajoute le texte à la colonne 2 de la ListBox1
                .Column(3, .ListCount - 1) = "Paie" 'ajoute le texte à la colonne 3 de la ListBox1
                .Column(4, .ListCount - 1) = "Is" 'ajoute le texte à la colonne 4 de la ListBox1
            End With 'fin de la prise en compte de la Listbox1
            
            'fitrage des données en fonction de la valeur de la ComboBox2 (stockée dans la colonne masquée = 0)
            For I = 2 To UBound(TC, 1) 'boucle 1 : sur toutes les lignes I du tableau de cellules TC (en partant de la seconde)
                For J = 1 To UBound(TC, 2) 'boucle 2 : sur toutes les colonnes J du tableau de cellule TC
                    'condition : si la valeur ligne I colonne J de TC est égale a la maleur masquée de la ComboBox2
                    If UCase(TC(I, J)) = UCase(Me.ComboBox2.Column(0, Me.ComboBox2.ListIndex)) Then
                        With Me.ListBox1 'prend en compte la Listbox1
                            .AddItem 'ajoute un élément
                            For K = 1 To Me.ListBox1.ColumnCount - 1 'boucle 3 : sur toutes les colonnes K de la ListBox1
                                'ajoute à la colonne K - 1 de la ListBox1 la valeur ligne I colonne K de TC
                                .Column(K - 1, .ListCount - 1) = TC(I, K)
                            Next K 'prochaine colonne de la boucle 3
                        End With 'fin de la prise en compte de la ListBox1
                        Exit For 'sort de la boucle 2
                    End If 'fin de la condition
                Next J 'prochaine colonne de la boucle 2
            Next I 'prochaine ligne de la boucle 1
            
    End Select 'fin de l'action en fonction de la valeur de la ComboBox2

Else 'sinon (condition 1 : si la ComboBox1 affiche autre chose que "Toutes")
    
    'agit en fonction de la valeur de la ComboBox2
    Select Case Me.ComboBox2.Value
        
        Case "Tous" 'cas ou la ComboBox2 affiche "Tous"
            Me.ListBox1.Clear 'vide la ListBox1
            Me.ListBox1.ColumnCount = 2 'définit le nombre de colonne de la ListBox1
            'première ligne de titres de la ListBox1
            With Me.ListBox1 'prend en compte la Listbox1
                .AddItem 'prend en compte la Listbox1
                .Column(0, .ListCount - 1) = "Sociétés" 'ajoute le texte à la colonne 0 de la ListBox1
                .Column(1, .ListCount - 1) = Me.ComboBox1.Value 'ajoute à la colonne 1 de la ListBox1 la valeur de la ComboBox1
            End With 'fin de la prise en compte de la Listbox1
            For I = 2 To UBound(TC, 1) 'boucle sur toutes les lignes I du tableau de cellules TC
                With Me.ListBox1 'prend en compte la ListBox1
                    .AddItem 'ajoute un élément
                    'ajoute à la colonne 0 de la Listbox1 la valeur ligne I colonne 1 de TC
                    .Column(0, .ListCount - 1) = TC(I, 1)
                    'ajoute à la colonne 1 de la Listbox1 la valeur de TC en ligne I colonne égale à la colonne correspondant
                    'à la propriété [ListIndex] + 1 de la ComboBox1
                    .Column(1, .ListCount - 1) = TC(I, Me.ComboBox1.ListIndex + 1)
                End With 'fin de la prise en compte de la ListBox1
            Next I 'prochaine ligne de la boucle
        
        Case Else 'tous les autres cas de la ComboBox2
        
            Me.ListBox1.Clear 'vide la ListBox1
            'première ligne de titres de la ListBox1
            With Me.ListBox1 'prend en compte la Listbox1
                .AddItem 'prend en compte la Listbox1
                .Column(0, .ListCount - 1) = "Sociétés" 'ajoute le texte à la colonne 0 de la ListBox1
                .Column(1, .ListCount - 1) = Me.ComboBox1.Value 'ajoute à la colonne 1 de la ListBox1 la valeur de la ComboBox1
            End With 'fin de la prise en compte de la Listbox1
            For I = 2 To UBound(TC, 1) 'boucle sur toutes les ligne du tableau TC (en partant de la seconde)
                'condition : si la valeur de TC en ligne 1 , colonne correspondante à à la propriété [ListIndex] + 1
                'de la ComboBox1 est égale à la valeur de la Combobox1 et
                'si la valeur de TC ligne I colonne correspondante à à la propriété [ListIndex] + 1 de la ComboBox1
                'est égale la valeur masquée (en colonne 0) de la ComboBox2
                If TC(1, Me.ComboBox1.ListIndex + 1) = Me.ComboBox1.Value And _
                   UCase(TC(I, Me.ComboBox1.ListIndex + 1)) = UCase(Me.ComboBox2.Column(0, Me.ComboBox2.ListIndex)) Then
                    With Me.ListBox1 'prend en compte la ListBox1
                        .AddItem 'ajoute un élément
                        'ajoute à la colonne 0 de la Listbox1 la valeur ligne I colonne 1 de TC
                        .Column(0, .ListCount - 1) = TC(I, 1)
                        'ajoute à la colonne 1 de la Listbox1 la valeur de TC en ligne I colonne égale à la colonne correspondant
                        'à la propriété [ListIndex] + 1 de la ComboBox1
                        .Column(1, .ListCount - 1) = TC(I, Me.ComboBox1.ListIndex + 1)
                    End With 'fin de la prise en compte de la ListBox1
                End If 'fin de la condition
            Next I 'prochaine ligne de la boucle
            
        End Select 'fin de l'action en fonction de la valeur de la ComboBox2
        
End If 'fin de la condition 1
End Sub


et voila le fichier excel pour mieux comprendre merci
https://www.cjoint.com/c/EDenSKNMuVk
merci infiniment

EDIT: Précision du langage dans la coloration syntaxique.
A voir également:

1 réponse

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
Modifié par ThauTheme le 4/04/2015 à 23:22
Bonsoir Nonossov/Harbouli, bonsoir le forum,

J'ai répondu à ton problème dans un autre forum et je le regrette car je ne trouve pas trop élégant que tu utilises un code qui ne t'appartient pas dans un autre forum que celui où il t'a été proposé...
Finalement Marc avait raison. Tu n'as aucune éthique. Seul le résultat compte pour toi... Tu utilises tous les forums et fait travailler tous les bénévoles sans te soucier de l'effort qu'ils font pour toi.
Encore une fois, je regrette amèrement de m'être proposé pour t'aider sur ton problème... Je pourrais supprimer ma dernière proposition mais comme j'ai plus d'éthique que toi je t'en fais cadeau...

Bon vent messieurs Nonossov / Harbouli ! Au plaisir de ne plus jamais vous croiser...

À plus,
ThauTheme
3
nonossov Messages postés 611 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 17 janvier 2020
6 avril 2015 à 10:28
Mr,ThauTheme c'est vous qu'a répondu a mon problème!
je veux remercie tout d'abord a votre effort, et je veux dire que j'ai été très besoin de cette macro ce matin pour répondre aux mes exigences professionnelles,
je suis trés désolé pour ce que je faisais, je n'ai aucune interet de faire travail tous les bénévoles, j'avais une idée de trouve une solution, et j'ai pas cru que je vais faire tous ces probléme je m'excuse pour tous ce que j'ai fait, je respectent tous les forums et le travail de ses membres, je suis trés dosélé pour ce j'ai construit avec une bonne fois, heuresment j'ai trouve une personne noble ThauTheme, malgré les les fautes que j'ai faites, il m'a aidé,
0
nonossov Messages postés 611 Date d'inscription lundi 29 décembre 2014 Statut Membre Dernière intervention 17 janvier 2020
6 avril 2015 à 10:30
Pour l'info, j'ai pas mentionné que ce code m'appartient dans les forums que j'ai le publié,
0