2016-12-28 5 views
2

Я хочу создать функцию или подпункт, который принимает любое количество булевых условий и добавляет их в оператор IF. Код я представить себе выглядит следующим образом:VBA ParamArray «условия», которые будут использоваться в заявлении IF

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

где список() будет как выражения, как:

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 

Избегайте непосредственно глядя на этот код я написал чтобы не обжечь глаза.

Это что-то вроде этого, или я должен получить леденец?

Возможно, я смотрю на это не так, и есть более простой способ сделать что-то подобное или даже лучше.

ответ

1

Python (и некоторых других языков) имеет полезные функции all() и any(), которые принимают в качестве входных данных на массив (или какой-либо другой итерабельный) Booleans и возвращает либо True, либо False в зависимости от того, являются ли или нет, все или ни одно из пройденных логических значений True. Вы можете написать 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 печати.

1
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 
Смежные вопросы