首页 > 解决方案 > 计数过滤的行并显示计数

问题描述

我想按三个条件进行过滤,计算被过滤的行数,在单元格 N2 中输出该计数,然后删除被过滤的行。我不确定为什么下面的代码不起作用。

Sheets("Sheet1").Range("B4").Select
Sheets("Sheet1").Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
Selection.AutoFilter Field:=8, Criteria1:=Array("A", "B", "C"), Operator:=xlFilterValues
Selection.Cell("N1").Select
ActiveCell.Value = Range(Cells(1, 1), Cells(Selection.SpecialCells(xlcelltypelast).Row, Selection.SpecialCells(xlCellTypeLastCell).Column)).Count
Selection.AutoFilter

标签: excelvba

解决方案


想象一下这个数据

在此处输入图像描述

  • 首先,您应该避免在 Excel VBA 中使用 Select

  • 同样既不xlLastCell也不xlcelltypelast存在,您可能意味着xlCellTypeLastCell我建议激活Option Explicit以避免此类拼写错误:在 VBA 编辑器中转到ToolsOptionsRequire Variable Declaration

  • 过滤后的数据可能不是一个连续的范围,而是分为不同的区域。

    在此处输入图像描述

    所以FilterRange.SpecialCells(xlCellTypeVisible).Rows.Count只会给你第一个区域的行数。所以你必须遍历这些区域For Each iArea In FilterRange.SpecialCells(xlCellTypeVisible).Areas并总结.Rows.Count它们以获得它们的总数。

    删除后的最终结果:
    在此处输入图像描述


Option Explicit

Sub FilterAndDelete()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    Dim FilterRange As Range
    Set FilterRange = ws.Range(ws.Range("B4"), ws.Range("B4").SpecialCells(xlCellTypeLastCell))

    FilterRange.AutoFilter Field:=8, Criteria1:=Array("A", "B", "C"), Operator:=xlFilterValues

    Dim RowCount As Long

    Dim iArea As Range
    For Each iArea In FilterRange.SpecialCells(xlCellTypeVisible).Areas
        RowCount = RowCount + iArea.Rows.Count
    Next iArea

    ws.Range("N2").Value = RowCount - 1 'subtract header

    'delete rows but keep header
    Dim RowsToDelete As Range
    On Error Resume Next 'next line throws error if filter is empty. Hide it.
    Set RowsToDelete = FilterRange.Resize(RowSize:=FilterRange.Rows.Count - 1).Offset(RowOffset:=1).SpecialCells(xlCellTypeVisible)
            'This Part FilterRange.Resize(RowSize:=FilterRange.Rows.Count - 1).Offset(RowOffset:=1) excludes the header from the FilterRange (we don't want to delete that).
    On Error GoTo 0 'always re-activate error reporting!
    If Not RowsToDelete Is Nothing Then
        RowsToDelete.EntireRow.Delete
    End If
    FilterRange.AutoFilter
End Sub

推荐阅读