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 :

ListView dependant de 3 ComboBox


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 47
    Par défaut
    Bonjour à tous,

    je galère un peu à faire afficher une liste de documents dépendantes de trois combobox

    Afficher dans ListView
    ligne i1 si la valeur de la cellule (X1,i1) = combobox1.value ou "ALL"
    ligne i2 si la valeur de la cellule (X2,i2) = combobox2.value ou "ALL"
    ligne i3 si la valeur de la cellule (X3,i3) = combobox3.value ou "ALL"

    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
    Private Sub ComboBox1_Change()
     
    Dim item As ListItem
    Dim derniereligne  As Integer
    Dim i As Integer
    Dim couleur As Variant
    Dim moncritere As Variant
    Dim Active As String
    Application.ScreenUpdating = False
    Active = ActiveSheet.Name
    Sheets(Active).Select
     
    AffichageSelection.ListItems.Clear
    derniereligne = Range("A" & Rows.Count).End(xlUp).Row
     
    For i = 12 To derniereligne
     
    If ComboBox1.Value = Cells(i, 10).Value Or ComboBox1.Value = "ALL" And ComboBox2.Value = Cells(i, 8).Value Or ComboBox2.Value = "ALL" And ComboBox3.Value = Cells(i, 10).Value Or ComboBox3.Value = "ALL" Then
     
     
            Set item = AffichageSelection.ListItems.Add
     
                    item.SubItems(1) = Sheets(Active).Cells(i, 1)
                    item.SubItems(2) = Sheets(Active).Cells(i, 3)
                    item.SubItems(3) = Sheets(Active).Cells(i, 6)
                    item.SubItems(4) = Sheets(Active).Cells(i, 8)
                    item.SubItems(5) = Sheets(Active).Cells(i, 10)
                    item.SubItems(6) = Sheets(Active).Cells(i, 12)
            End If
     
        Next i
        Application.ScreenUpdating = True
    Nbre.Caption = AffichageSelection.ListItems.Count
    End Sub
    Je pense que je code mal la condition....

    Merci à vous tous par avance ...

    Une solution serait de passer par un dictionnaire mais je ne sais pas du tout comment l'utiliser...

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    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
    Option Explicit
     
    Private Sub UserForm_Initialize()
     
    With Me.AffichageSelection
        .View = lvwReport
        .ColumnHeaders.Add , , "A", 50
        .ColumnHeaders.Add , , "C", 50
        .ColumnHeaders.Add , , "F", 50
        .ColumnHeaders.Add , , "H", 50
        .ColumnHeaders.Add , , "J", 50
        .ColumnHeaders.Add , , "L", 50
    End With
    With Me.ComboBox1
        .RowSource = "Feuil2!A1:A7"
        .ListIndex = 0
    End With
    With Me.ComboBox2
        .RowSource = "Feuil2!B1:B8"
        .ListIndex = 0
    End With
    With Me.ComboBox3
        .RowSource = "Feuil2!C1:C9"
        .ListIndex = 0
    End With
    End Sub
     
    Private Sub RemplirLst()
    Dim Plage As Range, c As Range
    Dim LastLig As Long
     
    Application.ScreenUpdating = False
    Me.AffichageSelection.ListItems.Clear
    With Worksheets("Feuil1")    'A aadpter
        .AutoFilterMode = False
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        If LastLig > 11 Then
            .Range("F11:J" & LastLig).AutoFilter Field:=1, Criteria1:=IIf(Me.ComboBox1.Value = "All", "*", Me.ComboBox1.Value)
            .Range("F11:J" & LastLig).AutoFilter Field:=3, Criteria1:=IIf(Me.ComboBox2.Value = "All", "*", Me.ComboBox2.Value)
            .Range("F11:J" & LastLig).AutoFilter Field:=5, Criteria1:=IIf(Me.ComboBox3.Value = "All", "*", Me.ComboBox3.Value)
     
            Set Plage = .Range("A11:A" & LastLig).SpecialCells(xlCellTypeVisible)
            If Plage.Count > 1 Then
                For Each c In Plage
                    If c.Row > Plage.Row Then
                        With Me.AffichageSelection.ListItems.Add(, , c.Value)
                            .SubItems(1) = c.Offset(, 2)
                            .SubItems(2) = c.Offset(, 5)
                            .SubItems(3) = c.Offset(, 7)
                            .SubItems(4) = c.Offset(, 9)
                            .SubItems(5) = c.Offset(, 11)
                        End With
                    End If
                Next c
            End If
            Set Plage = Nothing
        End If
        .AutoFilterMode = False
    End With
    End Sub
     
    Private Sub ComboBox1_Change()
     
    RemplirLst
    End Sub
     
    Private Sub ComboBox2_Change()
     
    RemplirLst
    End Sub
     
    Private Sub ComboBox3_Change()
     
    RemplirLst
    End Sub

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 47
    Par défaut
    Merci Mercatog pour ta réponse. J'ai une erreur à la ligne 17 "la méthode autofilter de la classe range a échoué". Peut etre est-ce parce que j'ai mal modifié le code ?

    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
    Private Sub RemplirLst()
    Dim Plage As Range, c As Range
    Dim LastLig As Long
     
    Application.ScreenUpdating = False
    Me.AffichageSelection.ListItems.Clear
     
     
    Dim Active As String
     
    Active = ActiveSheet.Name
    Sheets(Active).Select
    With Worksheets(Active)
        .AutoFilterMode = False
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        If LastLig > 11 Then
            .Range("H11:H" & LastLig).AutoFilter Field:=1, Criteria1:=IIf(Me.ListSupplier.Value = "All", "*", Me.ListSupplier.Value)                'J'aimodifié les plages...
            .Range("J11:J" & LastLig).AutoFilter Field:=3, Criteria1:=IIf(Me.ListMetier.Value = "All", "*", Me.ListMetier.Value)
            .Range("O11:O" & LastLig).AutoFilter Field:=5, Criteria1:=IIf(Me.ValidationListe.Value = "All", "*", Me.ValidationListe.Value)
     
            Set Plage = .Range("A11:A" & LastLig).SpecialCells(xlCellTypeVisible)
            If Plage.Count > 1 Then
                For Each c In Plage
                    If c.Row > Plage.Row Then
                        With Me.AffichageSelection.ListItems.Add(, , c.Value)
                            .SubItems(1) = c.Offset(, 2)
                            .SubItems(2) = c.Offset(, 5)
                            .SubItems(3) = c.Offset(, 7)
                            .SubItems(4) = c.Offset(, 9)
                            .SubItems(5) = c.Offset(, 11)
                        End With
                    End If
                Next c
            End If
            Set Plage = Nothing
        End If
        .AutoFilterMode = False
    End With
    End Sub

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Regarde l'aide sur la méthode Range.autofilter et à quoi sert le paramètre Field

    Je m'en veux de t'avoir donné un code prêt à l'emploi. Je m’ennuyais c'est pour ça

    Au moins en adaptant, regardes ce que tu fais

    PS. Les lignes 11 et 12 de ton "code" sont d'une affreuse atrocité, horreur, monstruosité, laideur .... Explique nous ce que font ces 2 lignes

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 47
    Par défaut
    Meci mercatog pour ton retour.


    J'essaye de comprendre
    Range : Zone ou le filtre sera appliqué
    Field : Colonne de selection de notre critère

    Ensuite critère 1 Si ListSupplier = tout alors pas de filtre sinon filtre= valeur de la ListSupplier

    J'ai toujours le même message d'erreur la méthode autofilter de la classe range à échouer.


    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
    Private Sub RemplirLst()
    Dim Plage As Range, c As Range
    Dim LastLig As Long
     
    Application.ScreenUpdating = False
    Me.AffichageSelection.ListItems.Clear
     
     
    Dim Active As String
     
    Active = ActiveSheet.Name
    Sheets(Active).Select
    With Worksheets(Active)
        .AutoFilterMode = False
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        If LastLig > 11 Then
     
     
            .Range("A11:P" & LastLig).AutoFilter Field:=8, Criteria1:=IIf(Me.ListSupplier.Value = "ALL", "*", Me.ListSupplier.Value)
     
           '.Range("J11:J" & LastLig).AutoFilter Field:=3, Criteria1:=IIf(Me.ListMetier.Value = "All", "*", Me.ListMetier.Value)
           '.Range("O11:O" & LastLig).AutoFilter Field:=5, Criteria1:=IIf(Me.ValidationListe.Value = "All", "*", Me.ValidationListe.Value)
     
            Set Plage = .Range("A11:A" & LastLig).SpecialCells(xlCellTypeVisible)
            If Plage.Count > 1 Then
                For Each c In Plage
                    If c.Row > Plage.Row Then
                        With Me.AffichageSelection.ListItems.Add(, , c.Value)
                            .SubItems(1) = c.Offset(, 2)
                            .SubItems(2) = c.Offset(, 5)
                            .SubItems(3) = c.Offset(, 7)
                            .SubItems(4) = c.Offset(, 9)
                            .SubItems(5) = c.Offset(, 11)
                        End With
                    End If
                Next c
            End If
            Set Plage = Nothing
        End If
        .AutoFilterMode = False
    End With
    End Sub
    Par ailleurs je ne comprends pas pourquoi cette procédure démarre à l'ouverture de mon userform alors qu'elle devrait s'ouvrir lorsque je change des critères d'une des combobox....

    Quant aux lignes 11 et 12, j'ai beaucoup galéré à selectionner les bons onglets sur les bons classeurs. Je copie colle des données entres différentes feuilles. Et ... c'est ainsi que je les selectionne....


    Merci à vous

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    J'essaye de comprendre
    Range : Zone ou le filtre sera appliqué
    Field : Colonne de selection de notre critère
    Tu as tout dit mais n'a pas appliqué correctement
    Que veut dire la colonne 3 du range J11:Jxx


    Pour les lignes 11 et 12, tu active la feuille déjà active

    j'ai beaucoup galéré à selectionner les bons onglets sur les bons classeurs. Je copie colle des données entres différentes feuilles

    Pas besoin de sélectionner des feuilles pour y coller les données Exemple

    Code bizarre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    worksheets("Feuil1").activate
    range("A2").select
    selection.copy
    worksheets("Feuil2").activate
    range("M1").select
    selection.paste
    Alors qu'on préfixant les range et cells avec les feuilles auxquelles ils appartiennent, on ne souciera aucunement de la feuille active et on n'aura besoin d'activer rien.

    Code précédent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    worksheets("Feuil1").range("A2").copy
    worksheets("Feuil2").range("M1").paste

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Systeme de recherche dans listview grace a un combobox
    Par thisisonehood dans le forum VB.NET
    Réponses: 3
    Dernier message: 01/06/2012, 16h07
  2. [VB6][ListView] ListView et ComboBox
    Par gwendo dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 01/06/2007, 18h49
  3. Combobox qui depend d'une autre
    Par KOUTO dans le forum Delphi
    Réponses: 3
    Dernier message: 18/12/2006, 11h11
  4. [C++] ListView, Drag&Drop + ComboBox ?
    Par JulienDuSud dans le forum C++/CLI
    Réponses: 4
    Dernier message: 30/09/2006, 12h49
  5. [C#]ListView et combobox
    Par fafa139 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 22/05/2006, 09h49

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