Trong một bảng dữ liệu lớn, Ed muốn có thể nhanh chóng quét và xem liệu một cột cụ thể có đang được lọc tích cực hay không. Anh ấy tự hỏi liệu có cách nào áp dụng định dạng có điều kiện để thay đổi màu nền của cột khi có một bộ lọc đang phát dựa trên cột đó không.

Có một số cách bạn có thể tiếp cận nhiệm vụ này. Tất cả chúng đều liên quan đến macro và mục đích của mỗi macro là xác định xem một bộ lọc có đang hoạt động cho một cột cụ thể hay không. Một tùy chọn là tạo một hàm kiểm tra trang tính để tìm bộ lọc và nếu tìm thấy một bộ lọc ở đúng vị trí, hãy kiểm tra từng cột trong vùng được lọc để xem liệu cột đó có bộ lọc đang hoạt động hay không. Macro sau đây thực hiện điều đó.

Sub ColorFilterColumn()

Dim flt As Filter     Dim iCol As Integer     Dim lRow As Long     Dim rTemp As Range     Dim bFullCol As Boolean

' Set as True if you want entire column shaded     bFullCol = False

If ActiveSheet.AutoFilterMode Then         iCol = ActiveSheet.AutoFilter.Range.Column         lRow = ActiveSheet.AutoFilter.Range.Row         Application.EnableEvents = False         For Each flt In ActiveSheet.AutoFilter.Filters             If bFullCol Then                 Set rTemp = Cells(lRow, iCol).EntireColumn             Else                 Set rTemp = Cells(lRow, iCol)

End If

If flt.On Then                 rTemp.Interior.Color = vbYellow             Else                 rTemp.Interior.ColorIndex = xlColorIndexNone             End If

Set rTemp = Nothing             iCol = iCol + 1         Next flt         Application.EnableEvents = True     End If End Sub

Nếu macro định vị bộ lọc đang hoạt động, nó sẽ đánh dấu (bằng màu vàng) ô đầu tiên trong bảng được lọc hoặc toàn bộ cột có bộ lọc. Việc xác định xem một ô hoặc toàn bộ cột được tô sáng dựa trên giá trị True / False được gán cho biến bFullCol.

Nếu muốn, bạn có thể tạo một hàm trả về True hoặc False dựa trên việc một bộ lọc có hiệu lực đối với một cột cụ thể hay không. Với một hàm như vậy, bạn có thể tạo quy tắc định dạng có điều kiện để định dạng cột dựa trên giá trị được trả về.

Function bHasFilter(rcell As Range) As Boolean     Dim lBaseCol As Long     Dim lCol As Long

Application.Volatile     bHasFilter = False

If ActiveSheet.AutoFilterMode Then         With ActiveSheet.AutoFilter             lBaseCol = .Range.Column             lCol = rcell.Column - lBaseCol + 1             If lCol > 0 And lCol <= .Filters.Count Then                 If .Filters(lCol).On Then bHasFilter = True             End If         End With     End If End Function

Để sử dụng hàm này, chỉ cần sử dụng một công thức như sau trong trang tính của bạn hoặc trong quy tắc định dạng có điều kiện:

=bHasFilter(F23)

Trước tiên, hàm sẽ kiểm tra xem có bộ lọc nào đang có hiệu lực hay không. Nếu vậy, nó sẽ tính toán xem cột của ô được chuyển đến công thức có nằm trong phạm vi của các cột được lọc hay không. (Hàng được tham chiếu trong công thức không thực sự quan trọng.) Nếu vậy, nó sẽ kiểm tra xem bộ lọc có được bật cho cột đó hay không.

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (13410) áp dụng cho Microsoft Excel 2007, 2010, 2013, 2016, 2019 và Excel trong Office 365.