要在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