我正在尝试筛选一个有时会导致没有数据的表。我正在努力计算可见的行数,以做出这个决定。
如果只有标题行-";无细胞";如果具有可见行-";具有提供者";
在下面的代码中,它似乎仍然在计算筛选的行。。。
Sub Add_New_Name()
Dim pTable1 As Range
Dim pVisible As Range
'Application.DisplayAlerts = False
'Application.ScreenUpdating = False
' Select Roster & Clear Roster Table Filters
Sheet8.Activate
Sheet8.ListObjects("Table1").AutoFilter.ShowAllData
' Set Variables
Set pTable1 = Range("B2").CurrentRegion
Set pVisible = pTable1.SpecialCells(xlCellTypeVisible)
' Check for New Associate
With Sheet8.ListObjects("Table1")
.Range.AutoFilter Field:=23, Criteria1:="0"
.Range.AutoFilter Field:=22, Criteria1:="Associate"
End With
If pVisible.Rows.Count > 1 Then
MsgBox "No Cells"
Else
MsgBox "Has Provider"
End If
End Sub
是否有筛选的行
- 您可以使用
On Error Resume Next
,如Tim Williams的回答所示 - 不能对非连续区域使用行计数,因为它只引用该区域的第一个区域。因此,如果第一个数据行不可见,那么无论之后有多少行可见,它都将返回1
- 但是,您可以在不连续的单列范围内使用单元格计数
Option Explicit
Sub Add_New_Name()
Application.ScreenUpdating = False
Dim cc As Long
With Sheet8.ListObjects("Table1")
If .ShowAutoFilter Then ' remove filter
If .AutoFilter.FilterMode Then .AutoFilter.ShowAllData
End If
.Range.AutoFilter Field:=23, Criteria1:="0"
.Range.AutoFilter Field:=22, Criteria1:="Associate"
' Get the cells count of any single column range!
cc = .ListColumns(1).Range.SpecialCells(xlCellTypeVisible).Cells.Count
.AutoFilter.ShowAllData ' remove filter
End With
Application.ScreenUpdating = True ' before the message box
MsgBox IIf(cc = 1, "No Cells", "Has Provider")
End Sub
以下是通常的操作方法:
Sub Add_New_Name()
Dim pVisible As Range
Sheet8.Activate
With Sheet8.ListObjects("Table1")
.AutoFilter.ShowAllData
.Range.AutoFilter Field:=23, Criteria1:="0"
.Range.AutoFilter Field:=22, Criteria1:="Associate"
On Error Resume Next 'ignore error if no visible rows
Set pVisible = .DataBodyRange.SpecialCells(xlCellTypeVisible) 'ignore headers
On Error GoTo 0 'stop ignoring errors
End With
If pVisible Is Nothing Then
MsgBox "No Cells"
Else
MsgBox "Has Provider"
End If
End Sub
更干净的做法是从对SpecialCells
的调用中排除标头,如果没有行可见,则捕获/忽略错误。
这样,如果你继续使用pVisible
,你就没有标题了。
这是对我来说最直接的方法:
VisibleRowCount = WorksheetFunction.SUBTOTAL(103, Sheet2.ListObjects("Table1").ListColumns(22).DataBodyRange)
但如果您不确定表是否为空,请使用:
If not Sheet2.ListObjects("Table1").DataBodyRange is Nothing then _ VisibleRowCount = WorksheetFunction.SUBTOTAL(103, Sheet2.ListObjects("Table1").ListColumns(22).DataBodyRange)
附录
正如VisualBasic2008所指出的:
如果您刚刚按值筛选了列,那么使用SubTotal是完全安全的。
回想起来,我会包括整个ListColumn.Range和计数中的-1以避免错误。
VisibleRowCount = WorksheetFunction.SUBTOTAL(103, Sheet2.ListObjects("Table1").ListColumns(22).Range) -1
在自动筛选后设置pVisible。
With Sheet8.ListObjects("Table1")
.Range.AutoFilter Field:=23, Criteria1:="0"
Range.AutoFilter Field:=22, Criteria1:="Associate"
End With
Set pVisible = pTable1.SpecialCells(xlCellTypeVisible)
替代解决方案
Dim pTable As ListObject 'use instead of range
Dim pVisible As Range
Set pTable = Sheet8.ListObjects("Table1")
With pTable
.Range.AutoFilter Field:=23, Criteria1:="0"
.Range.AutoFilter Field:=22, Criteria1:="Associate"
End With
On Error Resume Next
Set pVisible = pTable.DataBodyRange.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
'Stores range of visible cells. Does not raise error in case of not data.
If Not pVisible Is Nothing Then 'Checks if some info is present.
MsgBox "Has Provider"
Else
MsgBox "No Provider"
End If