サーチ…


備考

演算子は次の順序で評価されます。

  • 数学演算子
  • ビット演算子
  • 連結演算子
  • 比較演算子
  • 論理演算子

一致する優先順位を持つ演算子は、左から右に評価されます。既定の順序は、かっこ(および)を使用して式をグループ化することで上書きできます。

数学演算子

優先順位に従ってリストされます:

トークン説明
^ 累乗左辺のオペランドを右辺のオペランドに戻した結果を返します。累乗によって返される値は、分割される値の型にかかわらず常に Doubleであることに注意してください。結果の可変型への強制は、計算が実行されたに行われます。
/ ディビジョン1 左辺のオペランドを右辺のオペランドで除算した結果を返します。除算で返される値は、分割される値の型に関係なく常に Doubleです。結果の可変型への強制は、計算が実行されたに行われます。
* 乗算1 2つのオペランドの積を返します。
\ 整数部切り捨て0.5で両側を丸めた後に右側のオペランドで左オペランドを分割する整数結果を返します。除算の残りの部分は無視されます。右側のオペランド(除数)が0場合、実行時エラー11:0除算が発生します。これは丸めがすべて実行された後であることに注意してください3 \ 0.4などの式でもゼロ除算エラーが発生します。
Mod モジュロ左辺のオペランドを右辺のオペランドで除算した整数の余りを返します。各側のオペランドは除算のに整数丸められ、.5は丸められます。たとえば、 8.6 Mod 312 Mod 2.6両方が0ます。右側のオペランド(除数)が0場合、実行時エラー11:0除算が発生します。これは丸めがすべて実行された後であることに注意してください3 Mod 0.4などの式でもゼロ除算が行われます。
- 減算2 左側のオペランドから右側のオペランドを減算した結果を返します。
+ 追加2 2つのオペランドの合計を返します。このトークンは、 String適用されるときに連結演算子としても扱われることに注意してください。 連結演算子を参照してください。

1乗算と除算は同じ優先順位として扱われます。

2加算と減算は同じ優先順位として扱われます。

連結演算子

VBAは、2つの異なる連結演算子をサポート+&と一緒に使用するときの両方がまったく同じ機能を実行するStringタイプ-右String左側の最後に追加されるString

&演算子がString以外の変数型で使用されている場合、 &演算子は連結される前にStringに暗黙的にキャストされます。

+連結演算子は、 +加算演算子のオーバーロードであることに注意してください。 +の振る舞いは、オペランドの変数型と演算子型の優先度によって決まります。両方のオペランドは次のように入力された場合はStringまたはVariantのサブタイプのString 、それらが連結されています。

Public Sub Example()
    Dim left As String
    Dim right As String
    
    left = "5"
    right = "5"
    
    Debug.Print left + right    'Prints "55"
End Sub

どちらかの側が数値型であり、もう一方の側が強制的に数値に変換できるString場合、数学演算子の型優先により、演算子が加算演算子として扱われ、数値が加算されます。

Public Sub Example()
    Dim left As Variant
    Dim right As String
    
    left = 5
    right = "5"
    
    Debug.Print left + right    'Prints 10
End Sub

この振る舞いは、特にVariant型が使用されている場合には、微妙なエラーをデバッグするのが難しくなるため、通常&演算子のみを連結に使用する必要があります。

比較演算子

トークン説明
= に等しい左辺と右辺のオペランドが等しい場合はTrue返します。これは代入演算子のオーバーロードであることに注意してください。
<> 等しくない左辺と右辺のオペランドが等しくない場合はTrue返します。
> より大きい左のオペランドが右のオペランドより大きい場合はTrue返します。
< 未満左のオペランドが右のオペランドよりも小さい場合はTrue返します。
>= それ以上左辺のオペランドが右辺のオペランドより大きいか等しい場合はTrue返します。
<= 以下左辺のオペランドが右辺のオペランド以下の場合はTrue返します。
Is 参照株式左側のオブジェクト参照が右側のオブジェクト参照と同じインスタンスの場合はTrue返します。どちらの側でも、 Nothing (nullオブジェクト参照)と共に使用することができます。 注意: Is演算子は、比較を実行する前に両方のオペランドをObjectに強制変換しようとします。いずれかの側がプリミティブ型またはオブジェクトを含まないVariant (非オブジェクトサブタイプまたはvtEmptyいずれか)である場合、実行時エラー424 - "Object required"が比較されます。いずれかのオペランドが同じオブジェクトの別のインタフェースに属している場合、比較はTrueを返しTrue 。インスタンスインタフェースの両方の公平性をテストする必要がある場合は、代わりにObjPtr(left) = ObjPtr(right)使用します。

ノート

VBA構文は比較演算子の「チェーン」を考慮していますが、これらの構文は一般的には避けなければなりません。比較は、一度に2つのオペランドに対して常に左から右へと実行され、各比較の結果はBooleanます。たとえば、式は...

a = 2: b = 1: c = 0
expr = a > b > c

...は、 bac間にaかどうかのテストとして、いくつかのコンテキストで読み取ることができます。 VBAでは、これは次のように評価されます。

a = 2: b = 1: c = 0
expr = a > b > c
expr = (2 > 1) > 0
expr = True > 0
expr = -1 > 0 'CInt(True) = -1
expr = False

