【问题标题】:Count selected rows after auto filter自动过滤后计算所选行数
【发布时间】:2020-07-13 15:12:10
【问题描述】:

当我的数据是原始数据且未经过滤时,我可以选择它们,Selection.Rows.Count 返回有效数字。

在自动筛选之后它返回一个数字,就好像我选择了不可见的行一样,即使Selection.Copy 不会复制所选行以外的行。

如何获取所选行的有效计数?

我试过Selection.SpecialCells(xlCellTypeVisible).Rows.Count

编辑

我在另一个宏中使用过滤器,然后手动选择要添加到另一个工作表的行。

我做了两个按钮,一个用于过滤我的表格,第二个用于将选定的行移动到另一个工作表。

Sub ajout_commande()
Set DataSheet = ThisWorkbook.Worksheets("Prepa Commandes")
Dim a As Range, b As Range
Set a = Selection
i = 0
s = Selection.SpecialCells(xlCellTypeVisible).Count
For Each b In a.Rows
    i = i + 1
    DataSheet.Cells(6, 1).EntireRow.Insert
    DataSheet.Range("A1:Z1").Copy DataSheet.Cells(6, 1).EntireRow
Next

Dim r1 As Range, r2 As Range, r3 As Range
Let copyrange1 = "E1" & ":" & "I" & i
Let copyrange2 = "BK1" & ":" & "BM" & i
Set r1 = a.Range(copyrange1)
Set r2 = a.Range(copyrange2)
Set r3 = Union(r1, r2)

r3.Copy
DataSheet.Cells(6, 1).PasteSpecial xlPasteValues
MsgBox s & " and " & i

End Sub

这里我的表格被过滤了,我想将选定的行添加到另一个工作表中,但 Selection.Rows.Count 返回的行数比我选择的行数多,因为它计算了不可见的行数,即使 Selection.copy 有效。
@ 987654321@

对于此示例,Selection.Rows.Count = 28,因为第 10 行和第 20 行、第 21 行和第 25 行等之间的行不可见。

有没有获得我想要的数字的功能(在这张图片上 16)?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    这取决于您如何使用它。这对我来说很好用

    '~~> Remove any filters
    ActiveSheet.AutoFilterMode = False
    
    '~~> Specifying the complete address is the key part
    With Range("A1:C6") '<~~ Filter, offset(to exclude headers)
        .AutoFilter Field:=YOURFIELDNUMBER, Criteria1:=YOURCRITERIA
        Debug.Print .Offset(1, 0).SpecialCells(xlCellTypeVisible).Rows.Count
    End With
    
    '~~> Remove any filters
    ActiveSheet.AutoFilterMode = False
    

    测试

    Sub Sample()
        '~~> Remove any filters
        ActiveSheet.AutoFilterMode = False
    
        With Range("A1:C6") '<~~ Filter, offset(to exclude headers)
            .AutoFilter Field:=1, Criteria1:="Sid"
            MsgBox .Offset(1, 0).SpecialCells(xlCellTypeVisible).Rows.Count
        End With
    
        '~~> Remove any filters
        ActiveSheet.AutoFilterMode = False
    End Sub
    

    【讨论】:

    • 感谢您的回答,是的,我不清楚我如何使用它。问题是我有一个按钮来过滤我的表格,然后我想选择一些行并单击一个按钮将这些行复制到另一张只有特定列的工作表并稍微修改它们我不想过滤和计算同一 vba 宏中的选定行。我将在我的帖子中添加更多描述
    【解决方案2】:

    好吧,如果您的选择是连续的,以下方法会起作用:

    Selection.Columns(1).SpecialCells(xlCellTypeVisible).Count
    

    但是,从您的屏幕截图中,我可以看到您的选择可能是不连续的范围(也就是选择了多个区域),因此您可以使用我创建的这个函数作为起点:

    Function countVisibleSelectedRows()
        Dim count As Integer
        count = 0
        For Each Area In Selection.Areas
            count = count + Area.Columns(1).SpecialCells(xlCellTypeVisible).count
        Next
        countVisibleSelectedRows = count
    End Function
    

    当您选择了多个范围时,Excel 将每个范围称为“区域”。在这个函数中,我们遍历 Selection.Areas 集合中的每个“区域”。

    【讨论】:

    • 当我打印这个数字时,它会在 excel 上为 1 个选定的行打印 16331。我认为这代表我的行中的单元格数,当我选择 2 行时,它会打印 32662。
    • 哦,我现在明白你要做什么了。我已经编辑了我的评论,以使这项工作如你所愿。
    【解决方案3】:

    我知道这是针对这个问题的较晚帖子,但也许这会对将来的某人有所帮助。我发现以下代码 sn-p 可以很好地计算过滤后范围内的可见行数。

    Sub CountVisibleRows()
    'only count the visible rows in the range
    
    Dim lRow As Long, vis_lr As Long, DstWs As Worksheet
    
    Set DstWs = ActiveSheet
    
    lRow = DstWs.UsedRange.Rows.Count
    'vis_lr = DstWs.Range("B2:B" & lRow).SpecialCells(xlCellTypeVisible).Count   'doesn't seem to work with non-contiguous rows
    
    With DstWs
    vis_lr = Application.WorksheetFunction.Subtotal(3, Range("B2:B" & lRow))
    End With
    
    Debug.Print vis_lr
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多