我能想到的两种方法:
循环浏览每一行并设置隐藏属性。
由于代码在 ToggleButton 后面,我们不需要指定工作表名称。代码将在当前活动的工作表上运行,该工作表是正确的工作表,因为您在其上按下了切换按钮。
由于 ToggleButton 返回 TRUE 或 FALSE,我们可以将 hidden 属性设置为该值。
Private Sub ToggleButton1_Click()
Dim rDataRange As Range
Dim rCell As Range
'Set rDataRange = Range("A2", Cells(Rows.Count, 1).End(xlUp))
'Take into account hidden rows:
Set rDataRange = Range("A2", HiddenLastCell(ActiveSheet))
For Each rCell In rDataRange
If rCell = "Admin" Then
Rows(rCell.Row).EntireRow.Hidden = ToggleButton1
End If
Next rCell
End Sub
在rDataRange 中设置范围使用此函数来查找最后一个单元格,即使它是隐藏的:
Public Function HiddenLastCell(wrkSht As Worksheet) As Range
Dim rLastCell As Range
Dim bHasHiddenData As Boolean
Dim rSearch As Range
Dim lLastCol As Long, lLastRow As Long
Dim lRow As Long
With wrkSht
Set rLastCell = .Columns(1).Find("*", , , , xlByColumns, xlPrevious)
If Not rLastCell Is Nothing Then
bHasHiddenData = rLastCell.Row <> .UsedRange.Rows.Count
Else
bHasHiddenData = .UsedRange.Rows.Count > 1
End If
If bHasHiddenData Then
Set rSearch = .Range(.Cells(1, 1), .Cells(.UsedRange.Row + .UsedRange.Rows.Count - 1, 1))
For lRow = rSearch.Rows.Count + 1 To 2 Step -1
If .Cells(lRow, 1) = vbNullString And .Cells(lRow - 1, 1) <> vbNullString Then
Set HiddenLastCell = .Cells(lRow, 1)
End If
Next lRow
Else
On Error Resume Next
lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
lLastRow = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
If lLastCol = 0 Then lLastCol = 1
If lLastRow = 0 Then lLastRow = 1
Set HiddenLastCell = wrkSht.Cells(lLastRow, lLastCol)
On Error GoTo 0
End If
End With
End Function
使用自动过滤器隐藏行。
将此代码添加到按钮:
Private Sub ToggleButton1_Click()
FilterAdmin ToggleButton1.Value
End Sub
此代码将应用或删除过滤器:
Sub FilterAdmin(ToggleOn As Boolean)
Dim rDataRange As Range
Dim rLastCell As Range
With ThisWorkbook
If ToggleOn Then
Set rLastCell = LastCell(.Worksheets("Sheet1"))
With .Worksheets("Sheet1")
'Get reference to data range (A1 to last used cell).
'Or you can manually set the range.
Set rDataRange = .Range(.Cells(1, 1), rLastCell)
'If auto-filter isn't turned on then turn it on.
If Not .AutoFilterMode Then rDataRange.AutoFilter
'Remove any applied filters.
If .FilterMode Then .ShowAllData
rDataRange.AutoFilter Field:=1, Criteria1:="<>Admin", Operator:=xlAnd
End With
Else
If .Worksheets("Sheet1").FilterMode Then .Worksheets("Sheet1").ShowAllData
End If
End With
End Sub
此函数将返回包含数据并用于上述过程的最后一个单元格:
Public Function LastCell(wrkSht As Worksheet, Optional Col As Long = 0) As Range
Dim lLastCol As Long, lLastRow As Long
On Error Resume Next
With wrkSht
If Col = 0 Then
lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
lLastRow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
Else
lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
lLastRow = .Columns(Col).Find("*", , , , xlByColumns, xlPrevious).Row
End If
If lLastCol = 0 Then lLastCol = 1
If lLastRow = 0 Then lLastRow = 1
Set LastCell = wrkSht.Cells(lLastRow, lLastCol)
End With
On Error GoTo 0
End Function
您可以将代码中的工作表引用更改为使用ActiveSheet 而不是Sheet1(同样,当您按下切换按钮时,正确的工作表将处于活动状态)。