Objectとオペランドとして使用されるIs以外の比較演算子は、 Objectデフォルトメンバーの戻り値に対して実行されます 。オブジェクトに既定のメンバがない場合、比較によって実行時エラー438が発生します - 「オブジェクトがそのプロパティまたはメソッドをサポートしていません」

Objectが初期化されていない場合、実行時エラー91 - "オブジェクト変数またはWithブロック変数が設定されていません"が比較されます。

リテラルNothingIs以外の比較演算子で使用される場合、コンパイルエラー - 「オブジェクトの無効な使用」が発生します。

Object既定のメンバが別のObject場合、VBAはプリミティブ型が返されるか、エラーが発生するまで、連続する各戻り値の既定のメンバを継続的に呼び出します。例えば、想定SomeClassデフォルトの部材有するValueのインスタンスである、 ChildClassの既定部材とChildValue 。比較...

Set x = New SomeClass
Debug.Print x > 42

...は次のように評価されます:

Set x = New SomeClass
Debug.Print x.Value.ChildValue > 42

いずれかのオペランドが数値型で、 もう一方のオペランドがサブタイプString StringまたはVariantの場合、数値の比較が実行されます。この場合、 Stringを数値にキャストできない場合、実行時エラー13 - "型不一致"が比較結果になります。

両方のオペランドがサブタイプString StringまたはVariantの場合、コードモジュールのOption Compare設定に基づいて文字列の比較が実行されます。これらの比較は、文字単位で行われます。数値を含むString 文字表現は、数値の比較と同じではないことに注意してください。

Public Sub Example()
    Dim left As Variant
    Dim right As Variant
    
    left = "42"
    right = "5"
    Debug.Print left > right              'Prints False
    Debug.Print Val(left) > Val(right)    'Prints True
End Sub

このため、 StringまたはVariant変数が数値不等式を実行する前に数値にキャストされていることを確認してください。

一方のオペランドがDate場合、もう一方のオペランドが数値であるか、数値型にキャスト可能であれば、基礎となるDouble値の数値比較が実行されます。

他のオペランドが現在のロケールを使用してDateキャストできるStringまたはVariantのサブタイプString場合、 StringDateキャストされます。現在のロケールのDateにキャストできない場合、ランタイムエラー13 - "型の不一致"が比較の結果発生します。


DoubleまたはSingle値とブール値を比較するときは注意が必要です。他の数値型とは異なり、浮動小数点数を含む比較のデータ型をDoubleに昇格するVBAの動作により、非ゼロ値はTrueとみなすことはできません。

Public Sub Example()
    Dim Test As Double
    
    Test = 42        Debug.Print CBool(Test)             'Prints True.
    'True is promoted to Double - Test is not cast to Boolean
    Debug.Print Test = True             'Prints False
    
    'With explicit casts:
    Debug.Print CBool(Test) = True      'Prints True
    Debug.Print CDbl(-1) = CDbl(True)   'Prints True
End Sub

ビット単位の論理演算子

VBAのすべての論理演算子は、同じ名前のビット演算子の「上書き」と考えることができます。技術的には、 常にビット演算子として扱われます。 VBA内のすべての比較演算子は、常にビットを設定( False )したり、 すべてのビットを設定( True )しないブール値を返します。しかし、それはのように設定任意のビットに値を扱いますTrue 。つまり、式のビット結果をBooleanキャストした結果(比較演算子を参照)は、常に論理式として扱うことと同じになります。

これらの演算子の1つを使用して式の結果を代入すると、ビット単位の結果が得られます。以下の真理値表では、 0False相当し、 1True相当することに注意してください。


And

両辺の式がTrue評価される場合はTrue返します。

左辺オペランド右オペランド結果
0 0 0
0 1 0
1 0 0
1 1 1

Or

式のいずれかの側がTrue評価される場合はTrue返します。

左辺オペランド右オペランド結果
0 0 0
0 1 1
1 0 1
1 1 1

Not

戻り値True式がと評価された場合FalseFalse式の評価場合にTrue

右オペランド結果
0 1
1 0

左オペランドなしの唯一のオペランドはありNot 。 Visual Basic Editorは、左手の引数で式を自動的に簡略化します。あなたが入力した場合...

Debug.Print x Not y

... VBEは行を次のように変更します。

Debug.Print Not x

同様の単純化は、 Not左辺のオペランド(式を含む)を含む式に対して行われます。


Xor

「排他的OR」とも呼ばれます。両方の式が異なる結果を返す場合はTrue返します。

左辺オペランド右オペランド結果
0 0 0
0 1 1
1 0 1
1 1 0

Xor演算子は論理演算子のように使用できますが、比較演算子<>と同じ結果が得られるため、 Xor演算子は論理演算子のように使用できますが、絶対に行う必要はありません。


Eqv

「等価」とも呼ばれます。両方の式が同じ結果に評価されたときにTrue返します。

左辺オペランド右オペランド結果
0 0 1
0 1 0
1 0 0
1 1 1

x Eqv yは、はるかに読みやすいNot (x Xor y)と同等であるため、 Eqv関数はごくまれしか使用されないことに注意してください。


Imp

「含意」とも呼ばれます。返しTrue両方のオペランドが同じであるか、第二オペランドである場合はTrue

左辺オペランド右オペランド結果
0 0 1
0 1 1
1 0 0
1 1 1

Imp関数はほとんど使用されないことに注意してください。経験則としては、その意味を説明できない場合は、別の構造を使うべきです。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow