我想计算数组中匹配项的数量。我尝试使用 应用程序.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
语句将在该范围内执行其工作。如果您想要的只是一种计算该范围内的值的方法,那就是正确的方法。
从范围创建数组
其次,如果您确实需要将项目从工作表中取出并放入数组中(例如,如果您打算以不希望影响工作表的方式使用这些值),您应该知道您仅部分解决了从范围选择创建值数组的问题。
您是正确的,要通过为变量分配范围来建立数组,您需要一个变体,但您忘记了括号,这是表示数组的重要组成部分。
因此,您应该使用Dim Myrange () As Variant
,而不是 将
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")
语句中指示的单元格。
Dim Myrange As Variant
计算数组中的值
第三,一旦成功创建数组,您将无法使用Countif
(如上所述)。您需要创建一个方法来计算数组中的值。这样做有几个考虑因素。
由于从范围创建的数组是二维的,并且可能具有多个列,因此您不应假设只有一列。您将需要创建一个保存行数和列数的变量,以便可以循环整个数组。像这样的事情:
暗行只要 Dim Col As Long
您将需要使用数组维度的
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/