更新日:、 作成日:

VBA 比較演算子や論理演算子

はじめに

Excel VBA マクロの演算子を紹介します。

比較演算子には、等しい =、等しくない <> などがあります。

論理演算子には、論理積 And、論理和 Or などがあります。

四則演算などの算術演算子には、足す +、引く - などがあります。

論理演算子と算術演算子には優先順位があります。() で囲むと最優先で評価できます。

比較演算子

If 文などの比較に使う比較演算子を紹介します。結果はすべて Boolean になります。

演算子 演算名 使用例 結果
=等しい1 = 2False
<>等しくない1 <> 2True
>大きい1 > 2False
<小さい1 < 2True
>=以上1 >= 2False
<=以下1 <= 2True

値 演算子 値 のように入力します。括弧で囲むと見やすくなります。

Dim i As Integer
Dim j As Integer

If i = j Then

End If

Dim b As Boolean
b = (1 = 1)
Debug.Print(b) ' True

b = (1 <> 1)
Debug.Print(b) ' False

複数の比較をするには論理演算子と組み合わせます。

Dim i As Integer
Dim j As Integer

If i = 1 And j = 0 Then

End If

If i = 1 Or j = 0 Then

End If

詳しくは下記の「論理演算子」をご覧ください。

Like 演算子

文字列をワイルドカードを使って比較する Like 演算子があります。正規表現を簡単にしたものです。

パターン 説明 使用例 一致例
?任意の 1 文字あい?あいう, あいか, あいも
*0 個以上の文字*ABAB, 0AB, 10AB
#任意の 1 桁 (0–9)##10, 22, 59
[charlist]charlist に含まれる任意の 1 文字[A-C]
[A, H, L]?
A, B, C
A1, H2, L3
[!charlist]charlist に含まれない任意の 1 文字[!A-C]
[!A, B, C]?
D, E, F
[パターン]パターンの文字 ? * # [ ] と比較する[*]?*あ, *い, *A

文字列 Like パターン のように入力します。

Dim b As Boolean

b = "あいうえお" Like "あい*"     ' "あい" で始まるか
Debug.Print(b) ' True

b = "あいうえお" Like "あい?"     ' "あい" で始まる 3 文字か
Debug.Print(b) ' False

b = "あいうえお" Like "あいうえ?" ' "あいうえ" で始まる 5 文字か
Debug.Print(b) ' True

b = "12" Like "##"   ' 2 桁の数字か
Debug.Print(b) ' True

b = "12" Like "###"  ' 3 桁の数字か
Debug.Print(b) ' Flase

b = "a2a" Like "?#?" ' 文字数字文字か
Debug.Print(b) ' True

b = "AZZ" Like "[A-C]*"     ' A ~ C の文字で始まるか
Debug.Print(b) ' True

b = "AZZ" Like "[!A-C]*"    ' A ~ C 以外の文字で始まるか
Debug.Print(b) ' Flase

b = "AZZ" Like "[A, D, G]*" ' A か D か G で始まるか
Debug.Print(b) ' True

b = "*あ" Like "[*]?" ' * で始まる 2 文字か
Debug.Print(b) ' True

Is 演算子

オブジェクト型の参照を比較する Is 演算子があります。

Worksheet などのオブジェクト (参照型) のクラスは = で比較できません。何も入っていないオブジェクト型の変数を比較するには Nothing を使用します。

演算子 演算名 使用例 結果
Is参照が等しいSheets(1) Is Sheets(1)
Sheets(1) Is Nothing
True
False

オブジェクト Is オブジェクト のように入力します。

Dim b As Boolean

b = (Sheets(1) Is Sheets(1))
Debug.Print(b) ' True、同じシート

b = (Sheets(1) Is Sheets(2))
Debug.Print(b) ' False、違うシート

Dim sheet As Worksheet
b = (sheet Is Nothing)
Debug.Print(b) ' True、変数は空

b = (Sheets(1) = Sheets(1)) ' エラー、オブジェクトを = で比較できない

論理演算子

論理演算やビット演算に使う論理演算子を紹介します。

演算子 演算名 使用例 結果
And論理積True And True
True And False
False And False
True
False
False
Or論理和True Or True
True Or False
False Or False
True
True
False
Not論理否定Not True
Not False
False
True
Xor排他的論理和True Xor True
True Xor False
False Xor False
False
True
False

