サイトについて      連絡先   検索

VBA 演算子

はじめに

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

足し算 + や引き算 - などの計算に使うのが算術演算子です。

等しい = や より大きい > などの比較に使うのが比較演算子です。

かつ And やまたは Or など論理演算に使うのが論理演算子です。

  • 目次
    • 算術演算子
    • 比較演算子
    • 論理演算子
    • 演算子の優先順位

算術演算子

計算に使う算術演算子を紹介します。

演算子 演算名 使用例 結果
+足し算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 に代入する数値は 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、片方だけ変換しても大丈夫

比較演算子

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

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

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


If i = j Then

End If

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

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

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

文字列 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

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 になります。

ビット演算

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

演算子の優先順位

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

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

算術演算子 論理演算子
^Not
* /And
ModOr
+ -Xor
&

Dim d As Double

d = 1 + 2 * 3
Debug.Print (d) ' 7、2 * 3 が先に計算される

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

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


Dim d As Double

d = (1 + 2) * 3
Debug.Print (d) ' 9、(1 + 2) を先に計算する

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

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

  • 目次
    • 算術演算子
    • 比較演算子
    • 論理演算子
    • 演算子の優先順位