Filtre automatique à choix multiple

Bonjour,

J'ai le code que vous pouvez retrouver ci-dessous qui me permet d'appliquer un filtre automatique sur des colonnes précisent en fonction de ce que j'ai sélectionné dans mon filtre. Sauf que je souhaiterais que chaque filtre dépendent les uns des autres donc que lorsque j'applique un filtre en U3 alors seul les lignes qui dépendent de la donnée (donc de ce qu'il trouve en colonne 16 don P) sortent et que si je souhaite y appliquer un autre filtre par exemple en U4 alors que le code applique les filtres en colonne P et en colonne R etc. Mais j'ai pu remarquer en essayant que ça ne fonctionnait pas notamment parce que parfois des cellules sont vides dans les colonnes P, K, Q et O (ce qui est normal certaines cellules doivent être vide). Pouvez vous m'aider ?

A savoir que dans mes cellules j'ai plusieurs données qui sont normalement séparer par des virgules et que j'ai considéré dans mon code.

Voici mon code :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    On Error GoTo Exitsub
    Application.EnableEvents = False

    Dim Filters As Variant
    Dim i As Long, LastRow As Long
    Dim RowVisible As Boolean
    Dim SelectedValues As Variant, CellValues As Variant, val As Variant, cellVal As Variant
    Dim Delimiter As String: Delimiter = ", "

    ' Dictionnaire des cellules de filtres et leur colonne cible
    Filters = Array( _
        Array("U3", 16), _
        Array("U4", 18), _
        Array("U5", 11), _
        Array("U6", 10), _
        Array("U7", 19), _
        Array("U8", 17), _
        Array("U9", 15) _
    )

    ' Gérer la sélection multiple pour chaque filtre
    For i = LBound(Filters) To UBound(Filters)
        If Not Intersect(Target, Me.Range(Filters(i)(0))) Is Nothing Then
            If Target.Validation.Type = xlValidateList Then
                Dim NewValue As String, OldValue As String
                NewValue = Trim(Target.Value)
                Application.Undo
                OldValue = Trim(Target.Value)

                If OldValue = "" Then
                    Target.Value = NewValue
                Else
                    ' Créer un tableau des valeurs existantes
                    Dim ExistingValues() As String
                    ExistingValues = Split(OldValue, Delimiter)

                    ' Vérifier si la nouvelle valeur existe déjà
                    Dim ValueExists As Boolean: ValueExists = False
                    Dim NewValues As String: NewValues = ""

                    For Each val In ExistingValues
                        If Trim(val) = NewValue Then
                            ValueExists = True
                        Else
                            If NewValues <> "" Then NewValues = NewValues & Delimiter
                            NewValues = NewValues & val
                        End If
                    Next val

                    If ValueExists Then
                        Target.Value = NewValues
                    Else
                        Target.Value = OldValue & Delimiter & NewValue
                    End If
                End If
            End If
        End If
    Next i

    ' Appliquer les filtres cumulés
    LastRow = Me.Cells(Me.Rows.Count, "B").End(xlUp).Row
    Me.Rows.Hidden = False ' Réinitialiser l'affichage

    Dim RowIndex As Long
    For RowIndex = 20 To LastRow
        RowVisible = True

        ' Pour chaque filtre actif
        For i = LBound(Filters) To UBound(Filters)
            Dim FilterCell As Range: Set FilterCell = Me.Range(Filters(i)(0))
            Dim FilterCol As Integer: FilterCol = Filters(i)(1)

            ' Si le filtre contient des valeurs
            If Trim(FilterCell.Value) <> "" Then
                SelectedValues = Split(FilterCell.Value, Delimiter)
                Dim CellValue As String: CellValue = CStr(Me.Cells(RowIndex, FilterCol).Value)
                Dim MatchFound As Boolean: MatchFound = False

                ' Si la cellule n'est pas vide
                If Trim(CellValue) <> "" Then
                    ' Splitter les valeurs de la cellule
                    CellValues = Split(CellValue, Delimiter)

                    ' Comparer chaque valeur sélectionnée avec chaque valeur de la cellule
                    For Each val In SelectedValues
                        For Each cellVal In CellValues
                            If Trim(cellVal) = Trim(val) Then
                                MatchFound = True
                                Exit For
                            End If
                        Next cellVal
                        If MatchFound Then Exit For
                    Next val
                End If

                ' Masquer si aucune correspondance
                If Not MatchFound Then
                    RowVisible = False
                    Exit For
                End If
            End If
        Next i

        ' Appliquer le masquage
        Me.Rows(RowIndex).Hidden = Not RowVisible
    Next RowIndex

Exitsub:
    Application.EnableEvents = True
End Sub
Rechercher des sujets similaires à "filtre automatique choix multiple"