Filtre par Combobox et Affichage dans une ListView Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
S
Satch
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 24 septembre 2015
Version d'Excel : 2010 FR

Message par Satch » 5 octobre 2015, 14:41

Bonjour,

En venant ici j'espère pouvoir résoudre mon problème, avec bien sûr votre aide de première qualité !!!
Ca fait maintenant plusieurs jours que j'essaie mais je dois dire que je sèche .... J'ai trouvé pleins d'exemple, mais qui sont très mal commenté et donc très difficile à comprendre !

Alors voici mon problème :

J'ai un tableau avec des colonnes :

N°Délai | Date du délai | Description | Début du cours | Fin du cours | Demandeurs| Responsables.

J'ai créé mon userform avec une comboBox par Colonne sauf pour les N°Délai, c'est une saisie par texte.
Ma ListView Charge la totalité du tableau se trouvant sur ma feuille a son initialisation et là Pas de soucis.

Ce que je ne sais pas faire c'est que j'aimerai choisir un responsable précis et qu'il m'affiche tous les délais de ce responsable ( filtre ) du style comboResponsable_Change() et que ça filtre immédiatement sans cliquer sur un bouton.

Que si après avoir filtré par responsable je filtre en plus par demandeur il m'affiche uniquement les délais des demandeurs et responsables sélectionnés. Et bien sûr si c'est vide il ne prend pas en compte les critère vides.

Alors je vous remercie d'avance de m'aider et de me guider vers le savoir ... car après 3 jours je suis en dépression ... :-)
Avatar du membre
Banzai64
Fanatique d'Excel
Fanatique d'Excel
Messages : 16'726
Appréciations reçues : 3
Inscrit le : 21 novembre 2010
Version d'Excel : 2003 FR (learning 2010 - 2013)

Message par Banzai64 » 5 octobre 2015, 15:26

Bonjour

Si tu veux augmenter les chances que quelqu'un te réponde, fournis le fichier avec le travail que tu as déjà fait

:joindre:
Image
S
Satch
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 24 septembre 2015
Version d'Excel : 2010 FR

Message par Satch » 5 octobre 2015, 15:42

Oui tu as raison, c'est toujours mieux, alors j'ai fais un exemple de là où je me situe.
Liste des délaisVTest.xls
(68 Kio) Téléchargé 200 fois
Avatar du membre
Banzai64
Fanatique d'Excel
Fanatique d'Excel
Messages : 16'726
Appréciations reçues : 3
Inscrit le : 21 novembre 2010
Version d'Excel : 2003 FR (learning 2010 - 2013)

Message par Banzai64 » 5 octobre 2015, 16:33

Bonjour

Pour commencer
Satch Recherche ListView V001.xlsm
(44.83 Kio) Téléchargé 645 fois
Image
S
Satch
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 24 septembre 2015
Version d'Excel : 2010 FR

Message par Satch » 5 octobre 2015, 17:15

Rolalalallalalal .....
Tu me mets la déprime .... et aussi rapidement !!!

Comment de dire ...... MERCI et encore MERCI c'est exactement ça, et je vois que mon code est optimisé, tellement que je vais maintenant me casser la tête pour tout comprendre.

Alors je vais mettre que c'est résolu, mais s'il y a des détails dans le code que je ne comprends pas je me permettrai de poser les questions dans ce post.


Encore Merci.
S
Satch
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 24 septembre 2015
Version d'Excel : 2010 FR

Message par Satch » 6 octobre 2015, 05:52

Bon .... j'en ai presque pas dormis tellement je ne supporte pas tout comprendre, je vais y aller par étape. Peux-tu m'expliquer ce que ça veut dire celà ... :
 With Ws
    For J = 2 To .Range("A" & Rows.Count).End(xlUp).Row  ' Démarre à la ligne 2 jusqu'au nombre de ligne du dernier résultat trouvé de la colonne A
ça c'est OK
If .Range("C" & J) <> "" Then MondicoStat(.Range("C" & J).Value) = "" ' si la col C de la ligne en cours différent de Vide
mais après le Then ... es ce que c'est si différent de vide alors donne - la valeur du vide ??? Mais pourquoi ?

Et bien sûr la suite :
 If MondicoStat.Count > 0 Then T2 = MondicoStat.keys: Tri T2, LBound(T2), UBound(T2): Me.CbbStatut.List = T2
J'ai pourtant fais des recherches, mais pas facile à décortiquer. Merci d'avance.
Avatar du membre
Banzai64
Fanatique d'Excel
Fanatique d'Excel
Messages : 16'726
Appréciations reçues : 3
Inscrit le : 21 novembre 2010
Version d'Excel : 2003 FR (learning 2010 - 2013)

Message par Banzai64 » 6 octobre 2015, 14:24