And (かつ) はどちらも True のときのみ結果が True になります。

Or (または) はどちらかが True なら結果が True になります。

Not は結果を反転します。

Xor は比較するものが異なるときに結果が True になります。

Debug.Print(True And True)  ' True
Debug.Print(True And False) ' False
Debug.Print(True Or False)  ' True
Debug.Print(True And True And False) ' False

比較演算子と組み合わせて複数の条件を作成できます。

Debug.Print(1 = 1 And 1 <> 0) ' True
Debug.Print(1 = 1 And 1 <> 1) ' False
Debug.Print(1 = 1 Or 1 <> 1)  ' True
Debug.Print(1 <> 1 Or 1 = 0)  ' False

複数の演算子があるときは左から順番に評価していきます。詳しくは下記の「演算子の優先順位」をご覧ください。

ビット演算

数値を2進数で考え、各桁を論理演算するビット演算というやり方があります。

詳しくは「ビット演算」をご覧ください。

算術演算子

四則演算などの計算に使う算術演算子を紹介します。

演算子 演算名 使用例 結果
+足し算1 + 23
-引き算2 - 11
*掛け算2 * 36
/割り算7 / 23.5
\割り算の商7 \ 23
Mod割り算の余り7 Mod 21
^べき乗2 ^ 38
&文字結合"Tips" & "found""Tipsfound"

値 演算子 値 のように入力します。

Dim i As Integer
i = 1 + 2
Debug.Print(i) ' 3

Dim d As Double
d = 7 / 2
Debug.Print(d) ' 3.5

Dim s As string
s = "Tips" & "found"
Debug.Print(s) ' Tipsfound

オーバーフロー

計算した結果がその型の範囲を超えるときは「エラー 6 オーバーフローしました。」が発生します。

Dim b As Byte
b = 255 + 1 ' エラー、Byte の最大値は 255

次のような計算でもオーバーフローします。

Dim b1 As Byte
Dim b2 As Byte
b1 = 255
b2 = 1

Dim i As Integer
i = b1 + b2 ' エラー、結果が Byte の 256 のため
i = 255 + 1 ' OK、結果が Integer の 256 のため

通常であれば Integer に代入する数値は Integer に自動で変換されます。しかし、Byte と Byte を足し算した結果は Byte になります。結果を代入する前に Byte の 256 になるので、その時点でオーバーフローします。

エラーを発生しないようにするには、代入する前に「CInt 関数」などで変換してから計算します。

Dim b1 As Byte
Dim b2 As Byte
b1 = 255
b2 = 1

Dim i As Integer
i = CInt(b1) + CInt(b2) ' OK
i = CInt(b1) + b2       ' OK、片方だけ変換しても大丈夫

演算子の優先順位

通常は左から右に評価していきます。 1 + 2 - 3 なら 1 + 2 を計算してから 3 - 3 の計算をします。

すべての算術演算子と論理演算子には優先順位が決められており、実際は優先順位の高いものから評価されます。

優先度 算術演算子 論理演算子
1^Not
2* /And
3ModOr
4+ -Xor
5&
Dim d As Double
d = 1 + 2 * 3 ' 次の順に評価される
' 1 + 6、* を評価
' 7、    + を評価
Debug.Print(d) ' 7

Dim b As Boolean
b = True Xor False And True Or True ' 次の順に評価される
' True Xor False Or True、And を評価
' True Xor True、         Or を評価
' False、                 Xor 評価
Debug.Print(b) ' False

このように優先順位を考えると複雑です。そこで評価を () で囲むと、そこが最優先に評価されるのでわかりやすくなります。一般的な数学と同じです。

Dim d As Double
d = (1 + 2) * 3 ' 次の順に評価される
' 3 * 3、() の中を評価
' 9、    * を評価
Debug.Print(d) ' 9

Dim b As Boolean
b = (True Xor False) And (True Or True) ' 次の順に評価される
' True And (True Or True)、左の () の中を評価
' True And True、          右の () の中を評価
' True、                   And を評価
Debug.Print(b) ' True

特に論理演算子や比較演算子は評価が 1 つでも括弧を付けた方がわかりやすいのでオススメです。