我有这个 VBA 代码可以动态地从表中删除行,但是我无法检测到我的代码创建的过滤器何时返回 0 行,我希望您在发生这种情况时跳过删除步骤,因为这意味着有没有要删除的行,但是,它在删除步骤中给了我一个错误,这是我的代码,我尝试使用
If Not rngFiltro Is Nothing
但它给了我一个错误,这是我的代码:
Sub EXC_L(lo As ListObject, ws As Worksheet)
Dim colFornecedor As ListColumn
Dim rngFiltro As Range
With ws
lo.AutoFilter.ShowAllData
Set colFornecedor = lo.ListColumns("Fornecedor")
colFornecedor.Range.AutoFilter Field:=colFornecedor.Index, Criteria1:=""
On Error Resume Next
Set rngFiltro = colFornecedor.DataBodyRange.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not rngFiltro Is Nothing Then
rngFiltro.EntireRow.Delete
End If
lo.AutoFilter.ShowAllData
End With
End Sub
ListObject
)问题
colFornecedor.Range
是单列。您无法通过 1 以外的任何其他 (colFornecedor.Index
) 字段过滤单个列。
如果您以这种方式(使用1)进行过滤,则无法如此轻松地引用整个过滤表行(您需要
Intersect
)。
在处理 Excel 表格时,IMO,超出行和列的范围是不正确的(至少没有必要),例如使用
rngFiltro.EntireRow
。
通过
Worksheet
或ListObject
。通常可以使用另一个来引用一个,例如:
Dim ws As Worksheet: Set ws = lo.Range.Worksheet
Dim lo As ListObject: Set lo = ws.ListObjects(1)
改进
Sub DeleteBlankSupplierRows( _
ByVal lo As ListObject, _
Optional ByVal DisplayMessages As Boolean = False)
Const PROC_TITLE As String = "Delete Blank Supplier Rows"
' Define constants.
Const LIST_COLUMN_NAME As String = "Fornecedor"
Const COLUMN_CRITERION As String = ""
' Declare a variable to hold the filtered range (object).
Dim frg As Range
' Filter the table.
With lo
' Clear table filters.
If .ShowAutoFilter Then
If .AutoFilter.FilterMode Then .AutoFilter.ShowAllData
End If
' Filter.
.Range.AutoFilter _
Field:=.ListColumns(LIST_COLUMN_NAME).Index, _
Criteria1:=COLUMN_CRITERION
' Reference the filtered rows.
On Error Resume Next
Set frg = .DataBodyRange.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
' Clear table filters.
.AutoFilter.ShowAllData
End With
' Check if no filtered rows.
If frg Is Nothing Then
If DisplayMessages Then
MsgBox "No blank Supplier rows found!", vbExclamation, PROC_TITLE
End If
Exit Sub
End If
' Delete filtered rows.
frg.Delete Shift:=xlShiftUp
' Inform.
If DisplayMessages Then
MsgBox "Blank Supplier rows deleted.", vbInformation, PROC_TITLE
End If
End Sub