Bonjour
If .Range("C" & J) <> "" Then MondicoStat(.Range("C" & J).Value) = ""
Je ne vais pas trop rentrer dans les détails
MondicoStat est un outil(objet) créé par "Set MondicoSat = CreateObject(........)"
La particularité de cet outil est de ne pas accepter les doublons
Le code veut dire : Si la cellule n'est pas vide, on stocke dans l'outil le contenu de la cellule (la clé (moyen de récupérer la valeur) et la valeur de la cellule)
Généralement la clé et la valeur de la cellule sont les mêmes (ce qui donnerait : MondicoStat(.Range("C" & J).Value) = .Range("C" & J).Value) )
Mais comme dans la macro je n'utiliserais que la clé je me passe de stocker la valeur de la cellule (celle-ci est stockée dans la clé)

Je sais que c'est compliqué, je te conseille de lire Ceci
If MondicoStat.Count > 0 Then T2 = MondicoStat.keys: Tri T2, LBound(T2), UBound(T2): Me.CbbStatut.List = T2
Si dans l'outil il y a au moins un élément, on transvase cette liste dans un tableau, on va trier ce tableau et ensuite on associe la propriété List de la ComboBox à ce tableau trié
Image
S
Satch
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 24 septembre 2015
Version d'Excel : 2010 FR

Message par Satch » 8 octobre 2015, 13:46

Bonjour,

Comme tu as pu le constaté, j'ai mis un peu de temps à digérer... et j'ai pas eu une bonne digestion ! :-) Toutefois merci pour le lien, il va falloir que je lise et relise plusieurs fois ces explications, pas évident d'essayer de tout comprendre sans faire que du copier coller .... Mais en tout cas merci.

Puis-je te demander de l'aide pour la compréhension ce cette ligne, car certains éléments me parait flou :
If MondicoStat.Count > 0 Then T2 = MondicoStat.keys: Tri T2, LBound(T2), UBound(T2): Me.CbbStatut.List = T2
Dans le code ci dessous je ne comprends pas très bien lr ( .ListItems.Add , Ws.Cells(J, "B").Address, Ws.Cells(J, "B")) et ( .ListItems(Nb).ListSubItems.Add , , Ws.Cells(J, 1 + I)):
Sub RemplissageListView()
Dim J As Long, I As Integer, Nb As Integer

  With Me.ListView1
    .ListItems.Clear
    For J = 2 To Range("B" & Rows.Count).End(xlUp).Row
      If Ws.Range("B" & J) Like Me.TbNumero & "*" And Ws.Range("C" & J) Like Me.CbbStatut & "*" And _
         Ws.Range("E" & J) Like Me.TbDescription & "*" And Ws.Range("H" & J) Like Me.CbbMandant & "*" And _
         Ws.Range("I" & J) Like Me.CbbResponsable & "*" Then
        .ListItems.Add , Ws.Cells(J, "B").Address, Ws.Cells(J, "B")
        Nb = Nb + 1
        For I = 2 To .ColumnHeaders.Count
          .ListItems(Nb).ListSubItems.Add , , Ws.Cells(J, 1 + I)
        Next I
      End If
    Next J
  End With
End Sub
Et donc du coup là ou tu m'as perdu c'est dans le module ou tu m'as mis ce code :
Sub Tri(A, gauc, droi)
Dim Ref, G As Long, D As Long
Dim Temp

  Ref = A((gauc + droi) \ 2)
  G = gauc: D = droi
  Do
    Do While A(G) < Ref: G = G + 1: Loop
    Do While Ref < A(D): D = D - 1: Loop
    If G <= D Then
      Temp = A(G): A(G) = A(D): A(D) = Temp
      G = G + 1: D = D - 1
    End If
  Loop While G <= D
  If G < droi Then Call Tri(A, G, droi)
  If gauc < D Then Call Tri(A, gauc, D)
End Sub

Désolé de devoir te demander les détails, mais j'aime pas juste copier un bout de code, car ce que je comprends aujourd'hui c'est ce que je ne demande pas demain ;-)

Parce que j'aimerai modifier ton code pour que dans les Combobox je puis avoir l'option Tout pour afficher tout, mais j'aimerai savoir le faire. De plus si je double clic sur une ligne dans mon tableau j'aimerai afficher les détail dans une MsgBox par exemple, mais avec l'utilisation du Dico je ne sais pas comment récupérer ces infos ... :-(

Donc si tu as encore un peu de temps à m'accorder je t'en remercie.
S
Satch
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 24 septembre 2015
Version d'Excel : 2010 FR

Message par Satch » 8 octobre 2015, 14:16

Je m'acharne et pour le double click j'ai trouvé comment récupérer la ligne souhaitée :
Private Sub ListView1_DblClick()
Dim Lig As Integer
 Lig = ListView1.SelectedItem.Index + 1
 Description = Sheets("DELAI").Cells(Lig, "E").Value
 'MsgBox Description
End Sub
Aller je continue .... ;-)
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message