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
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 ?