如何在Excel VBA中过滤后获取可见行数

时间:2016-10-24 06:17:40

标签: excel vba excel-vba

在我的Excel工作表中,我正在应用一个过滤器,然后我计算可见行。 我使用了以下代码,但我得到了错误的计数。当我xlCellTypeVisible时,它显示“12”记录而不是“14”记录,visibleTotal变量显示“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

3 个答案:

答案 0 :(得分:1)

也许您可以使用SUBTOTAL功能。当您有过滤值时,经常使用此功能。您可以将代码调整为:

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

SUBTOTAL参数列表:

var canvas=new fabric.Canvas('canv');

var iTextSample = new fabric.IText('BOX', {
  left: -200,
  top: 20,
  fontFamily: 'Helvetica',
  fill: '#333',
  lineHeight: 1.1,
  styles: {
    0: {
      0: { textBackgroundColor: 'rgba(0,0,255,0.3)' , fontSize: 420 },
      1: { textBackgroundColor: 'rgba(0,255,0,0.3)', fontSize: 420  },
      2: { textBackgroundColor: 'rgba(255,0,0,0.3)', fontSize: 420  }

    }
  }
});
canvas.add(iTextSample);

有关此功能的更多信息,您可以查看链接。

HTH;)

答案 1 :(得分:1)

你的叙述是关于“计算可见行数”,而你的代码显示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

答案 2 :(得分:0)

我不知道,你不想使用Count函数吗?很难说,但这种行为对我来说似乎是正确的。当我们没有数据时,很难说。尝试在工作表中对可见单元格应用sum函数,并检查它返回的内容,如果它与宏相同。