VBA为什么Application.Countifreturn一个数组还是报错424

VBA Why does Application.Countif return an array or error 424

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

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

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

我目前正在一个工作表上进行测试,该工作表的单元格中包含简短的姓名列表 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

谁能指出我做错了什么?

试试这个:

  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" 定义为范围,而不是变体。

2) 使用 "set" 关键字将范围分配给 Myrange

3) 给它你想要的范围:"a1:a20",而不仅仅是 "a1"

你有几个问题。

使用 CountIf

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

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

从范围创建数组

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

  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 因为它在为数组分配范围时不起作用。假设您使用的是活动 sheet,并且当前区域用于 Range("x") 语句中指示的单元格。

计算数组中的值

第三,一旦你创建数组成功,你将无法使用Countif(如上所述)。您需要创建一种方法来计算数组中的该值。这样做有几个注意事项。

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

    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)

使用数组查找计数的代码

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

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 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

只是因为这匹马还没有被击败过..这是一个 1 班轮

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