どうすれば達成できますか:
if X in (1,2,3) then
の代わりに:
if x=1 or x=2 or x=3 then
言い換えれば、VBAのIN
演算子をExcelで最もよく模倣するにはどうすればよいですか?
とてもエレガントな解決策はないと思います。
しかし、あなたは試すことができます:
If Not IsError(Application.Match(x, Array("Me", "You", "Dog", "Boo"), False)) Then
または、独自の関数を記述できます。
Function ISIN(x, StringSetElementsAsArray)
ISIN = InStr(1, Join(StringSetElementsAsArray, Chr(0)), _
x, vbTextCompare) > 0
End Function
Sub testIt()
Dim x As String
x = "Dog"
MsgBox ISIN(x, Array("Me", "You", "Dog", "Boo"))
End Sub
[〜#〜] if [〜#〜]の代わりに[〜#〜] case [〜#〜]ステートメントを試すこともできます
Select Case X
Case 1 To 3
' Code to do something
Case 4, 5, 6
' Code to do something
Case 7
' Code to do something
Case Else
' More code or do nothing
End Select
これが、他の回答のanyよりも方法はるかに高速でコンパクトであり、-数値またはテキスト値:
_Function IsIn(valCheck, valList As String) As Boolean
IsIn = Not InStr("," & valList & ",", "," & valCheck & ",") = 0
End Function
_
数値とともにIsIn
を使用:
_Sub demo_Number()
Const x = 2
If IsIn(x, "1,2,3") Then
Debug.Print "Value " & x & " was Found!"
Else
Debug.Print "Value " & x & " was not Found."
End If
End Sub
_
IsIn
と文字列値を使用:
_Sub demo_Text()
Const x = "Dog"
If IsIn(x, "Me,You,Dog,Boo") Then
Debug.Print "Value " & x & " was Found!"
Else
Debug.Print "Value " & x & " was not Found."
End If
End Sub
_
速度を比較するために、受け入れられた回答からテストを100,000回実行しました。
0.406 sec (FASTEST)
この関数( InStr を使用):1.828 sec (450% slower)
許可 Answer "ISIN"関数を使用1.799 sec (440% slower)
Answer freeVBcodeの「IsInArray」0.838 sec (206% slower)
Answer 変更された "IsInArray"関数を使用OPの目標はおそらくタスクを簡略化して短縮することだったため、_SELECT..CASE
_を使用するはるかに長い answer を含めませんでした。 _if x=1 or x=2 or x=3 then
_ "。
試しましたか
eval("3 in(1,2,3,4,5)")
私が知っていることはありません。
私は通常 http://www.freevbcode.com/ShowCode.asp?ID=1675 にあるような自家製のInArray()関数を使用します
データ型に適している場合は、連結する代わりに配列を反復処理するバージョンを作成することもできます。