VBA计算自动过滤后的选定行

时间:2017-11-29 19:11:32

标签: vba excel-vba excel

我正在尝试通过编写一些vba宏来简化我的同事在Excel上的工作,但我遇到了一些使用Selection的问题。

当我的数据是原始且未经过滤的时候,我可以选择它们和

Selection.Rows.Count

返回有效号码。但是在AutoFilter处于活动状态后,它会返回一个错误的数字,就好像我选择了我的excel上看不到的行,即使

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

enter image description here

这里我的表被过滤了,我想将我选择的行添加到另一个工作表中,但是Selection.Rows.Count会返回比我选择的更多的行,因为它计算了非可见行,即使Selection.copy工作正常。

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

是否有功能可以获得我想要的号码(在此图片16上)?

感谢。

3 个答案:

答案 0 :(得分:1)

嗯,如果如果您的选择是连续的,则以下内容将起作用:

withcity

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

nocity

如果选择了多个范围,Excel会将每个范围调用为"区域"。在这个函数中,我们遍历每个"区域"在Selection.Areas集合中。

答案 1 :(得分: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

enter image description here

答案 2 :(得分:1)

我知道这是该问题的最新发布,但也许将来会对某人有所帮助。我发现以下代码段非常适合在过滤后计算范围内的可见行数。

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