IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Filtre ListView avec deux combobox


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Par défaut Filtre ListView avec deux combobox
    Bonjour,

    Avec la macro ci-dessous, j'alimente à l'initialisation ma listview et je rempli les deux combobox :
    Ces deux macro fonctionnent. Seulement la troisième macro, celle du filtre ne fonctionne pas(Sub RemplissageListView()).
    Je ne comprends ou ça dysfonctionne dans Sub RemplissageListView()
    Merci pour votre aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    Private Sub UserForm_Initialize()
       Dim MondicoStat As Object, MondicoMand As Object, MondicoResp As Object
    Dim J As Long, T2
     
     Set Ws = Sheets("consignes")
     
      Set MondicoStat = CreateObject("Scripting.dictionary")
      Set MondicoMand = CreateObject("Scripting.dictionary")
      'Set MondicoResp = CreateObject("Scripting.dictionary")
     
      With Ws
        For J = 2 To .Range("A" & Rows.Count).End(xlUp).Row
          If .Range("H" & J) <> "" Then MondicoStat(.Range("H" & J).Value) = ""
          If .Range("G" & J) <> "" Then MondicoMand(.Range("G" & J).Value) = ""
          'If .Range("C" & J) <> "" Then MondicoResp(.Range("C" & J).Value) = ""
        Next J
      End With
      If MondicoStat.Count > 0 Then T2 = MondicoStat.keys: Tri T2, LBound(T2), UBound(T2): Me.mois.List = T2
      If MondicoMand.Count > 0 Then T2 = MondicoMand.keys: Tri T2, LBound(T2), UBound(T2): Me.annee.List = T2
      'If MondicoResp.Count > 0 Then T2 = MondicoResp.keys: Tri T2, LBound(T2), UBound(T2): Me.CbbResponsable.List = T2
     
    End Sub
    Private Sub LVW_Fill(ByVal sFilter As String, ByVal iCol As Integer)
    'Variables locales
        Dim iCnt As Integer
        Dim iRnd As Integer
        Dim oRng As Excel.Range
        Dim oItem As ListItem
     
        ListView1.ColumnHeaders.Clear
        ListView1.ListItems.Clear
        'Remplissage de la ListView
        Set oRng = Base.Cells(1, 1)
        Do Until oRng.Offset(0, 0).Value = ""
            '-- En-têtes
            If oRng.Row = 1 Then
                For iCnt = 0 To 7
                    If iCnt = 0 Then
                        ListView1.ColumnHeaders.Add , , oRng.Offset(0, iCnt), 60
                    ElseIf iCnt = 1 Then
                        ListView1.ColumnHeaders.Add , , oRng.Offset(0, iCnt), 60
                    ElseIf iCnt = 2 Then
                        ListView1.ColumnHeaders.Add , , oRng.Offset(0, iCnt), 70
                     ElseIf iCnt = 3 Then
                        ListView1.ColumnHeaders.Add , , oRng.Offset(0, iCnt), 70
                        ElseIf iCnt = 4 Then
                        ListView1.ColumnHeaders.Add , , oRng.Offset(0, iCnt), 300
                        ElseIf iCnt = 5 Then
                        ListView1.ColumnHeaders.Add , , oRng.Offset(0, iCnt), 70
                        ElseIf iCnt = 6 Then
                        ListView1.ColumnHeaders.Add , , oRng.Offset(0, iCnt), 30
                        ElseIf iCnt = 7 Then
                        ListView1.ColumnHeaders.Add , , oRng.Offset(0, iCnt), 30
                  Else
                      ListView1.ColumnHeaders.Add , , oRng.Offset(0, iCnt), 150
     
                    End If
                Next iCnt
                '-- Données
            Else
                ' iRnd = Int((4 * Rnd) + 1)
                If LCase$(Left$(oRng.Offset(0, iCol), Len(sFilter))) = LCase$(sFilter) Then
                    Set oItem = ListView1.ListItems.Add(, , DateSerial(Left(oRng.Offset(0, 0), 4), Mid(oRng.Offset(0, 0), 5, 2), Right(oRng.Offset(0, 0), 2)))    ', "Key" & iRnd, "Key" & iRnd)
                    For iCnt = 1 To 1  '-- 5 colonnes
                        oItem.ListSubItems.Add , , DateSerial(Left(oRng.Offset(0, iCnt), 4), Mid(oRng.Offset(0, iCnt), 5, 2), Right(oRng.Offset(0, iCnt), 2))
                    Next iCnt
                    For iCnt = 2 To 7
                        oItem.ListSubItems.Add , , oRng.Offset(0, iCnt)
                    Next iCnt
                End If
            End If
            Call Filtre
            With ListView1
     
           If ListView1.Sorted = False Then
            ListView1.SortKey = 7
            ListView1.SortOrder = lvwAscending
            ListView1.Sorted = True
     
            End If
            End With
            Set oRng = oRng.Offset(1, 0)
        Loop
     
    End Sub
    macro du filtre sur le mois et l'année :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub RemplissageListView()
    Dim J As Long, I As Integer, Nb As Integer
     
      With Me.ListView1
        .ListItems.Clear
        For J = 2 To Range("H" & Rows.Count).End(xlUp).Row
          If Ws.Range("H" & J) Like Me.mois & "*" And Ws.Range("G" & J) Like Me.annee & "*" Then
             'And ws.Range("H" & J) Like Me.CbbMandant & "*" And _ ws.Range("I" & J) Like Me.CbbResponsable & "*" Then
            .ListItems.Add , Ws.Cells(J, "A").Address, Ws.Cells(J, "A")
            Nb = Nb + 1
            For I = 0 To .ColumnHeaders.Count
              .ListItems(Nb).ListSubItems.Add , , Ws.Cells(J, 1 + I)
            Next I
          End If
        Next J
      End With
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Où es-tu allé chercher tes subitems et une méthode Add les concernant ?
    Moi, je m'en tiens à la seule lecture de l'aide VBA et arrive à ceci, par exemple, pour une listbox à deux colonnes :
    C'est un EXEMPLE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 1 To 10
      ListBox1.AddItem "a " & i
      ListBox1.List(ListBox1.ListCount - 1, 1) = "coucou " & i
    Next

  3. #3
    Membre très actif
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Par défaut
    Bonjour,
    mais il ne s'agit pas de listbox mais de listview.

    je ne trouve pas la solution.

    Merci

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Ah ! Une listview ...
    exemple avec ce composant, alors :
    Cet exemple montre comment alimenter les subitems (on s'y réfère par leur index et non par une "méthode Add)).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Randomize
        ListView1.ColumnHeaders.Add , , "Nom", ListView1.Width / 3
        ListView1.ColumnHeaders.Add , , "prénom ID", ListView1.Width / 3, lvwColumnCenter
        ListView1.ColumnHeaders.Add , , "date de naissance", ListView1.Width / 3
        ListView1.ColumnHeaders.Add , , "", 0
        Dim itmX As ListItem
        For i = 1 To 10
           Set itmX = ListView1.ListItems.Add(, , Int((9 * Rnd) + 1))
           itmX.SubItems(1) = "a" & Int((9 * Rnd) + 1)
           If i Mod 2 = 0 Then
              itmX.SubItems(2) = "17/02/2000"
               itmX.SubItems(3) = "20000117"
           Else
              itmX.SubItems(2) = "20/03/2002"
              itmX.SubItems(3) = "20020320"
           End If
        Next
    Ceci dit : je ne saurais trop te conseiller d'utiliser une listbox (composant natif de VBA) plutôt qu'une Listview (non native et donc sujette à beaucoup de "choses" en fonction de la version Office et celle de l'OS)

  5. #5
    Membre très actif
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Par défaut
    Bonjour,

    A priori une listbox n'est pas cliquable donc non modifiable, c'est pour cela que j'ai pris une listView.

    avec la listView, je ne comprends pas pourquoi la macro de remplissage ne fonctionne pas.

    Merci

  6. #6
    Membre très actif
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Par défaut
    Bonjour,
    Je n'arrive pas à trouver la solution alors que cette macro fonctionne dans un autre classeur.
    Le début des ligne de la feuille commencent à cellule A2.
    Le mois est sur la colonne H et l'année en G
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub RemplissageListView()
    Dim J As Long, I As Integer, Nb As Integer
     
      With Me.ListView1
        .ListItems.Clear
        For J = 2 To Range("A" & Rows.Count).End(xlUp).Row
          If Ws.Range("H" & J) Like Me.mois & "*" And Ws.Range("G" & J) Like Me.annee & "*" Then
             'And ws.Range("H" & J) Like Me.CbbMandant & "*" And _ ws.Range("I" & J) Like Me.CbbResponsable & "*" Then
            .ListItems.Add , Ws.Cells(J, "A").Address, Ws.Cells(J, "A")
            Nb = Nb + 1
            For I = 0 To .ColumnHeaders.Count
              .ListItems(Nb).ListSubItems.Add , , Ws.Cells(J, 1 + I)
            Next I
          End If
        Next J
      End With
    End Sub
    Merci

Discussions similaires

  1. Formulaire avec deux combobox dynamiques liées
    Par mahasambatra dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 11/02/2017, 20h00
  2. [XL-2013] Userform avec deux combobox
    Par dubdub87 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 23/01/2015, 17h03
  3. [Developpement] : FieldType avec deux combobox
    Par loueti dans le forum SharePoint
    Réponses: 0
    Dernier message: 02/06/2008, 17h03
  4. probléme filtre avec deux critéres?
    Par dj_techno dans le forum Bases de données
    Réponses: 9
    Dernier message: 31/05/2007, 10h57
  5. Datagrid et combobox avec deux datasource différents
    Par RaelRiaK dans le forum VB.NET
    Réponses: 9
    Dernier message: 07/02/2007, 10h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo