如何在Excel VBA中筛选后可见的行数

在我的Excel工作表中,我正在应用一个filter,之后,我正在计数可见的行。 我用下面的代码,但我得到一个错误的计数。 当我有xlCellTypeVisible它显示“12”logging而不是“14”logging和visibleTotalvariables显示“0”计数。

 Dim ws As Worksheet Dim rng As Range Dim visibleTotal As Long 'xlwkbOutput.Sheets("Sheet1") Set rng = xlwkbOutput.Sheets("Sheet1").Range("A1:T" & lastRow&) xlwkbOutput.Sheets("Sheet1").AutoFilterMode = False rng.AutoFilter field:=1, Criteria1:="#N/A" visibleTotal = Application.WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeVisible)) ' print to the immediate window Debug.Print visibleTotal 

你的叙述是关于“计数可见的行”,而你的代码显示一个SUM()函数

无论如何,这里是如何得到两个数字,请记住, Autofilter()将始终过滤标题行,即它被调用的范围的第一行

 Option Explicit Sub main() Dim visibleTotal As Long, visibleRows As Long With xlwkbOutput.Sheets("Sheet1") '<-- reference your worksheet .AutoFilterMode = False With .Range("A1:T5") '<-- reference its relevant range .AutoFilter field:=1, Criteria1:="#N/A" '<-- apply filter: first row (headers) will always be selected visibleRows = Application.WorksheetFunction.Subtotal(103, .Resize(, 1)) - 1 '<-- count visible rows, excluding headers (always filtered) If visibleRows > 0 Then visibleTotal = Application.WorksheetFunction.Sum(.Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)) '<-- sum all visible cells, excluding headers (always filtered) ' print to the immediate window Debug.Print visibleTotal End With .AutoFilterMode = False End With End Sub 

也许你可以使用SUBTOTALfunction。 这个函数在过滤值时经常使用。 您可以调整您的代码:

 ' To SUM filtered rows use 9 as argument of SUBTOTAL or to COUNTA use 3 ' "- 1" is to exclude the first row, probably the header of your range; otherwise remove it visibleTotal = Application.WorksheetFunction.Subtotal(9, rng) - 1 

SUBTOTAL参数列表:

 1 AVERAGE 2 COUNT 3 COUNTA 4 MAX 5 MIN 6 PRODUCT 7 STDEV 8 STDEVP 9 SUM 10 VAR 11 VARP 

有关此function的更多信息,您可以检查链接。

HTH;)

我不知道,你不想用Count函数吗? 这很难说,但行为似乎对我来说是正确的。 当我们没有数据时,很难说。 尝试将sum函数应用于可见单元格的工作表中,并检查它是否与macros中的相同。