2016-12-28 13 views
2

任意の数のブール条件を受け入れてIFステートメントに追加するFunctionまたはSubを設計したいと考えています。私が想像するコードは次のようになります:IFステートメントで使用するVBA ParamArrayの "条件"

リストは()のようなexpresionsだろう
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()を持っています(またはその他の反復可能な)ブール値を返し、渡されたブール値の一部またはすべてが真であるかどうかに応じてTrueまたはFalseを返します。 (AnyはVBAで、ややあいまいなキーワードであることを起こるので、Some()代わりの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 

あなたは条件付きでコードを呼び出すためにこれらの関数を直接使用することができます。

おそらく上記の定義を変更する方が便利かもしれません:あなたが条件のリテラルのリストを持っていましたが、あなたが持っているならば今、あなたはSome(Array(c1, c2, c3))いうよりSome(c1,c2,c3)などの呼び出しを使用する必要があります

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 

条件の配列全体を渡す柔軟性。あなたは(あなたの元の質問に答えるいる)は、次のようなものを書くことができ、この2番目の定義を使用する:

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 

そして、例えば、Running random codeSometimes "Some",True,True,False結果が印刷されています。

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 
関連する問題