VBA过滤器返回0行,如何检测

问题描述 投票:0回答:1

我有这个 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
excel vba
1个回答
0
投票

删除Excel表格指定列为空的行(
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
© www.soinside.com 2019 - 2024. All rights reserved.