CountIf的Excel问题仅限于可见的单元格

我有一个与VBA脚本的问题。 我正在尝试使用CountIf函数进行筛选

 Sub test31() Debug.Print "Sum Visible Cells only: " & Application.WorksheetFunction.Sum(Sheets("Sheet1").Range("A2:A645").SpecialCells(xlCellTypeVisible)) If Application.WorksheetFunction.CountIf(Sheets("Sheet1").Range("A2:A645").SpecialCells(xlCellTypeVisible), 1) > 0 Then Debug.Print "Ok" End If End Sub 

问题:当我在filter中标记(例如,请参阅附加图像)第一,第三,第四,第五等(但是如果我取消了这个范围之间的一些数字我得到错误“无法获得工作表functioncountif属性类“(但是当我标记一切或标记第一2或3等(没有像在图像中的不标记)错误不会出现)

文件

COUNTIF似乎不喜欢非连续的块,当你得到列表时,会发生filter和行消失。 但是,我的意思是滴答2表示可见范围是A1: A2A10:A645

你需要考虑使用另一个function。

COUNTA会计算非空白。 所以我们要求它在可见范围内计算非空白的数量。 请注意,我们创build一个范围对象,因为它使代码更易于阅读和稍后参数化。

新代码

 Sub test31() Dim rng As Range Set rng = ThisWorkbook.Sheets("Sheet1").Range("A2:A645") Debug.Print "Sum Visible Cells only: " & Application.WorksheetFunction.Sum(rng.SpecialCells(xlCellTypeVisible)) ' to see non contiguous uncomment this next line ' rng.SpecialCells(xlCellTypeVisible).Select If Excel.WorksheetFunction.CountA(rng.SpecialCells(xlCellTypeVisible)) > 0 Then Debug.Print "Ok" Debug.Print "number visible: " & Excel.WorksheetFunction.CountA(rng.SpecialCells(xlCellTypeVisible)) End If End Sub 

OUTPUT

testing所有的filter

 Sum Visible Cells only: 3337 Ok number visible: 643 

testing2未选中

 Sum Visible Cells only: 3323 Ok number visible: 636 

我不知道你想要的输出,但希望这有助于。

诱惑第二次尝试回答你的问题。

首先,您在表单中使用vba中的工作表函数countif

  worksheetfunction.countif( rng , 1 ) 

rng则要求是单一的范围。

接下来你使用方法Sheets("Sheet1").Range("A2:A645").SpecialCells(xlCellTypeVisible)具体为SpecialCells ,它返回一个范围,但范围不是一个单一的continguous块。 相反,如果您通过代码进行debugging,并在此范围内进行观察,则可以看到属性Areas实际上具有2的计数。

 Set rng = Sheets("Sheet1").Range("b2:b645").SpecialCells(xlCellTypeVisible) Set areaCount = rng.Areas.Count 

所以问题不在于你的CountIf方法,而是你传递给CountIf的范围是由不同的范围组成的,即它是错误的types。

因此,在这种情况下,CountIf可能无法为您工作。 你需要使用的是一个工作表函数,它允许使用过滤的数据集。

因此,取得范围列表的函数Subtotal似乎是一个更适合您的需要的WorksheetFunction。 现在你需要为第一个参数select一个合适的Aggregate方法,这个方法对于你来说是2或者3.只计算数字:2或者不计数空白单元格:3。

有用的聚合函数提供了一个你可以使用的聚合列表。

您现在也可以使用聚合函数或小计函数来合计可见范围,使用聚合函数Sum:9。

把所有这一切放在这里是一个build议你的代码片段..

 Sub test31() Dim rngToUse As Range Dim visibleSum As Long Dim countOfVisible As Long Set rngToUse = Sheets("Sheet1").Range("b2:b645") visibleSum = WorksheetFunction.Subtotal(9, rngToUse) countOfVisible = WorksheetFunction.Subtotal(3, rngToUse) Debug.Print "Sum Visible Cells only: " & visibleSum Debug.Print "Count of Visible Cells : " & countOfVisible If countOfVisible > 0 Then Debug.Print "Ok" End If End Sub 

我希望这是一个更有用的信息。

问候Gareth