■
エクセルVBA中級編−VBAでいろんなテクニック
■ 演算子を詳しく知ろう!
今回は演算子のお話です。
ExcelVBAでは、さまざまな演算子を用いてプログラミングすることが可能ですが、そのためには演算子の使い方をよく知っておく必要があります。ところで演算子ってなんでしょう?
演算子とは演算内容を指示する記号のことです。
さらに、演算の対象となる値(リテラル)や変数などの引数のことをオペランド(被演算子)と呼びますが、演算子の中でもオペランドを2つとるものを二項演算子(例:A And B、A + B、等)と呼び、オペランドを1つとるものを単項演算子(例:Not A、-A、等)と呼びます。
それでは早速、演算子の種類について解説していきましょう。
代入演算子
書式: a = b
代入演算子は等号の右側の値を左側の変数に代入します。右側の値(リテラル)は変数でも式でもかまいませんが、代入される左側は、必ず変数である必要があります。
※ VB、VBAでは代入演算子の"="と比較演算子の"="は同じ記号を用いますが、意味は全く異なりますので注意が必要です。
※ ExcelVBAではインクリメント、デクリメント演算子は使用できません。a++や a+= などは使用できないので注意が必要です。
例:
a = 100 変数aに定数100を代入します
a = b 変数aに変数bを代入します
a = a + b 変数a自身の値に変数bの値を加算して、変数aに代入します
算術演算子
+ 加算
- 減算
* 乗算
/ 除算
¥ 整数除算
mod 剰余
^ 累乗
算術演算子は数値リテラルや数値型変数の演算に使用します。演算子の優先順位は一般の数学と同じく加算・減算よりも乗算・除算のほうを優先します。"()"を使用した場合はカッコの中の演算を優先します。
※ VB、VBAでは加算演算子の"+"と連結演算子の"+"で同じ記号を用いますが、意味は全く異なりますので注意が必要です。
※ 減算演算子の"-"を単独で数値リテラル、変数、式などの前に用いたときは負数(マイナス)を表す記号として機能します。
例:
a = 3 + 2 変数aには5が代入される
a = 3 - 2 変数aには1が代入される
a = 3 * 2 変数aには6が代入される
a = 3 / 2 変数aには1.5が代入される
a = 3¥2 変数aには1(1.5の整数部分)が代入される
a = 3 mod 2 変数aには1(3/2の余り部分)が代入される
a = 3 ^ 2 変数aには9(3の2乗)が代入される
連結演算子
書式: a & b または a + b
連結演算子の"&"と"+"は文字列リテラル、文字列型変数、式などの連結を行います。ただし、"+"演算子は、両方の式が文字列の場合だけ連結を行い、式の片方に数値が含まれる場合もう片方の式を評価し、加算ができる場合は加算を行い、できない場合はエラーを返します。
例:
Range("A" & i).select A列i行のセルを選択します。
MyStr = "3" + "2" 変数MyStrには文字列"32"が代入されます
MyStr = "3" + 2 変数MyStrには文字列"5"が代入されます
MyStr = "A" + 2 型が一致しないためエラーが発生します
このことから、"+"を連結演算子として使用することはお勧めしません。確実に連結を行いたい場合は"&"演算子を用いるようにしましょう。
比較演算子(関係演算子)
= 等号
<> 不等号
> 未満
>= 以下
< 超過
<= 以上
Like 文字列比較
Is 参照比較
比較演算子は主に条件式の真、偽の判定に用いられます。式の右辺と左辺を比較し、真または偽の結果を得るのに用います。
例:
MyBln = 3 > 2 変数MyBlnには真(True)が代入されます
MyBln = 3 <> 2 変数MyBlnには真(True)が代入されます
MyBln = 3 = 2 変数MyBlnには偽(False)が代入されます
Like演算子は文字列の曖昧な比較を行うときに用いられます。文字列の比較に用いるパターンは下記の通りです。
パターン
? 任意の1文字
* 任意の数の文字
# 任意の半角数字1文字
[文字リスト] 文字リストに指定した任意の1文字
[!文字リスト] 文字リストに指定した以外の任意の1文字
(#以外は全角、半角にかかわらず1文字として扱います。)
例:
MyBln = "ABCDE" Like "AB?DE" 変数MyBlnには真が代入されます
MyBln = "ABCDE" Like "A*E" 変数MyBlnには真が代入されます
MyBln = "12345" Like "1234#" 変数MyBlnには真が代入されます
MyBln = "F" Like "[A-E]" 変数MyBlnには偽が代入されます
MyBln = "F" Like "[!A-E]" 変数MyBlnには真が代入されます
Is演算子は、2つのインスタンスが同じオブジェクトを参照しているかどうかを比較します。インスタンスが同じオブジェクトを参照している場合、真が返ります。
例:
Sub test()
Dim MyBln As Boolean
Dim Object1 As Range
Dim Object2 As Range
Dim Object3 As Range
Set Object1 = Range("a1")
Set Object2 = Range("a1")
'同一のオブジェクトを参照しているのでMyBlnには真が代入されます
MyBln = Object1 Is Object1
'異なるオブジェクトを参照しているのでMyBlnには偽が代入されます
MyBln = Object1 Is Object2
'インスタンスが生成されていないのでMyBlnには真が代入されます
MyBln = Object3 Is Nothing
End Sub
論理演算子
論理演算子は主に条件式で、複数の式の評価を行う場合に使用します。複数の式の真・偽の組み合わせを論理演算子を用いて判定し、全体の真・偽の評価を行います。
Not Not以下の条件式が偽ならば真、真ならば偽
例:
MyBln = Not MyBln
MyBlnが偽の場合、変数MyBlnには真が代入されます。MyBlnが真の場合、変数MyBlnには偽が代入されます。
And 論理積
Or 論理和
Xor 排他論理和
Eqv 論理等価
Imp 論理包含
例:
A 論理演算子 B の場合にとりうる真偽値のパターン
And A\B True False
True 真 偽
False 偽 偽
Or A\B True False
True 真 真
False 真 偽
Xor A\B True False
True 偽 真
False 真 偽
Eqv A\B True False
True 真 偽
False 偽 真
Imp A\B True False (AがTrue、BがFalseのときだけ偽で、それ以外は真)
True 真 偽
False 真 真
ビット演算子
論理演算子と同じものを使用します。論理演算子が真偽で結果を返したのに対し、ビット演算子はビット演算の結果を返します。
And(論理積)
式1 0 0 1 1
式2 0 1 0 1
結果 0 0 0 1
Or(論理和)
式1 0 0 1 1
式2 0 1 0 1
結果 0 1 1 1
Xor(排他論理和)
式1 0 0 1 1
式2 0 1 0 1
結果 0 1 1 0
例:
MyBln = MyLng And 1
この例では、整数型変数MyLngの値が奇数か偶数かを調べます。MyLngの値が何であれ、最下位ビットが1になれば、それは奇数を表し、0になれば偶数を表します。
1001は十進数の9を二進数に変換したものです。1は十進数でも二進数でも同じく1で表されます。
Andは論理積を求めるビット演算子ですので、この場合演算結果は、
1001
And 0001
------------
0001
1となり、ブール型変数MyBlnには1(True)が代入され、奇数であることが判定されます。
MyLngが8ならばビット演算は以下のように、
1000
And 0001
------------
0000
0となり、ブール型変数MyBlnには0(False)が代入され、偶数であることが判定されます。
この方法だと、MyLngの値が何であれ、常にMyLngの最下位ビットを調べれば奇数か偶数かの判定が行えることがわかります。
演算子の優先順位
演算子の優先順位の詳細は以下のようになります。
(上にいくほど優先順位が高く、下にいくほど優先順位が低くなります)
・()内の式
↓
・算術演算子 べき乗>マイナス符号>乗算・除算>整数除算>剰余>加算・減算
↓
・連結演算子
↓
・比較演算子
↓
・論理演算子 Not>And>Or>Xor>Eqv>Imp
以上、
演算子は単独で用いることは少なく、ほとんどの場合、様々な演算子を組み合わせて用いる ことが一般的です。
複雑に演算子を組み合わせた演算では、演算子の優先順位を意識しないと、予想外の結果が返ってくることになります。
ぜひ、この機会によく理解しておいてください。
Copyright© Gen Muto 武藤 玄 All Rights Reserved,