Je sais que je suis sur SuperUser et non sur StackOverflow, mais la solution à ce problème peut être trouvée en utilisant le code VBA sur Excel 2016.
J'ai un problème similaire (plus complexe).
Je veux ajouter des filtres sur des colonnes explicites mais pas sur la ligne 1 uniquement sur la ligne 2 comme vous pouvez le voir dans la capture d'écran suivante.
J'ai essayé d'utiliser l'interface graphique Excel, mais cela semble impossible, j'ai donc écrit le code suivant:
'********************************************************
'* SetFilter()
'********************************************************
'* PUBLIC method to call to define CUSTOM AutoFilter
'* on complex header.
'********************************************************
Sub SetFilter()
'Compute last row number
Dim nLast As Long
nLast = Range("A" & Rows.Count).End(xlUp).Row
'Lock screen update
Application.ScreenUpdating = False
'Unmerge merged cells to allow adding filter
Range("A1:A2").MergeCells = False
Range("B1:B2").MergeCells = False
Range("C1:C2").MergeCells = False
Range("D1:D2").MergeCells = False
Range("E1:E2").MergeCells = False
Range("F1:F2").MergeCells = False
'Add filter on row 2 and not 1
Range("A2:Z" & nLast).Select
Selection.AutoFilter
'Remove (or Hide) filter combobox for some columns
Selection.AutoFilter Field:=GetColumnIndex("C"), VisibleDropDown:=False
Selection.AutoFilter Field:=GetColumnIndex("G"), VisibleDropDown:=False
Selection.AutoFilter Field:=GetColumnIndex("H"), VisibleDropDown:=False
'Merge unmerged cells to restore previous state
Range("A1:A2").MergeCells = True
Range("B1:B2").MergeCells = True
Range("C1:C2").MergeCells = True
Range("D1:D2").MergeCells = True
Range("E1:E2").MergeCells = True
Range("F1:F2").MergeCells = True
'Unlock screen update
Application.ScreenUpdating = True
End Sub
'********************************************************
'* GetColumnIndex()
'********************************************************
'* return column's index from column letters
'********************************************************
Function GetColumnIndex(sColLetter As String) As Integer
Dim n As Integer: n = 0
Dim iMax As Integer: iMax = Len(sColLetter)
Dim i As Integer
Dim sChar As String
Dim c As Integer
For i = 1 To iMax
sChar = Mid(sColLetter, i, 1)
c = 1 + Asc(sChar) - Asc("A")
n = n * 26 + c
Next
If n = 1 Then
n = 1
End If
GetColumnIndex = n
End Function
La logique de ce code est
A. Annuler la fusion des cellules d'en-tête fusionnées verticalement pour permettre l'ajout de filtre sur la ligne 2
Range("A1:A2").MergeCells = False
Les cellules A1 et A2 ne sont pas fusionnées.
B. Ajouter un filtre automatique sur toutes les cellules de la ligne 2
Range("A2:Z" & nLast).AutoFilter
Le filtre automatique est généré pour les cellules de toutes les lignes sauf la ligne 1.
C. Supprimer ou masquer la zone de liste déroulante FILTER pour certaines colonnes
Selection.AutoFilter Field:=GetColumnIndex("C"), VisibleDropDown:=False
La DropBox de la colonne "C" est masquée.
D. Fusionner les cellules non fusionnées pour restaurer l'état d'origine
Range("A1:A2").MergeCells = True
Les cellules A1 et A2 sont à nouveau fusionnées.