arrays - VBA 为什么Application.Countif返回数组或错误424

标签 arrays vba excel countif

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

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

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

我目前正在一个工作表上进行测试,该工作表在单元格 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

有人可以建议我做错了什么吗?

最佳答案

您有几个问题。

使用 CountIf

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

Ditto 创建了一个正确使用 CountIf 的解决方案,方法是在工作表中设置一个范围,CountIf 语句将在该范围内执行其工作。如果您想要的只是一种计算该范围内的值的方法,那就是正确的方法。

从范围创建数组

其次,如果您确实需要将项目从工作表中取出并放入数组中(例如,如果您打算以不希望影响工作表的方式使用这些值),您应该知道您仅部分解决了从范围选择创建值数组的问题。

  1. 您是正确的,要通过为变量分配范围来建立数组,您需要一个变体,但您忘记了括号,这是表示数组的重要组成部分。

    因此,您应该使用 Dim Myrange () As Variant

  2. ,而不是 Dim Myrange As Variant
  3. MyRange 创建为数组后,您现在可以通过 MyRange = Range("x") 来分配数组值,其中 x 是区域被捕获。您不需要(或不想)为此使用 .Value 。 VBA 会自动为您完成此操作。

    因此,在您的情况下,您希望将 CurrentRegion 用于 Range("A1"),如下所示:MyRange = Range("A1").CurrentRegion.您还可以使用严格定义的范围,如下所示:MyRange = Range("A1:A12")MyRange = Range("C7:F14")

    注意:我放弃了ActiveSheet,因为它在将范围分配给数组时不起作用。假设您正在使用事件工作表,并且当前区域适用于 Range("x") 语句中指示的单元格。

计算数组中的值

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

  1. 由于从范围创建的数组是二维的,并且可能具有多个列,因此您不应假设只有一列。您将需要创建一个保存行数和列数的变量,以便可以循环整个数组。像这样的事情:

    暗行只要 Dim Col As Long

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

    将 RowNumber 变暗为整数 行号 = UBound(MyRange, 1) Dim ColNumber 作为整数 ColNumber = UBound(MyRange, 2)

使用数组查找计数的代码

我认为以下代码将使用以您尝试的方式创建的数组来完成您想要的操作:

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

关于arrays - VBA 为什么Application.Countif返回数组或错误424,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28507501/

相关文章:

Java :How Generic Erasure Works

php - 在codeigniter中将excel数据导入数据库

vba - 将两个数组或矩阵逐个元素相加

java - 有没有半标签的方法?

java - 通过更改替换数组的元素

c - 通过 C 中的用户定义函数打印随机二维数组

arrays - Visual Basic 数组 case 语句

vb.net - 在 VB.net 中创建 VBA 类

vba - HTML 到 Excel 格式转换 - Break 和 li 在同一单元格中

excel - 获取 Pandas 中具有特定值的单元格的行和列