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数组值的问题。
-
你是正确的,通过给variables指定一个范围来build立一个数组,你需要一个变体,但是你忘记了括号,这是表示一个数组的一个重要部分。
所以,而不是
Dim Myrange As Variant
您应该使用Dim Myrange () As Variant
-
在将
MyRange
build立为数组之后,您现在可以通过说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一个在数组内计算该值的方法。 这样做有几个考虑因素。
-
由于从一个范围创build的数组将是二维的,并且可能有多个列,所以不应该只假设一列。 您将需要创build一个包含行数和列数的variables,以便循环遍历整个数组。 像这样的东西:
Dim Row As Long Dim Col As Long
-
您将需要使用
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