Filtre colonne selon référence en-tête liée à une liste déroulante

Bonjour à tous

Ma demande n'est pas la première ici. Mais j'avais sans doute mal exprimé mon intention lors d'un précédent post.
Par ailleurs, le fichier en pièce jointe permettra une meilleure compréhension je l'espère.

Je souhaite pouvoir mettre un filtre automatique sur une colonne en référence à un choix fois sur une liste déroulante.
Dans mon exemple, il s'agit des cellules marquées en jaune.

Selon le choix fait dans la liste déroulante, je souhaiterais que la colonne liée soit filtrée sans les éléments vides.
Ainsi je peux créer des liste de contrôles.

Merci d'avance de vos précieux conseils !

Corialement
William

Bonjour Willau

Aucun fichier ".xlsm" avec déjà du code à nous donner

Bonjour

Mais j'avais sans doute mal exprimé mon intention lors d'un précédent post.
Par ailleurs, le fichier en pièce jointe permettra une meilleure compréhension je l'espère.

Je suppose que vous faites référence à ce fil ? --> https://forum.excel-pratique.com/s/goto/1079155
Votre fichier en retour dans lequel
- La ligne 4 est supprimé. Il faut éviter les cellules fusionnées au max surtout avec VBA
- Suppression du gris dans la ligne 10. On ne met les filtres que sur la ligne des titres
- La colonne E n'est utilisée que pour la formule Sous.total. Attention à ne rien mettre d'autres dans cette colonne en dessous de vos données.
- votre liste déroulante inclut des vides dûs aux lignes vides de votre tableau structuré en feuille "Dispo". Pour mémoire un tableau structuré ne doit jamais contenir des lignes sans données. Lorsque vous devez ajouter une donné, positionnez vous juste en dessous de la dernière ligne complétée puis entrer vos données. vous verrez que le tableau va s'adapter automatiquement
A moins que vous ayez supprimé des données pour poster sur le forum, vous devriez supprimer les lignes 13 à 101.

1. le code

Private Sub Worksheet_Change(ByVal Target As Range)
Dim dercol As Integer, derlig As Integer, i As Integer

If Target.Count > 1 Then
    On Error Resume Next
    ActiveSheet.ShowAllData
    On Error GoTo 0
    Exit Sub
End If

If Not Intersect(Target, Range("E3:F3")) Is Nothing Then

    dercol = Cells(3, Columns.Count).End(xlToLeft).Column
    derlig = Cells(Rows.Count, 5).End(xlUp).Row

    For i = 19 To dercol
        If Cells(3, i) = Target.Value Then
            On Error Resume Next
            ActiveSheet.ShowAllData
            On Error GoTo 0
            Range(Cells(9, 5), Cells(dercol, derlig)).AutoFilter Field:=i - 4, Criteria1:="<>"
            Exit Sub
        End If
    Next i
End If
End Sub

2. Pour faire plus simple, le fichier en retour :

Vous auriez intérêt à éviter de griser toutes les lignes et colonnes non utilisées. Les couleurs, cela fait augmenter le poids des fichiers. Là vous en avez mis jusque les dernières lignes (1048576 !) et colonne (16000 !)

Cordialement

@Dan

Merci pour ta contribution.
Le précédent post n'est pas celui dont tu fais mention, mais un autre plus ancien encore.
J'ai d'ailleurs adressé mes remerciements pour l'aide et fermé, comme demandé, le dit post.

Je vais regardé au plus vite le contenu du fichier retourné. Je me réjouis déjà.
C'est super de pouvoir compter sur vous.

A plus tard.

William

@Dan

Bonjour Dan,

Je me permets de revenir sur votre réponse.
Encore une fois merci pour l'efficacité du code.
J'ai néanmoins quelque peu du mal à le replacer sur mon fichier source (avec des données).

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim dercol As Integer, derlig As Integer, i As Integer

If Target.Count > 1 Then
    On Error Resume Next
    ActiveSheet.ShowAllData
    On Error GoTo 0
    Exit Sub
End If

If Not Intersect(Target, Range("Disp_Nr")) Is Nothing Then

    dercol = Cells(3, Columns.Count).End(xlToLeft).Column
    derlig = Cells(Rows.Count, 5).End(xlUp).Row

    For i = 19 To dercol
        If Cells(3, i) = Target.Value Then
            On Error Resume Next
            ActiveSheet.ShowAllData
            On Error GoTo 0
            Range(Cells(9, 5), Cells(dercol, derlig)).AutoFilter Field:=i - 4, Criteria1:="<>"
            Exit Sub
        End If
    Next i
End If
End Sub

Dans

If Not Intersect(Target, Range("Disp_Nr")) Is Nothing Then

Je me suis permis ici d'intégrer le nom de la cellule de recherche par "Disp_Nr" au lieu du E3:F3 initial.

C'est dans la deuxième partie du code que je n'arrive pas à adapter sur mon nouveau fichier.

A quoi servent ces variables:

Dim dercol As Integer, derlig As Integer, i As Integer

Et comment déterminer les colonnes qu'il faut filtrer ?

For i = 19 To dercol
        If Cells(3, i) = Target.Value Then
            On Error Resume Next
            ActiveSheet.ShowAllData
            On Error GoTo 0
            Range(Cells(9, 5), Cells(dercol, derlig)).AutoFilter Field:=i - 4, Criteria1:="<>"
            Exit Sub
        End If
    Next i
End If
End Sub

Je me rends compte qu'il est plus difficile de travailler sans le fichier que je souhaite adapter.
Mais je souhaiterais développer mon nouveau fichier avec la même solution que dans le fichier envoyé.

Pourrais-je avoir quelques explications?

D'avance merci

Willau

Bonjour

A quoi servent ces variables:
Dim dercol As Integer, derlig As Integer, i As Integer

A alloué de la mémoire à excel. Plus petites elles sont mieux c'est. Ne pas déclarer revient à utiliser le max de mémoire. C'est une bonne pratique que de les déclarer comme tout programmeur le fera. Prenez un peu de temps pour faire un peu de lecture sur la toile à ce sujet
Un peu d'explication ici --> https://www.excel-pratique.com/fr/vba/variables

Et comment déterminer les colonnes qu'il faut filtrer ?

Je n'ai pas compris la question. Dans votre cas Range(disp_nr), correspond toujours au code postaux ?

Rechercher des sujets similaires à "filtre colonne reference tete liee liste deroulante"