Tôi biết rằng tôi đang sử dụng SuperUser chứ không phải trên StackOverflow, nhưng giải pháp cho vấn đề này có thể được tìm thấy khi sử dụng mã VBA trên Excel 2016.
Tôi có vấn đề tương tự (phức tạp hơn).
Tôi muốn thêm một số bộ lọc trên các cột rõ ràng nhưng không chỉ ở hàng 1 trên hàng 2 như bạn có thể thấy trong phần chụp màn hình sau.
Tôi đã thử sử dụng Excel GUI nhưng điều này dường như là không thể, vì vậy tôi đã viết đoạn mã sau:
'********************************************************
'* 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
Logic của mã này là
A. Bỏ các ô tiêu đề được hợp nhất theo chiều dọc để cho phép thêm bộ lọc vào hàng 2
Range("A1:A2").MergeCells = False
Các ô A1 và A2 không được trộn lẫn.
B. Thêm bộ lọc tự động trên tất cả các ô của hàng 2
Range("A2:Z" & nLast).AutoFilter
Bộ lọc tự động được tạo cho các ô trong tất cả các hàng trừ hàng 1.
C. Xóa hoặc ẩn Combobox LỌC cho một số cột
Selection.AutoFilter Field:=GetColumnIndex("C"), VisibleDropDown:=False
DropBox của Cột "C" bị ẩn.
D. Hợp nhất các ô chưa ghép để khôi phục trạng thái ban đầu
Range("A1:A2").MergeCells = True
Các ô A1 và A2 được hợp nhất lại.