如果我想在函数中使用countifs,有时它只需要2个critera,有时候需要3个
我最好的方法是在不使用2个功能的情况下实现这一目标,适用于2个和3个标准。
Function Check(sh as worksheet, col1 as range, crit1 as range,col2 as range, crit2 as range,col3 as range, crit3 as range)
If Application.CountIfs(col1,crit1,col2,crit2,col3,crit3) > 1 Then
'true
End If
End Function
这只是一个说明问题的样本
答案 0 :(得分:0)
Function Check(sh as worksheet, col1 as range, crit1 as range, _
col2 as range, crit2 as range, _
Optional col3 as range, Optional crit3 as range)
Dim n
If IsMissing(col3) Then
n = Application.CountIfs(col1,crit1,col2,crit2)
else
n = Application.CountIfs(col1,crit1,col2,crit2,col3,crit3)
end if
If n > 1 Then
'true
End If
End Function
或类似于@ JohnColeman的方法:
Public Function Check(sh As Worksheet, ParamArray args())
Dim rv, f, n, num
f = "COUNTIFS("
For n = 0 To UBound(args) Step 2
f = f & IIf(n > 0, ",", "") & args(n).Address(False, False) & ","
Select Case TypeName(args(n + 1))
Case "Range": f = f & args(n + 1).Address(False, False)
Case "Integer", "Long", "Double": f = f & args(n + 1)
Case "String": f = f & """" & args(n + 1) & """"
End Select
Next n
num = args(0).Parent.Evaluate(f & ")")
If num > 1 Then
'etc etc
End If
End Function
答案 1 :(得分:0)
你可以咬紧牙关,使cpan App::Sqitch DBD::Pg
程序员更友好,并允许程序员传入一个数组,而不是明确地输入参数。然后,您可以在Application.WorkSheetFunction.CountIfs
函数中使用此版本。以下代码(大部分)由另一个VBA sub编写,我不包括:
Check
一个示例,说明如何使用它:
Function VBA_CountIfs(args As Variant) As Double
Dim n As Long
n = UBound(args) 'assumed to be 0-based
With Application.WorksheetFunction
Select Case n:
Case 1:
VBA_CountIfs = .CountIfs(args(0), args(1))
Case 3:
VBA_CountIfs = .CountIfs(args(0), args(1), args(2), args(3))
Case 5:
VBA_CountIfs = .CountIfs(args(0), args(1), args(2), args(3), args(4), args(5))
Case 7:
VBA_CountIfs = .CountIfs(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7))
Case 9:
VBA_CountIfs = .CountIfs(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9))
Case 11:
VBA_CountIfs = .CountIfs(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11))
Case 13:
VBA_CountIfs = .CountIfs(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13))
Case 15:
VBA_CountIfs = .CountIfs(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15))
Case 17:
VBA_CountIfs = .CountIfs(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16), args(17))
Case 19:
VBA_CountIfs = .CountIfs(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16), args(17), args(18), args(19))
Case 21:
VBA_CountIfs = .CountIfs(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16), args(17), args(18), args(19), args(20), args(21))
Case 23:
VBA_CountIfs = .CountIfs(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16), args(17), args(18), args(19), args(20), args(21), args(22), args(23))
Case 25:
VBA_CountIfs = .CountIfs(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16), args(17), args(18), args(19), args(20), args(21), args(22), args(23), args(24), args(25))
Case 27:
VBA_CountIfs = .CountIfs(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16), args(17), args(18), args(19), args(20), args(21), args(22), args(23), args(24), args(25), args(26), args(27))
Case 29:
VBA_CountIfs = .CountIfs(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16), args(17), args(18), args(19), args(20), args(21), args(22), args(23), args(24), args(25), args(26), args(27), args(28), args(29))
Case Else:
VBA_CountIfs = -1 'error flag
End Select
End With
End Function
(返回我的测试表的正确结果)。如果您找到一个很好的字符串表示范围,您可以使用Sub test()
Debug.Print VBA_CountIfs(Array(Range("A1:A5"), Range("B1"), Range("C1:C5"), Range("D1")))
End Sub
函数创建VBA_CountIfs
的输入。
这种想法的一种变体是将Split
的输入声明为VBA_CountIfs
答案 2 :(得分:0)
我不清楚为什么当COUNTIFS直接接受可变数量的参数时,基于COUNTIFS function的UDF需要一个参数不确定的参数,而且我确信它是全部的一部分总体规划。
{{1}}
¹ COUNTIFS
中最多允许127个范围/标准对