web-dev-qa-db-ja.com

「IN」演算子の模倣

どうすれば達成できますか:

if X in (1,2,3) then

の代わりに:

if x=1 or x=2 or x=3 then

言い換えれば、VBAのIN演算子をExcelで最もよく模倣するにはどうすればよいですか?

25
Allan Bowe

とてもエレガントな解決策はないと思います。

しかし、あなたは試すことができます:

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
15
Kredns

[〜#〜] 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
13
Robert Mearns

最速の方法:

これが、他の回答の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_ "。

4
ashleedawg

試しましたか

eval("3 in(1,2,3,4,5)")
1
THEn

私が知っていることはありません。

私は通常 http://www.freevbcode.com/ShowCode.asp?ID=1675 にあるような自家製のInArray()関数を使用します

データ型に適している場合は、連結する代わりに配列を反復処理するバージョンを作成することもできます。

1
anschauung