更新日:、 作成日:
VBA 比較演算子や論理演算子
はじめに
Excel VBA マクロの演算子を紹介します。
比較演算子には、等しい =、等しくない <> などがあります。
論理演算子には、論理積 And、論理和 Or などがあります。
四則演算などの算術演算子には、足す +、引く - などがあります。
論理演算子と算術演算子には優先順位があります。() で囲むと最優先で評価できます。
比較演算子
If 文などの比較に使う比較演算子を紹介します。結果はすべて Boolean になります。
演算子 | 演算名 | 使用例 | 結果 |
= | 等しい | 1 = 2 | False |
<> | 等しくない | 1 <> 2 | True |
> | 大きい | 1 > 2 | False |
< | 小さい | 1 < 2 | True |
>= | 以上 | 1 >= 2 | False |
<= | 以下 | 1 <= 2 | True |
値 演算子 値 のように入力します。括弧で囲むと見やすくなります。
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 個以上の文字 | *AB | AB, 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 + 2 | 3 |
- | 引き算 | 2 - 1 | 1 |
* | 掛け算 | 2 * 3 | 6 |
/ | 割り算 | 7 / 2 | 3.5 |
\ | 割り算の商 | 7 \ 2 | 3 |
Mod | 割り算の余り | 7 Mod 2 | 1 |
^ | べき乗 | 2 ^ 3 | 8 |
& | 文字結合 | "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 |
3 | Mod | Or |
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 つでも括弧を付けた方がわかりやすいのでオススメです。
スポンサーリンク