VBA为什么Application.Countif返回一个数组或错误424

我想计算数组中匹配项的数量。 我尝试使用Application.Countif

MyCount = Application.WorksheetFunction.CountIf(Myrange, val) 

但是这会返回一个充满错误而不是简单计数的数组。 我也尝试使用Application.WorksheetFunction.Countif但这会导致424 error

我目前正在工作表上testing单元格A1:A20名单的短名单,但最终我打算使用这个代码与一个非常大的CSV文件,我想加载信息到数组之前使用CountIf(而不是范围)。

 Sub TestCount() Dim MyCount Dim Myrange As Variant Dim val As String val = "Addison" Myrange = ActiveSheet.Range("A1").CurrentRegion.Value MyCount = Application.WorksheetFunction.CountIf(Myrange, val) MsgBox (MyCount) End Sub 

任何人都可以build议我做错了什么?

你有几个问题。

使用CountIf

首先,如果我理解正确的话,你就试图在数组上使用Application.WorksheetFunction.CountIf语句。 这只会造成麻烦,因为CountIf (如语句所示)是“工作表函数”而不是“VBA数组函数”。

同上创build了一个使用CountIf正确的解决scheme,通过在CountIf语句执行其工作的工作表中设置一个范围。 如果你想要的只是一个数值范围内的值,那就是要走的路。

从一个范围创build一个数组

其次,如果您确实需要将项目从工作表中移出并放入数组中(例如,如果您打算以不想影响工作表的方式处理这些值),则应该知道您只有部分解决了从范围select中创build数组值的问题。

  1. 你是正确的,通过给variables指定一个范围来build立一个数组,你需要一个变体,但是你忘记了括号,这是表示一个数组的一个重要部分。

    所以,而不是Dim Myrange As Variant您应该使用Dim Myrange () As Variant

  2. 在将MyRangebuild立为数组之后,您现在可以通过说MyRange = Range("x")来分配数组值,其中x是被捕获的区域。 你不需要(或者想)使用.Value这个。 VBA会自动为你做。

    所以,在你的情况下,你想要使用Range("A1")CurrentRegion Range("A1") ,就像这样: MyRange = Range("A1").CurrentRegion 。 你也可以使用这样一个精确定义的范围: MyRange = Range("A1:A12")MyRange = Range("C7:F14")

    注意:我离开了ActiveSheet因为在向数组分配范围时它不起作用。 假定您正在使用活动工作表,并且当前区域用于Range("x")语句中指定的单元格。

计数数组中的值

第三,一旦你成功创build了一个数组,你将无法使用Countif (如上所述)。 您需要创build一个在数组内计算该值的方法。 这样做有几个考虑因素。

  1. 由于从一个范围创build的数组将是二维的,并且可能有多个列,所以不应该只假设一列。 您将需要创build一个包含行数和列数的variables,以便循环遍历整个数组。 像这样的东西:

    Dim Row As Long Dim Col As Long

  2. 您将需要使用UBound数组维度来定义循环的限制。 像这样的东西:

    Dim RowNumber As Integer RowNumber = UBound(MyRange, 1) Dim ColNumber As Integer ColNumber = UBound(MyRange, 2)

使用数组来查找计数的代码

我认为下面的代码将使用您尝试的方式创build的数组:

 Sub TestCount() Dim MyCount As Long MyCount = 0 Dim MyRange() As Variant MyRange = Range("A1").CurrentRegion Dim val As String val = "Addison" Dim Row As Long Dim Col As Long Dim RowNumber As Long RowNumber = UBound(MyRange, 1) Dim ColNumber As Long ColNumber = UBound(MyRange, 2) For Col = 1 To ColNumber For Row = 1 To RowNumber If MyRange(Row, Col) = val Then MyCount = MyCount + 1 Next Row Next Col msgbox MyCount End Sub 

只是因为这匹马还没有被击败就已经足够了

 Sub Button3_Click() MsgBox Application.WorksheetFunction.CountIf(Range("A1:a20"), "Addison") End Sub 

尝试这个:

  Sub TestCount() Dim MyCount Dim Myrange As Range Dim val As String val = "Addison" Set Myrange = ActiveSheet.Range("A1:a20") MyCount = Application.WorksheetFunction.CountIf(Myrange, val) MsgBox (MyCount) End Sub 

1)将“Myrange”定义为RANGE,而不是变体。

2)使用“设置”关键字将范围分配给Myrange

3)给它你想要的范围:“a1:a20”,不只是“a1”

是的,你没有把范围声明为范围types,所以你没有设置范围。

 Sub Macro1() Dim val as String Dim r As Range Set r = Range("a1:a20") val = "Addison" MsgBox Application.WorksheetFunction.CountIf(r, val) End Sub 

要么

 Sub CritSrh_Column() Dim cell As Variant Dim counter As Integer For Each cell In Range("A1:A20") 'could use ("A:A") to search the whole column #not recommended# 'for dynamic rows, use end.xl('direction') If cell.Value = "Addison" Then counter = counter + 1 End If Next MsgBox counter End Sub