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 :

Filtrage de données via une matrice métiers [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Filtrage de données via une matrice métiers
    Bonjour à tous!

    Tout d'abord, je suis nouveau sur le site, j'espère juste ne pas avoir créé une nouvelle discussion dans un mauvais emplacement...

    Je débute en VBA et je suis bloqué dans ma recherche.

    J'ai un classeur avec différents onglets (en PJ) :
    - Premier onglet : Tableau de données fournisseurs (48 mais éventuellement modifiable dans les années à venir...)
    - Second onglet : Matrice métier

    J'aimerai avoir une liste multi-choix des différents métiers, qui permettrait de filtrer les fournisseurs correspondants aux métiers sélectionnés.
    Par exemple en filtrant par métier 2, obtenir la liste des entreprises 1, 16, 17, et 34.
    Ou encore en filtrant par métier 2 et 5, obtenir la liste des entreprises 1, 11, 16, 17, 34 et 43.

    Voilà! J'ai pu trouver des astuces pour filtrer en fonction des données présentes dans le tableau de l'onglet 1, mais dans le cas recherché : filtrer en fonction d'une matrice annexe, je ne sais vraiment pas comment procéder... Est-ce que c'est faisable? Et comment?

    Je suis preneur de toutes vos idées et conseils !

    Merci à tous!
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Bonjour,

    Une piste en VBA.
    Il faudra relier votre contrôle de formulaire (Excel.ListBox) à une macro
    Nom : hozce1.jpg
Affichages : 317
Taille : 18,6 Ko
    Nom : hozce2.jpg
Affichages : 269
Taille : 34,3 Ko

    Copiez le code suivant dans un module Standard
    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
    Sub ListBox2Filtre()
    '/// La 1ère cellule du tableau Excel ///
    Const FIRST_CELL_CAPABILITE As String = "B18"   'à adapter
    '///////////////////////////////////////
    Dim LB As Excel.ListBox   'Contrôle de formulaire (ce n'est pas un ActiveX)
    Dim Coll As New Collection
    Dim R As Range
    Dim LesMetiers$
    Dim Tbl As Variant
    Dim var As Variant
    Dim k&
    Dim i&
    Dim j&
    Dim T()
    '--- La ListBox qui a appelé ---
    Set LB = ActiveSheet.Shapes(Application.Caller).OLEFormat.Object
    '--- Les métiers qui ont été sélectionnés sont stockés dans une variable String ---
    For i& = 1 To LB.ListCount
      If LB.Selected(i&) Then LesMetiers$ = LesMetiers$ & LB.List(i&) & "µ"
    Next i&
     
    '--- Definition de la 1ère cellule du tableau Excel (Capabilité) ---
    Set R = Range(FIRST_CELL_CAPABILITE)
    '--- Efface le filtre (par défaut) ---
    R.AutoFilter
     
    '--- Si aucun métier n'a été sélectionné, on sort ---
    If LesMetiers$ = "" Then Exit Sub
     
    '--- Split de la chaîne pour obtenir un tableau des métiers ---
    Tbl = Split(LesMetiers$, "µ")
     
    '###
    '--- On monte toutes les données de la feuille "Métiers" dans un Variant ---
    var = Sheets("Métiers").[a1].CurrentRegion
     
    For k& = 0 To UBound(Tbl) - 1       'boucle sur les métiers
      For j& = 1 To UBound(var, 2)      'boucle sur les colonnes (concerne la feuille "Métiers")
        If var(1, j&) = Tbl(k&) Then    'si on trouve une correspondance métier ...
          For i& = 1 To UBound(var, 1)  '... on boucle sur les lignes (concerne la feuille "Métiers") ...
            If UCase(var(i&, j&)) = "X" Then  '... si on y touve un X ...
              On Error Resume Next  '\\\Pour éviter les doublons
              Coll.Add CStr(var(i&, 2)), CStr(var(i&, 2)) '... on l'ajoute à la collection.
              On Error GoTo 0       '\\\Pour éviter les doublons (suite)
            End If
          Next i&
        End If
      Next j&
    Next k&
     
    '--- Si aucun élément n'a été ajouté à la collection, on sort ---
    If Coll.Count = 0 Then Exit Sub
     
    '--- Transfert des éléments de la collection dans un tableau ---
    ReDim T(1 To Coll.Count)
    For i& = 1 To Coll.Count
      T(i&) = Coll(i&)
    Next i&
    '--- Active le filtre en fonction des éléments du tableau (T) ---
    R.CurrentRegion.AutoFilter Field:=2, Criteria1:=T, Operator:=xlFilterValues
    End Sub
    Fichiers attachés Fichiers attachés

  3. #3
    Membre du Club
    Homme Profil pro
    Chercheur à pôle emploi
    Inscrit en
    Juin 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheur à pôle emploi

    Informations forums :
    Inscription : Juin 2015
    Messages : 43
    Points : 64
    Points
    64
    Par défaut
    Bonjour, ma contribution avec un petit userform, je n'arrive pas à joindre le fichier ca marche pas...S'il vous interesse je trouverai un moyen de vous le faire parvenir. Les éléments trouvés sont dans une feuille différente des autres donc les données peuvent être manipulées et effacées sans risque de toucher aux bases de données. L'userform reste ouvert tant que vous ne l'avez pas fermé et la liste se met à jour automatiquement après chaque selection in.Cordialement.

    Le code n'est pas trop complexe donc il sera aisé de le modifier si besoin

    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
    Private Sub CommandButton1_Click()
        With Feuil1
            .Cells.Delete
            Feuil5.[a1:m1].Copy .[a1:m1]
            .[a1:m1].Borders.LineStyle = xlContinuous
        End With
     
     
        Dim a, i, j
        a = Feuil3.UsedRange
        For i = 0 To ListBox1.ListCount - 1
            If ListBox1.Selected(i) = True Then
                For j = 2 To UBound(a)
                    If a(j, i + 5) <> "" Then
                        With Feuil5
                            Set trouve = .[b:b].Find(a(j, 2), LookIn:=xlValues, lookat:=xlWhole)
                            If Not trouve Is Nothing Then
                                .Range(.Cells(trouve.Row, 1), .Cells(trouve.Row, 13)).Copy Feuil1.[a65000].End(xlUp).Offset(1, 0)
                            End If
                        End With
                    End If
                Next
            End If
        Next
    With Feuil1.UsedRange
    .Columns.AutoFit
    .Rows.AutoFit
    End With
    End Sub
    Images attachées Images attachées  

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous !

    Ca s'approche beaucoup de ce que je voulais, encore merci PMO2017 !
    Merci à toi aussi Camarchepas, j'aimerais bien le fichier afin d'y jeter un coup d'œil aussi. Comment faire?

  5. #5
    Membre du Club
    Homme Profil pro
    Chercheur à pôle emploi
    Inscrit en
    Juin 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheur à pôle emploi

    Informations forums :
    Inscription : Juin 2015
    Messages : 43
    Points : 64
    Points
    64
    Par défaut
    Ah bah sa marche maintenant...Pour rappel, dans l'userform vous selectionnez vos métier et vous cliquez sur commander
    Fichiers attachés Fichiers attachés

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    J'aimerai pousser la macro un peu plus loin!

    Je voudrai combiner plusieurs filtres. Après avoir filtré par métiers (Via la matrice externe métiers), je souhaiterai ajouter des filtres en fonction des éléments du tableau.

    Voir PJ :

    Par exemple lorsque je filtre par métier 2, j'ai 4 entreprises avec 4 risques différents, et j'aimerai pouvoir filtrer uniquement les risques A1 de ce métier.
    Pour ça j'étais parti sur une liste déroulante avec une formule index pour le filtre mais ca veut pas combiner avec le précédent filtre proposé par PMO2017 ...

    Help !
    Fichiers attachés Fichiers attachés

  7. #7
    Membre du Club
    Homme Profil pro
    Chercheur à pôle emploi
    Inscrit en
    Juin 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheur à pôle emploi

    Informations forums :
    Inscription : Juin 2015
    Messages : 43
    Points : 64
    Points
    64
    Par défaut
    Bonjour, dans l'état qu'est-ce qu'il ne va pas avec le filtre sur les risques ?

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Le filtre "Risque" fonctionne bien cependant il efface le pré-filtre des métiers...
    Or je souhaiterai appliquer le filtre "Risque" à la sélection d'entreprises après le filtre "Métier".

    Autrement dit j'aimerai combiner les deux filtres.

  9. #9
    Membre du Club
    Homme Profil pro
    Chercheur à pôle emploi
    Inscrit en
    Juin 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheur à pôle emploi

    Informations forums :
    Inscription : Juin 2015
    Messages : 43
    Points : 64
    Points
    64
    Par défaut
    Bah.. il faut attendre que PMO revienne, c'est son code il saura faire quoi ou quand et comment..

  10. #10
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Tu rajoute une liste de choix nommée "Zone de liste 11" qui contient tes différents types de risques et tu teste ce code que tu place tout à la fin du code de PMO2017 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    With Worksheets("Capabilité").Shapes("Zone de liste 11").ControlFormat
     
        R.CurrentRegion.AutoFilter Field:=12, Criteria1:=.List(.Value), Operator:=xlFilterValues
     
    End With
    Hervé.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    J'aimerai pousser la macro un peu plus loin!

    Je voudrai combiner plusieurs filtres. Après avoir filtré par métiers (Via la matrice externe métiers), je souhaiterai ajouter des filtres en fonction des éléments du tableau.

    Voir PJ :

    Par exemple lorsque je filtre par métier 2, j'ai 4 entreprises avec 4 risques différents, et j'aimerai pouvoir filtrer uniquement les risques A1 de ce métier.
    Pour ça j'étais parti sur une liste déroulante avec une formule index pour le filtre mais ca veut pas combiner avec le précédent filtre proposé par PMO2017 ...
    Bonjour,

    Il faut changer tout le code et ne plus employer Application.Caller puisque plusieurs objets vont appeler la même procédure ListBox2Filtre.

    1) Remplacez l'ancien code par le code suivant
    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
    Sub ListBox2Filtre()
    '/// Constantes à adapter ///
    Const FIRST_CELL_CAPABILITE As String = "B18"         'La 1ère cellule du tableau Excel (à adapter)
    Const LISTBOX_METIERS As String = "Zone de liste 10"  'Nom exact de la ListBox des Métiers (à adapter)
    Const DROPDOWN_RISQUES As String = "ListeRisque"      'Nom exact de la DropDown des Risques (à adapter)
    '////////////////////////////
     
    Dim LB As Excel.ListBox   'Contrôle de formulaire (ce n'est pas un ActiveX)
    Dim DD As Excel.DropDown  'Contrôle de formulaire (ce n'est pas un ActiveX)
    Dim Coll As New Collection
    Dim R As Range
    Dim LesMetiers$
    Dim Tbl As Variant
    Dim var As Variant
    Dim k&
    Dim i&
    Dim j&
    Dim T()
     
    '--- Definition de la 1ère cellule du tableau Excel (Capabilité) ---
    Set R = Range(FIRST_CELL_CAPABILITE)
    '--- Efface le filtre (par défaut) ---
    R.AutoFilter
     
    '###########################
    '### ListBox des Métiers ###
    '###########################
    Set LB = ActiveSheet.Shapes(LISTBOX_METIERS).OLEFormat.Object
    '--- Les métiers qui ont été sélectionnés sont stockés dans une variable String ---
    For i& = 1 To LB.ListCount
      If LB.Selected(i&) Then LesMetiers$ = LesMetiers$ & LB.List(i&) & "µ"
    Next i&
     
    '--- Si au moins un métier a été sélectionné ---
    If LesMetiers$ <> "" Then
      '--- Split de la chaîne pour obtenir un tableau des métiers ---
      Tbl = Split(LesMetiers$, "µ")
     
      '--- On monte toutes les données de la feuille "Métiers" dans un Variant ---
      var = Sheets("Métiers").[a1].CurrentRegion
      For k& = 0 To UBound(Tbl) - 1       'boucle sur les métiers
        For j& = 1 To UBound(var, 2)      'boucle sur les colonnes (concerne la feuille "Métiers")
          If var(1, j&) = Tbl(k&) Then    'si on trouve une correspondance métier ...
            For i& = 1 To UBound(var, 1)  '... on boucle sur les lignes (concerne la feuille "Métiers") ...
              If UCase(var(i&, j&)) = "X" Then  '... si on y touve un X ...
                On Error Resume Next  '\\\Pour éviter les doublons
                Coll.Add CStr(var(i&, 2)), CStr(var(i&, 2)) '... on l'ajoute à la collection.
                On Error GoTo 0       '\\\Pour éviter les doublons (suite)
              End If
            Next i&
          End If
        Next j&
      Next k&
     
      '--- Si au moins un élément a été ajouté à la collection ---
      If Coll.Count > 0 Then
        '--- Transfert des éléments de la collection dans un tableau ---
        ReDim T(1 To Coll.Count)
        For i& = 1 To Coll.Count
          T(i&) = Coll(i&)
        Next i&
        '--- Active le filtre en fonction des éléments du tableau (T) ---
        R.CurrentRegion.AutoFilter Field:=2, Criteria1:=T, Operator:=xlFilterValues
      End If
    End If
     
    '############################
    '### DropDown des Risques ###
    '############################
    Set DD = ActiveSheet.Shapes(DROPDOWN_RISQUES).OLEFormat.Object
    '---
    If DD.List(DD) <> "" Then
      '--- Applique le filtre selon la valeur du DropDown ---
      R.CurrentRegion.AutoFilter Field:=12, Criteria1:=DD.List(DD), Operator:=xlFilterValues
    Else
      '--- Pas de filtre, le DropDown est égal à RIEN (vide) ---
      R.AutoFilter Field:=12
    End If
     
    End Sub
    2) Reportez-vous, dans le code, aux /// Constantes à adapter /// et mettez les bien à jour.
    3) Reliez, dans la feuille Excel, les contrôles de formulaire (ListBox et DropDown) à la macro ListBox2Filtre
    Fichiers attachés Fichiers attachés

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Superbe! Ca marche à merveille et comme je l'espérais !

    Cependant j'avais décidé d'avancer dans la réalisation du programme en attendant votre réponse (pas que d'un point de vue design ) et j'ai une "contrainte" supplémentaire.

    Voir PJ :
    J'ai ajouté un bouton "AfficherTout" qui permet de réinitialiser tous les filtres afin d'afficher toutes les données du tableau, autrement dit, réinitialiser le tableau (en soi pas très difficile à faire).
    En exécutant la macro de ce bouton, je voulais:
    1- Désélectionner tous les métiers choisis, pour avoir une listbox initiale, sans lignes sélectionnées,
    2- Mettre les listes déroulantes à vide (A valeur "").

    Pour le 1-, j'ai pu trouver une solution (pas la plus propre d'un point de vue code VBA... mais qui fonctionne relativement bien). Le principe est de recréer une listbox vierge et lui attribuer tous les paramètres à chaque run de la macro "AfficherTout".
    Pour le 2-, j'avais trouvé une solution, mais qui finalement ne marche plus avec votre code. C'était de mettre la cellule liée à la liste déroulante à "0", ce qui, via la formule INDEX, génère la valeur "" dans la liste déroulante.

    Cependant avec votre code, ça bloque à la ligne "If DD.List(DD) <> "" Then"...

    Que faire? Dois-je revoir ce que j'avais trouvé? Ou bien, y aurait-il une solution simple pour adapter la situation au code?

    Merci d'avance pour vos réponses !
    Fichiers attachés Fichiers attachés

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    J'ai ajouté un bouton "AfficherTout" qui permet de réinitialiser tous les filtres afin d'afficher toutes les données du tableau, autrement dit, réinitialiser le tableau (en soi pas très difficile à faire).
    En exécutant la macro de ce bouton, je voulais:
    1- Désélectionner tous les métiers choisis, pour avoir une listbox initiale, sans lignes sélectionnées,
    2- Mettre les listes déroulantes à vide (A valeur "").
    Plutôt faire comme dans la pièce jointe.

    Les constantes et certaines variables ont été déclarées au niveau module, c'est à dire qu'elles sont visibles par toutes les procédures contenues dans ce module
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    '### Constantes et variables de portée niveau module ###
    '/// Constantes à adapter ///
    Const FIRST_CELL_CAPABILITE As String = "C10"           'La 1ère cellule du tableau Excel (à adapter)
    Const LISTBOX_METIERS As String = "listbox1"            'Nom exact de la ListBox des Métiers (à adapter)
    Const DROPDOWN_RISQUES As String = "ListeRisque"        'Nom exact de la DropDown des Risques (à adapter)
    Const DROPDOWN_RANGS As String = "ListeRang"            'Nom exact de la DropDown des Rangs (à adapter)
    '////////////////////////////
     
    Dim LB As Excel.ListBox   'Contrôle de formulaire (ce n'est pas un ActiveX)
    Dim DD As Excel.DropDown  'Contrôle de formulaire (ce n'est pas un ActiveX)
    '#######################################################
     
    Sub ListBox2Filtre()
    Dim Coll As New Collection
    Dim R As Range
    Dim LesMetiers$
    Dim Tbl As Variant
    Dim var As Variant
    Dim k&
    Dim i&
    Dim j&
    Dim T()
     
    '--- Definition de la 1ère cellule du tableau Excel (Capabilité) ---
    Set R = Range(FIRST_CELL_CAPABILITE)
    '--- Efface le filtre (par défaut) ---
    R.AutoFilter
     
    '###########################
    '### ListBox des Métiers ###
    '###########################
    Set LB = ActiveSheet.Shapes(LISTBOX_METIERS).OLEFormat.Object
    '--- Les métiers qui ont été sélectionnés sont stockés dans une variable String ---
    For i& = 1 To LB.ListCount
      If LB.Selected(i&) Then LesMetiers$ = LesMetiers$ & LB.List(i&) & "µ"
    Next i&
     
    '--- Si au moins un métier a été sélectionné ---
    If LesMetiers$ <> "" Then
      '--- Split de la chaîne pour obtenir un tableau des métiers ---
      Tbl = Split(LesMetiers$, "µ")
     
      '--- On monte toutes les données de la feuille "Métiers" dans un Variant ---
      var = Sheets("Métiers").[a1].CurrentRegion
      For k& = 0 To UBound(Tbl) - 1       'boucle sur les métiers
        For j& = 1 To UBound(var, 2)      'boucle sur les colonnes (concerne la feuille "Métiers")
          If var(1, j&) = Tbl(k&) Then    'si on trouve une correspondance métier ...
            For i& = 1 To UBound(var, 1)  '... on boucle sur les lignes (concerne la feuille "Métiers") ...
              If UCase(var(i&, j&)) = "X" Then  '... si on y touve un X ...
                On Error Resume Next  '\\\Pour éviter les doublons
                Coll.Add CStr(var(i&, 2)), CStr(var(i&, 2)) '... on l'ajoute à la collection.
                On Error GoTo 0       '\\\Pour éviter les doublons (suite)
              End If
            Next i&
          End If
        Next j&
      Next k&
     
      '--- Si au moins un élément a été ajouté à la collection ---
      If Coll.Count > 0 Then
        '--- Transfert des éléments de la collection dans un tableau ---
        ReDim T(1 To Coll.Count)
        For i& = 1 To Coll.Count
          T(i&) = Coll(i&)
        Next i&
        '--- Active le filtre en fonction des éléments du tableau (T) ---
        R.CurrentRegion.AutoFilter Field:=2, Criteria1:=T, Operator:=xlFilterValues
      End If
    End If
     
    '############################
    '### DropDown des Risques ###
    '############################
    Set DD = ActiveSheet.Shapes(DROPDOWN_RISQUES).OLEFormat.Object
    '---
    If DD.List(DD) <> "" Then
      '--- Applique le filtre selon la valeur du DropDown ---
      R.CurrentRegion.AutoFilter Field:=12, Criteria1:=DD.List(DD), Operator:=xlFilterValues
    Else
      '--- Pas de filtre, le DropDown est égal à RIEN (vide) ---
      R.AutoFilter Field:=12
    End If
     
     
    '############################
    '###  DropDown des Rangs  ###
    '############################
    Set DD = ActiveSheet.Shapes(DROPDOWN_RANGS).OLEFormat.Object
    '---
    If DD.List(DD) <> "" Then
      '--- Applique le filtre selon la valeur du DropDown ---
      R.CurrentRegion.AutoFilter Field:=13, Criteria1:=DD.List(DD), Operator:=xlFilterValues
    Else
      '--- Pas de filtre, le DropDown est égal à RIEN (vide) ---
      R.AutoFilter Field:=13
    End If
     
    End Sub
     
    Sub AfficherTout()
    Dim i&
    '--- ListBox des Métiers ---
    Set LB = ActiveSheet.Shapes(LISTBOX_METIERS).OLEFormat.Object
    For i& = 1 To LB.ListCount
      If LB.Selected(i&) = True Then LB.Selected(i&) = False
    Next i&
    '--- DropDown des Risques ---
    Set DD = ActiveSheet.Shapes(DROPDOWN_RISQUES).OLEFormat.Object
    DD.ListIndex = 1
    '--- DropDown des Rangs ---
    Set DD = ActiveSheet.Shapes(DROPDOWN_RANGS).OLEFormat.Object
    DD.ListIndex = 1
    '--- Appel de la procédure de mise à jour ---
    Call ListBox2Filtre
    End Sub
    Fichiers attachés Fichiers attachés

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Au top !

    J'avais trouvé une solution pour le message de bug : J'avais ajouté :

    dans les parties concernant les dropdowns, mais ta solution reste beaucoup plus propre !

    Encore merci pour tout à tous,

    Next step : ajouter des checkbox en supplément. Si je bloque je saurai à qui m'adresser

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous !

    J'ai une question pour toi PMO2017 :

    Dans ton dernier code proposé, dans la partie Liste Métiers,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    '--- Si au moins un élément a été ajouté à la collection ---
    If Coll.Count > 0 Then
       '--- Transfert des éléments de la collection dans un tableau ---
       ReDim T(1 To Coll.Count)
       For i& = 1 To Coll.Count
       T(i&) = Coll(i&)
       Next i&
       '--- Active le filtre en fonction des éléments du tableau (T) ---
       R.CurrentRegion.AutoFilter Field:=2, Criteria1:=T, Operator:=xlFilterValues
    End If
    A titre d'information,
    Si je veux compléter avec un ELSE dans le cas où rien ne serait ajouté à la collection,
    comment je peux faire pour que rien n'apparaisse? Autrement dit le "filtrage" enlève toutes les données du tableau initial?

    Merci d'avance

  16. #16
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut heu
    bonjour a tous
    salut PMO
    j'ai un peu suivi votre discussion en retrait

    perso j'aurais utilisé un dico en public (memo une seule fois)
    plutôt que des boucle pour un collection
    et dans chaque valeur de clé métier les nom des entreprises

    1 boucle pour les clé métier (de 1 a 33)
    une boucle sur le rows utilisé
    basta on le fait qu'une fois
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Si je veux compléter avec un ELSE dans le cas où rien ne serait ajouté à la collection,
    comment je peux faire pour que rien n'apparaisse? Autrement dit le "filtrage" enlève toutes les données du tableau initial?
    Bonjour,

    Peut être comme cela (voir les '///ajout)
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    '### Constantes et variables de portée niveau module ###
    '/// Constantes à adapter ///
    Const FIRST_CELL_CAPABILITE As String = "C10"           'La 1ère cellule du tableau Excel (à adapter)
    Const LISTBOX_METIERS As String = "listbox1"            'Nom exact de la ListBox des Métiers (à adapter)
    Const DROPDOWN_RISQUES As String = "ListeRisque"        'Nom exact de la DropDown des Risques (à adapter)
    Const DROPDOWN_RANGS As String = "ListeRang"            'Nom exact de la DropDown des Rangs (à adapter)
    '////////////////////////////
     
    Dim LB As Excel.ListBox   'Contrôle de formulaire (ce n'est pas un ActiveX)
    Dim DD As Excel.DropDown  'Contrôle de formulaire (ce n'est pas un ActiveX)
    '#######################################################
     
    Sub ListBox2Filtre()
    Dim Coll As New Collection
    Dim R As Range
    Dim LesMetiers$
    Dim Tbl As Variant
    Dim var As Variant
    Dim k&
    Dim i&
    Dim j&
    Dim T()
    Dim NoMetier As Boolean '///ajout
     
    '--- Definition de la 1ère cellule du tableau Excel (Capabilité) ---
    Set R = Range(FIRST_CELL_CAPABILITE)
    '--- Efface le filtre (par défaut) ---
    R.AutoFilter
     
    '###########################
    '### ListBox des Métiers ###
    '###########################
    Set LB = ActiveSheet.Shapes(LISTBOX_METIERS).OLEFormat.Object
    '--- Les métiers qui ont été sélectionnés sont stockés dans une variable String ---
    For i& = 1 To LB.ListCount
      If LB.Selected(i&) Then LesMetiers$ = LesMetiers$ & LB.List(i&) & "µ"
    Next i&
     
    '--- Si au moins un métier a été sélectionné ---
    If LesMetiers$ <> "" Then
      '--- Split de la chaîne pour obtenir un tableau des métiers ---
      Tbl = Split(LesMetiers$, "µ")
     
      '--- On monte toutes les données de la feuille "Métiers" dans un Variant ---
      var = Sheets("Métiers").[a1].CurrentRegion
      For k& = 0 To UBound(Tbl) - 1       'boucle sur les métiers
        For j& = 1 To UBound(var, 2)      'boucle sur les colonnes (concerne la feuille "Métiers")
          If var(1, j&) = Tbl(k&) Then    'si on trouve une correspondance métier ...
            For i& = 1 To UBound(var, 1)  '... on boucle sur les lignes (concerne la feuille "Métiers") ...
              If UCase(var(i&, j&)) = "X" Then  '... si on y touve un X ...
                On Error Resume Next  '\\\Pour éviter les doublons
                Coll.Add CStr(var(i&, 2)), CStr(var(i&, 2)) '... on l'ajoute à la collection.
                On Error GoTo 0       '\\\Pour éviter les doublons (suite)
              End If
            Next i&
          End If
        Next j&
      Next k&
     
      '--- Si au moins un élément a été ajouté à la collection ---
      If Coll.Count > 0 Then
        '--- Transfert des éléments de la collection dans un tableau ---
        ReDim T(1 To Coll.Count)
        For i& = 1 To Coll.Count
          T(i&) = Coll(i&)
        Next i&
        '--- Active le filtre en fonction des éléments du tableau (T) ---
        R.CurrentRegion.AutoFilter Field:=2, Criteria1:=T, Operator:=xlFilterValues
      End If
     
    Else    '///ajout
      R.CurrentRegion.AutoFilter Field:=2, Criteria1:="", Operator:=xlFilterValues  '///ajout
      NoMetier = True '///ajout
    End If
     
    '############################
    '### DropDown des Risques ###
    '############################
    Set DD = ActiveSheet.Shapes(DROPDOWN_RISQUES).OLEFormat.Object
    '---
    If DD.List(DD) <> "" Then
      '--- Applique le filtre selon la valeur du DropDown ---
      R.CurrentRegion.AutoFilter Field:=12, Criteria1:=DD.List(DD), Operator:=xlFilterValues
    Else
      '--- Pas de filtre, le DropDown est égal à RIEN (vide) ---
      R.AutoFilter Field:=12
    End If
     
    If NoMetier Then DD.ListIndex = 1   '///ajout
     
    '############################
    '###  DropDown des Rangs  ###
    '############################
    Set DD = ActiveSheet.Shapes(DROPDOWN_RANGS).OLEFormat.Object
    '---
    If DD.List(DD) <> "" Then
      '--- Applique le filtre selon la valeur du DropDown ---
      R.CurrentRegion.AutoFilter Field:=13, Criteria1:=DD.List(DD), Operator:=xlFilterValues
    Else
      '--- Pas de filtre, le DropDown est égal à RIEN (vide) ---
      R.AutoFilter Field:=13
    End If
     
    If NoMetier Then DD.ListIndex = 1   '///ajout
     
    End Sub
     
    Sub AfficherTout()
    Dim i&
    '--- ListBox des Métiers ---
    Set LB = ActiveSheet.Shapes(LISTBOX_METIERS).OLEFormat.Object
    For i& = 1 To LB.ListCount
      If LB.Selected(i&) = True Then LB.Selected(i&) = False
    Next i&
    '--- DropDown des Risques ---
    Set DD = ActiveSheet.Shapes(DROPDOWN_RISQUES).OLEFormat.Object
    DD.ListIndex = 1
    '--- DropDown des Rangs ---
    Set DD = ActiveSheet.Shapes(DROPDOWN_RANGS).OLEFormat.Object
    DD.ListIndex = 1
    '--- Appel de la procédure de mise à jour ---
    Call ListBox2Filtre
    End Sub
    *******
    @ PatrickToulon
    Oui. Je suis parti sur ce processus de pensée mais pourquoi pas.

  18. #18
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re exemple
    voila un exemple
    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
    Public metier ' a declare en haut de module en public (utilisable partout dans le classeur )
    Sub trimetier()
      dim i,lig,ind  
        Set metier = CreateObject("Scripting.dictionary")
        With Sheets("Métiers")
            'on  prepare les items metier du dico(metier)
            For i = 5 To .UsedRange.Columns.Count - 1
                If Cells(1, i) Like "Métier*" Then ind = ind + 1: metier(ind) = ""
                For lig = 2 To Cells(Rows.Count, 2).End(xlUp).Row
                    If Trim(LCase(.Cells(lig, i))) = "x" Then metier(ind) = metier(ind) & """" & .Cells(lig, 2).Value & """"
                Next
                metier(ind) = Replace(metier(ind), """""", """, """)
            Next
            MsgBox metier(20)    ' metier avec l'index entre parentheze te donne l'argument du criterial pour un eventuel filtre
        End With
    End Sub
    le msgbox affiche le string de l'array tout formaté pour l'argument du criterial tout prêt

    criterial=metier(X) pour le filtre 'remplacer x par le numéro de métier
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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

Discussions similaires

  1. Impression des données via une popup
    Par brazza dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/04/2007, 09h43
  2. invite de données via une procédure
    Par CYCLOPE91440 dans le forum SQL
    Réponses: 1
    Dernier message: 09/12/2006, 12h55
  3. Réponses: 15
    Dernier message: 20/06/2006, 10h29
  4. récupération des données via une liste déroulante
    Par rahan_dave dans le forum Access
    Réponses: 1
    Dernier message: 13/10/2005, 12h27
  5. Réponses: 7
    Dernier message: 20/03/2005, 14h53

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