Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 自动筛选后对所选行进行计数_Vba_Excel - Fatal编程技术网

Vba 自动筛选后对所选行进行计数

Vba 自动筛选后对所选行进行计数,vba,excel,Vba,Excel,当我的数据是未经过滤的原始数据时,我可以选择它们,然后Selection.Rows.Count返回有效数字 在自动筛选之后,它返回一个数字,就好像我选择了不可见的行一样,即使Selection.Copy不复制所选行以外的行 如何获取所选行的有效计数 我尝试了Selection.SpecialCells(xlCellTypeVisible).Rows.Count 编辑 我在另一个宏中使用过滤器,然后手动选择要添加到另一个工作表中的行 Sub ajout_commande() Set DataShe

当我的数据是未经过滤的原始数据时,我可以选择它们,然后
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
我做了两个按钮,一个用来过滤我的表,第二个用来将选定的行移动到另一个工作表

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
有效。

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


是否有一个函数来获取我想要的号码(在这张图16上)?

好吧,如果您的选择是连续的,那么下面的函数将起作用:

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集合中的每个“area”上循环。

好吧,如果您的选择是连续的,则以下操作将起作用:

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会将这些范围中的每一个都称为“区域”。在这个函数中,我们循环选择.Areas集合中的每个“区域”。

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

'~~> 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
“~~~>删除任何筛选器
ActiveSheet.AutoFilterMode=False
“~~>指定完整的地址是关键部分
在“A1:C6”范围内,移除所有过滤器
ActiveSheet.AutoFilterMode=False

范围(“A1:C6”)取决于您如何使用它。这对我来说很好

'~~> 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
“~~~>删除任何筛选器
ActiveSheet.AutoFilterMode=False
“~~>指定完整的地址是关键部分
在“A1:C6”范围内,移除所有过滤器
ActiveSheet.AutoFilterMode=False

关于Range(“A1:C6”)我知道这是一篇关于这个问题的后期文章,但也许这会对将来的人有所帮助。我发现下面的代码片段可以很好地计算过滤后某个范围内可见行的数量

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

我知道这是一篇关于这个问题的后期文章,但也许这会对将来的人有所帮助。我发现下面的代码片段可以很好地计算过滤后某个范围内可见行的数量

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

当我打印这个数字时,它会在excel上为1个选定行打印16331。我想这代表了当我选择2行打印32662时,我的行中的单元格数。哦,我现在明白你想做什么了。我已经编辑了我的评论,以使其按照您的意愿工作。当我打印此数字时,它会在excel上为1个选定行打印16331。我想这代表了当我选择2行打印32662时,我的行中的单元格数。哦,我现在明白你想做什么了。我已经编辑了我的评论,让它按照你想要的方式工作。谢谢你的回答,是的,我不清楚如何使用它。问题是,我有一个按钮来过滤我的表,然后我想选择一些行,然后单击一个按钮将这些行复制到另一个只有特定列的工作表中,并稍微修改它们。我不想在同一vba宏中过滤和计算所选行。我会在我的帖子中添加更多的描述谢谢你的回答,是的,我不清楚我是如何使用它的。问题是,我有一个按钮来过滤我的表,然后我想选择一些行,然后单击一个按钮将这些行复制到另一个只有特定列的工作表中,并稍微修改它们。我不想在同一vba宏中过滤和计算所选行。我将在我的帖子中添加更多描述