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 :

Remplacer le filtre des données Eccel par un UserForm


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Chargé d'études statistiques et géomarketing
    Inscrit en
    Décembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études statistiques et géomarketing

    Informations forums :
    Inscription : Décembre 2014
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Remplacer le filtre des données Eccel par un UserForm
    Bonjour,

    Pour des besoins un peu particulier, j'ai besoin de mettre en place un userform qui s'applique à une feuille de donnée à la manière du filtre proposé par Excel.
    Par exemple, je dispose d'une feuille de données avec des centaines de lignes et 5/6 colonnes dont 2 sont utiles pour faire le filtre (les colonnes A et B).
    Je souhaiterai proposer dans le userform une première TextBox dans laquelle l'utilisateur saisirai un identifiant sur 8 caractères. Cet identifiant serait en colonne A de ma feuille de donnée. Une fois cette textBox renseignée, il faudrait alors proposer une liste des valeurs présentes en colonnes B (en ne gardant que les valeurs possible en fonction de la colonne A). Enfin, l'utilisateur sélectionne une valeur dans cette liste et obtient la ligne correspondant dans la feuille de donnée (il n'y a qu'une ligne possible par couple de valeurs prises par les colonnes A/B).


    Voici un exemple :
    A B C D ...

    11111111 A peu import le contenu des colonnes suivantes..
    11111111 B peu import le contenu des colonnes suivantes..
    11111111 C peu import le contenu des colonnes suivantes..
    22222222 B peu import le contenu des colonnes suivantes..
    22222222 E peu import le contenu des colonnes suivantes..
    22222222 F peu import le contenu des colonnes suivantes..
    33333333 A peu import le contenu des colonnes suivantes..
    33333333 G peu import le contenu des colonnes suivantes..
    33333333 H peu import le contenu des colonnes suivantes..


    Merci d'avance pour votre aide.

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Bonjour djhib,

    Voici le UserForm que je te propose pour ta problématique :
    1. Un champ texte (TextBox1)
    2. Un bouton (CommandButton1)
    3. Un menu déroulant (ComboBox1)
    4. et un autre bouton (CommandButton2)

    Le code associé est le 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
    Public col_A As String
    Public col_B As String
     
    Private Sub ComboBox2_Change()
     
    Me.Label1 = Worksheets("Feuil4").Columns(1).Find(Me.ComboBox1.Value, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1).Value
     
    End Sub
     
    Private Sub ComboBox1_Change()
    Dim bool As Boolean
    Dim rng As Range
     
    col_B = Me.ComboBox1.Value
    bool = True
     
    With Worksheets("Feuil4")
        Set rng = .Range("A1:A" & .Columns(1).Find("*", , , , , xlPrevious).Row)
        'MsgBox rng.Address
        Do While bool
            'MsgBox rng.Find(col_A, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1).Address
            If rng.Find(col_A, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1) = col_B Then
                rng.Find(col_A, LookIn:=xlValues, LookAt:=xlWhole).Select
                bool = False
            Else
                Set rng = .Range(rng.Find(col_A, LookIn:=xlValues, LookAt:=xlWhole), .Columns(1).Find("*", , , , , xlPrevious))
                'MsgBox rng.Address
            End If
        Loop
    End With
     
    End Sub
     
    Private Sub CommandButton1_Click()
        If Me.TextBox1 <> "" Then
            If Not Worksheets("Feuil4").Columns(1).Find(Me.TextBox1.Value, LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then
                col_A = Me.TextBox1.Value
                Me.ComboBox1.List() = FindAll(Worksheets("Feuil4").Columns(1), Me.TextBox1.Value, xlValues, xlWhole).Offset(0, 1).Value
                Me.ComboBox1.ListIndex = 0
            Else
                MsgBox "Valeur non valide."
            End If
        Else
            MsgBox "Tapez une valeur dans le champ texte."
        End If
    End Sub
     
    Private Sub CommandButton2_Click()
        Unload Me
    End Sub
    avec la fonction "FindAll" du net à placer dans un 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
    Function FindAll(SearchRange As Range, _
                    FindWhat As Variant, _
                   Optional LookIn As XlFindLookIn = xlValues, _
                    Optional LookAt As XlLookAt = xlWhole, _
                    Optional SearchOrder As XlSearchOrder = xlByRows, _
                    Optional MatchCase As Boolean = False, _
                    Optional BeginsWith As String = vbNullString, _
                    Optional EndsWith As String = vbNullString, _
                    Optional BeginEndCompare As VbCompareMethod = vbTextCompare) As Range
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' FindAll
    ' This searches the range specified by SearchRange and returns a Range object
    ' that contains all the cells in which FindWhat was found. The search parameters to
    ' this function have the same meaning and effect as they do with the
    ' Range.Find method. If the value was not found, the function return Nothing. If
    ' BeginsWith is not an empty string, only those cells that begin with BeginWith
    ' are included in the result. If EndsWith is not an empty string, only those cells
    ' that end with EndsWith are included in the result. Note that if a cell contains
    ' a single word that matches either BeginsWith or EndsWith, it is included in the
    ' result.  If BeginsWith or EndsWith is not an empty string, the LookAt parameter
    ' is automatically changed to xlPart. The tests for BeginsWith and EndsWith may be
    ' case-sensitive by setting BeginEndCompare to vbBinaryCompare. For case-insensitive
    ' comparisons, set BeginEndCompare to vbTextCompare. If this parameter is omitted,
    ' it defaults to vbTextCompare. The comparisons for BeginsWith and EndsWith are
    ' in an OR relationship. That is, if both BeginsWith and EndsWith are provided,
    ' a match if found if the text begins with BeginsWith OR the text ends with EndsWith.
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
     
    Dim FoundCell As Range
    Dim FirstFound As Range
    Dim LastCell As Range
    Dim ResultRange As Range
    Dim XLookAt As XlLookAt
    Dim Include As Boolean
    Dim CompMode As VbCompareMethod
    Dim Area As Range
    Dim MaxRow As Long
    Dim MaxCol As Long
    Dim BeginB As Boolean
    Dim EndB As Boolean
     
     
    CompMode = BeginEndCompare
    If BeginsWith <> vbNullString Or EndsWith <> vbNullString Then
        XLookAt = xlPart
    Else
        XLookAt = LookAt
    End If
     
    ' this loop in Areas is to find the last cell
    ' of all the areas. That is, the cell whose row
    ' and column are greater than or equal to any cell
    ' in any Area.
     
    For Each Area In SearchRange.Areas
        With Area
            If .Cells(.Cells.Count).Row > MaxRow Then
                MaxRow = .Cells(.Cells.Count).Row
            End If
            If .Cells(.Cells.Count).Column > MaxCol Then
                MaxCol = .Cells(.Cells.Count).Column
            End If
        End With
    Next Area
    Set LastCell = SearchRange.Worksheet.Cells(MaxRow, MaxCol)
     
    On Error GoTo 0
    Set FoundCell = SearchRange.Find(what:=FindWhat, _
            after:=LastCell, _
            LookIn:=LookIn, _
            LookAt:=XLookAt, _
            SearchOrder:=SearchOrder, _
            MatchCase:=MatchCase)
     
    If Not FoundCell Is Nothing Then
        Set FirstFound = FoundCell
        Do Until False ' Loop forever. We'll "Exit Do" when necessary.
            Include = False
            If BeginsWith = vbNullString And EndsWith = vbNullString Then
                Include = True
            Else
                If BeginsWith <> vbNullString Then
                    If StrComp(Left(FoundCell.Text, Len(BeginsWith)), BeginsWith, BeginEndCompare) = 0 Then
                        Include = True
                    End If
                End If
                If EndsWith <> vbNullString Then
                    If StrComp(Right(FoundCell.Text, Len(EndsWith)), EndsWith, BeginEndCompare) = 0 Then
                        Include = True
                    End If
                End If
            End If
            If Include = True Then
                If ResultRange Is Nothing Then
                    Set ResultRange = FoundCell
                Else
                    Set ResultRange = Application.Union(ResultRange, FoundCell)
                End If
            End If
            Set FoundCell = SearchRange.FindNext(after:=FoundCell)
            If (FoundCell Is Nothing) Then
                Exit Do
            End If
            If (FoundCell.Address = FirstFound.Address) Then
                Exit Do
            End If
     
        Loop
    End If
     
    Set FindAll = ResultRange
     
    End Function
    En revanche, j'ai été confronté à une problématique que je n'explique pas : tes valeurs sur les colonnes A et B ne doivent pas se trouver sur la ligne 1...
    Je vais poser une question car je ne comprends vraiment pas...

    N'hésite pas à revenir vers moi !

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  3. #3
    Candidat au Club
    Homme Profil pro
    Chargé d'études statistiques et géomarketing
    Inscrit en
    Décembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études statistiques et géomarketing

    Informations forums :
    Inscription : Décembre 2014
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup Kimy_Ire pour ta proposition, je teste ça tout de suite

  4. #4
    Candidat au Club
    Homme Profil pro
    Chargé d'études statistiques et géomarketing
    Inscrit en
    Décembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études statistiques et géomarketing

    Informations forums :
    Inscription : Décembre 2014
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    En appliquant le code fourni le userform fonctionne parfaitement. (La liste des valeurs de Col B correspond bien a l'id saisi)/

    Je peux donc saisir un identifiant, proposer les différentes valeurs du champ B correspondant à l'identifiant saisi.

    Il me reste à afficher la ligne correspondant au couple ColA ColB demandé par l'utilisateur (soit 5/6 colonnes supplémentaires), point sur lequel je bloque...

  5. #5
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Bonjour djhib,

    Ce que j'avais compris était un "select" de la ligne correspondante.
    Que souhaites-tu exactement par rapport à cet affichage ?

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  6. #6
    Candidat au Club
    Homme Profil pro
    Chargé d'études statistiques et géomarketing
    Inscrit en
    Décembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études statistiques et géomarketing

    Informations forums :
    Inscription : Décembre 2014
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    En fait je souhaite récupérer la ligne correspondante et la copier dans une autre feuille (En fait l’idéal c'est que la feuille avec les données soit masquée, et que l'utilisateur ne voit au finale que ce qui correspond à sa saisie).

  7. #7
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Voici comment mettre les valeurs sur la ligne 1 de "Feuil3" :
    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
    With Worksheets("Feuil4")
        Set rng = .Range("A1:A" & .Columns(1).Find("*", , , , , xlPrevious).Row)
        'MsgBox rng.Address
        Do While bool
            'MsgBox rng.Find(col_A, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1).Address
            If rng.Find(col_A, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1) = col_B Then
                For i = 0 To 5
                    Worksheets("Feuil3").Range("A1").Offset(0, i) = rng.Find(col_A, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, i)
                Next i
                bool = False
            Else
                Set rng = .Range(rng.Find(col_A, LookIn:=xlValues, LookAt:=xlWhole), .Columns(1).Find("*", , , , , xlPrevious))
                'MsgBox rng.Address
            End If
        Loop
    End With
    Toujours en train de chercher une solution plus stable sur cette discussion.

    Pour cacher ta feuille : Worksheets("Feuil4").Visible = xlSheetVeryHidden, tout simplement.

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  8. #8
    Candidat au Club
    Homme Profil pro
    Chargé d'études statistiques et géomarketing
    Inscrit en
    Décembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études statistiques et géomarketing

    Informations forums :
    Inscription : Décembre 2014
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Super, merci beaucoup c'est exactement ce dont j'ai besoin

  9. #9
    Candidat au Club
    Homme Profil pro
    Chargé d'études statistiques et géomarketing
    Inscrit en
    Décembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études statistiques et géomarketing

    Informations forums :
    Inscription : Décembre 2014
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Bon j'ai finalement besoin de compliquer un petit peu cet outil...
    1) Il faudrait que lorsque l'utilisateur saisie un identifiant dans la première Textbox, l'ensemble des lignes contenant cette valeur soit affichée dans l'onglet Feuil3. Ensuite s'il sélectionne une valeur dans la Combobox1 alors seule ce qui correspond au couple ColA colB doit être dans la feuil3.

    2) il existe certains cas pour lesquels le couple ColA colB n'est pas unique. Dans ce cas il existe des doublons dans la combobox... il ne faudrait que la valeur de ColB n'apparaisse pas en double. Toutes les lignes correspondant au couple ColA ColB doivent ensuite s'afficher dans la feuil3.


    Merci beaucoup pour votre aide

Discussions similaires

  1. [MySQL] Tri par formulaire suite à un filtre des données
    Par almoha dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/09/2010, 14h52
  2. Réponses: 3
    Dernier message: 26/02/2007, 14h43
  3. Récuperation des données envoyées par Form en POST
    Par bobatel dans le forum Langage
    Réponses: 9
    Dernier message: 26/04/2006, 14h59
  4. [MySQL] Taille limite des données passées par POST
    Par FoxLeRenard dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/03/2006, 17h46
  5. Réponses: 5
    Dernier message: 27/12/2004, 00h38

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