サーチ…
備考
演算子は次の順序で評価されます。
- 数学演算子
- ビット演算子
- 連結演算子
- 比較演算子
- 論理演算子
一致する優先順位を持つ演算子は、左から右に評価されます。既定の順序は、かっこ(
および)
を使用して式をグループ化することで上書きできます。
数学演算子
優先順位に従ってリストされます:
トークン | 名 | 説明 |
---|---|---|
^ | 累乗 | 左辺のオペランドを右辺のオペランドに戻した結果を返します。累乗によって返される値は、分割される値の型にかかわらず常に Double であることに注意してください。結果の可変型への強制は、計算が実行された後に行われます。 |
/ | ディビジョン1 | 左辺のオペランドを右辺のオペランドで除算した結果を返します。除算で返される値は、分割される値の型に関係なく常に Double です。結果の可変型への強制は、計算が実行された後に行われます。 |
* | 乗算1 | 2つのオペランドの積を返します。 |
\ | 整数部 | 切り捨て0.5で両側を丸めた後に右側のオペランドで左オペランドを分割する整数結果を返します。除算の残りの部分は無視されます。右側のオペランド(除数)が0 場合、実行時エラー11:0除算が発生します。これは丸めがすべて実行された後であることに注意してください3 \ 0.4 などの式でもゼロ除算エラーが発生します。 |
Mod | モジュロ | 左辺のオペランドを右辺のオペランドで除算した整数の余りを返します。各側のオペランドは除算の前に整数に丸められ、.5は丸められます。たとえば、 8.6 Mod 3 と12 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
...は、 b
がa
とc
間に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ブロック変数が設定されていません"が比較されます。
リテラルNothing
がIs
以外の比較演算子で使用される場合、コンパイルエラー - 「オブジェクトの無効な使用」が発生します。
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
場合、 String
はDate
キャストされます。現在のロケールの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つを使用して式の結果を代入すると、ビット単位の結果が得られます。以下の真理値表では、 0
はFalse
相当し、 1
はTrue
相当することに注意してください。
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
式がと評価された場合False
とFalse
式の評価場合に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
関数はほとんど使用されないことに注意してください。経験則としては、その意味を説明できない場合は、別の構造を使うべきです。