要在IF语句中使用的VBA参数阵列“条件”

问题描述:

我想设计一个Function或Sub,它接受任意数量的布尔条件并将它们添加到IF语句中。我想象中的代码是这样的:要在IF语句中使用的VBA参数阵列“条件”

Function comp (ParamArray list() As Variant) 
    If (list(0) = True) And (list(1) = true) ..... (list(last) = true) then 
'random code 
    End If 
End Function 

其中的list()会像expresions:

x = y-1,somethingToCompare <> anotherThing, etc... 

这将是有趣的,如果我可以添加“和”为另一种说法,要改变到“或”,如果我想。

Function comp (VyVal compare as Boolean, ParamArray list() As Variant) 

dim comparison as String??? 

    If compare then 
    comparison = "and" 
    else 
    comparison = "or" 
    end if 

    If (list(0) = True) comparison (list(1) = true) ..... (list(last) = true) then 

    'random code 

    End If 
End Function 

最终的想法是使用像这样的功能:

Sub code() 

if comp(True, condition1, condition2, ...) then 
'random code' 

End Sub 

避免直接看代码我写,以免烧伤你的眼睛。

是这样posible还是应该我得到一个棒棒糖?

也许我是以错误的方式来看待这个问题,并且有一种更简单的方法可以做类似甚至更好的事情。

的Python(和一些其他语言)具有实用功能all()any()其作为输入数组(或其他一些可迭代的),并根据是否有一些,全部或者没有通过的布尔值为真来返回True或False。你可以写的这些VBA版本(使用Some()代替Any()因为Any恰好是在VBA一个有点模糊关键字):

Function All(ParamArray conditions()) As Boolean 
    Dim i As Long 
    For i = LBound(conditions) To UBound(conditions) 
     If Not conditions(i) Then 
      All = False 
      Exit Function 
     End If 
    Next i 
    All = True 
End Function 

Function Some(ParamArray conditions()) As Boolean 
    Dim i As Long 
    For i = LBound(conditions) To UBound(conditions) 
     If conditions(i) Then 
      Some = True 
      Exit Function 
     End If 
    Next i 
    Some = False 
End Function 

你可以直接使用这些功能来有条件地代码。

可以说,它可能是更有效改变上述定义到:

Function All(conditions As Variant) As Boolean 
    Dim i As Long 
    For i = LBound(conditions) To UBound(conditions) 
     If Not conditions(i) Then 
      All = False 
      Exit Function 
     End If 
    Next i 
    All = True 
End Function 

Function Some(conditions As Variant) As Boolean 
    Dim i As Long 
    For i = LBound(conditions) To UBound(conditions) 
     If conditions(i) Then 
      Some = True 
      Exit Function 
     End If 
    Next i 
    Some = False 
End Function 

现在你需要,如果你有条件的文字列表中使用电话一样Some(Array(c1, c2, c3))而非Some(c1,c2,c3),但你将有灵活地通过一系列的条件。使用这个第二个定义,你可以写类似下面的(这回答了你原来的问题):然后,例如,正在打印

Sub Sometimes(when As String, ParamArray conditions()) 
    Dim run As Boolean 
    Dim cond As Variant 

    cond = conditions 
    run = IIf(when = "All", All(cond), Some(cond)) 
    If run Then 
     Debug.Print "Running random code" 
    Else 
     Debug.Print "Not running random code" 
    End If   
End Sub 

Sometimes "Some",True,True,False结果Running random code

sub pointless(byval IsAnd as boolean, paramarray conditions()) 
    dim i as long 

    for i=lbound(conditions) to ubound(conditions) 
    if IsAnd then 
     if not conditions(i) then exit sub 
    else 
     if conditions(i) then exit for 
    end if 
    next 

    'random code 
end sub 

但你应该明白,程序将收到结果传递给它的比较,而不是比较自己的。因此,有没有一点真正摆在首位,以有这样的过程中,你可以直接写在代码:

if x = y-1 and somethingToCompare <> anotherThing then 
    'random code 
end if