VBA Countifs功能 - 可变数量的标准

时间:2015-07-25 21:25:18

标签: excel vba

如果我想在函数中使用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

这只是一个说明问题的样本

3 个答案:

答案 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个范围/标准对