Ich weiß, dass ich auf SuperUser und nicht auf StackOverflow bin, aber die Lösung für dieses Problem ist die Verwendung von VBA-Code in Excel 2016.
Ich habe ein ähnliches (komplexeres) Problem.
Ich möchte einige Filter für explizite Spalten hinzufügen, aber nicht für Zeile 1 nur für Zeile 2, wie Sie in der folgenden Abbildung sehen können.
Ich habe versucht, Excel GUI zu verwenden, aber dies scheint unmöglich zu sein. Deshalb habe ich folgenden Code geschrieben:
'********************************************************
'* 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
Die Logik dieses Codes ist
A. Vereinigen Sie vertikal verbundene Header-Zellen, um Filter in Zeile 2 hinzuzufügen
Range("A1:A2").MergeCells = False
Die Zellen A1 und A2 sind nicht eingetaucht.
B. Fügen Sie in allen Zellen von Zeile 2 AutoFilter hinzu
Range("A2:Z" & nLast).AutoFilter
AutoFilter wird für Zellen in allen Zeilen außer Zeile 1 generiert.
C. Entfernen oder verbergen Sie die FILTER Combobox für einige Spalten
Selection.AutoFilter Field:=GetColumnIndex("C"), VisibleDropDown:=False
DropBox der Spalte "C" ist ausgeblendet.
D. Verbinden Sie nicht verbundene Zellen, um den ursprünglichen Zustand wiederherzustellen
Range("A1:A2").MergeCells = True
Die Zellen A1 und A2 werden wieder zusammengeführt.