『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】論理演算子(And,Or,Not,Xor,Imp,Eqv)

【VBA】論理演算(ブール演算)

この記事では VBA の 論理演算 (logical operation) について解説します。論理演算と聞くと、なんだかとても難しそうに思えますけど、実際は全然たいしたことありません。ようは慣れの問題。慣れてしまえば足し算や掛け算を計算するのと同じぐらい簡単です。
 
普通の四則演算(加減乗除)と違って、論理演算では True(真)または False(偽)の 2 種類の値しか使いません。この2種類の値に対して、答えもやっぱり True(真)か False(偽)のいずれかの値になるように、色々な演算規則を決めているのです。四則演算の「+」「-」「×」「÷」に代わって使われるのが、論理演算子 です。VBA では And(論理積)、Or(論理和)、Not(論理否定)、Xor(排他的論理和)、Imp(論理包含)、Eqv(論理等価)の 6 種類の論理演算子が用意されています。
 
ちなみに論理演算のことをブール演算とよぶことがあります。論理演算が、George Boole の提唱したブール代数にもとづく操作であることに由来します。VBA では True と False の値をブール型変数 (Boolean) で扱います。

【VBA】And(論理積)

VBA の And は論理積 (logical conjunction) とよばれる演算子です。
「A And B」は「A かつ B」を意味します。つまり A, B ともに True(真)であるときだけ、True を返し、他の場合はすべて False を返します。And の演算表(真理値表)は次のようになります。

A B A And B
True True True
True False False
False True False
False False False

実際にマクロを作成して、And の演算結果を確認してみましょう。

'[VBA] 論理積Andサンプルコード

Option Base 1

'論理積の戻り値をテストするプロシージャ
Sub Logical_Conjunction()

  Dim i As Integer

  '配列変数をブーリアン型で定義します
  Dim x(4) As Boolean

  x(1) = 1 > 0 And 2 > 0
  x(2) = 1 > 0 And 2 < 0
  x(3) = 1 < 0 And 2 > 0
  x(4) = 1 < 0 And 2 < 0

  For i = 1 To 4
    Debug.Print x(i)
  Next i

End Sub

「1> 0」と「2>0」はともに正しい不等式なので、

x(1) = 1 > 0 And 2 > 0

の行では True と True の論理積を計算して、True を x(1) に格納しています。「1> 0」は正しい不等式、「2<0」は間違った不等式なので、

x(2) = 1 > 0 And 2 < 0

の行では True と False の論理積を計算して、False を x(2) に入れています。Logical_Conjunction() を実行すると、4 つの論理積を演算結果を表示してくれます(最初の不等式以外はすべて False になるはずです)。

【VBA】Or(論理和)

VBA の Or は論理和 (logical disjunction) です。
「A Or B」は「A または B」を意味します。条件式 A, B のどちらか一方が True(真)であれば、True を返し、どちらも False であるときだけ False を返します。And の演算表(真理値表)は以下のようになります。

A B A Or B
True True True
True False True
False True True
False False False

Or の演算結果を確認するマクロです。

'[VBA] 論理和Orサンプルコード

Option Base 1

'論理和の戻り値をテストするプロシージャ
Sub Logical_Disjunction()

  Dim i As Integer
  Dim x(4) As Boolean

  x(1) = 1 > 0 Or 2 > 0
  x(2) = 1 > 0 Or 2 < 0
  x(3) = 1 < 0 Or 2 > 0
  x(4) = 1 < 0 Or 2 < 0

  For i = 1 To 4
    Debug.Print x(i)
  Next i

End Sub

【VBA】Not(論理否定)

VBA の Not は論理否定演算で、ブーリアン値を反転させます(True を False に、False を True に変換します)。

'[VBA] 論理否定Notサンプルコード

Option Base 1

'論理否定の戻り値をテストするプロシージャ
Sub Inversion()

  Dim i As Integer
  Dim x(2) As Boolean

  x(1) = Not 1 + 1 = 2
  x(2) = Not 1 + 1 = 3

  Debug.Print x(1)
  Debug.Print x(2)

End Sub

「1 + 1 = 2」は正しい等式なので、そのブーリアン値は True です。なので

x(1) = Not 1 + 1 = 2

は True を反転させた False を x(1) に入れています。一方で「1 + 1 = 3」は誤った等式なので、ブーリアン値は False であり、

x(1) = Not 1 + 1 = 2

では False を反転させた True が x(2) に入ります。

【VBA】Xor(排他的論理和)

VBA の Xor は排他的論理和 (exclusive disjunction) とよばれる演算子です。「A Xor B」は「A か B のどちらか一方」を表します。つまり A と B がともに True のときは False, ともに False のときも False を返し、それ以外は True を返します。

A B A Xor B
True True False
True False True
False True True
False False False

Xor の演算結果を確認するプロシージャを載せておきます。

'[VBA] 排他的論理和Xorサンプルコード

Option Base 1

'排他的論理和の戻り値をテストするプロシージャ
Sub Exclusive_Disjunction()

  Dim i As Integer
  Dim x(4) As Boolean

  x(1) = 1 > 0 Xor 2 > 0
  x(2) = 1 > 0 Xor 2 < 0
  x(3) = 1 < 0 Xor 2 > 0
  x(4) = 1 < 0 Xor 2 < 0

  For i = 1 To 4
    Debug.Print x(i)
  Next i

End Sub

「1 > 0」と「2 > 0」はともに正しい不等式なので、

x(1) = 1 > 0 Xor 2 > 0

は True と True の排他的論理和を計算して、False を配列変数 x(1) に格納しています。

【VBA】Imp(論理包含)

VBA の Imp は論理包含 (Implication) とよばれる演算子です。「A Imp B」は「(A の否定) または B」を意味します。つまり、Not と Or を用いて「(Not A) Or B」と記述しても同じ結果が得られます。Imp の演算表(真理値)は次のようになります。

A B A Imp B
True True True
True False False
False True True
False False True

【VBA】Eqv(論理等価)

VBA の Eqv は論理等価演算 (logical equivalence) です。いわゆる必要十分(同値)であり、否定排他的論理和とよばれることもあります。排他的論理和とは逆の結果を返します。A と B がともに True のときは True, ともに False のときも True を返し、それ以外は False を返してきます。Eqv の演算表(真理値)は次のようになります。

A B A Eqv B
True True True
True False False
False True False
False False True

Imp(論理包含)と Eqv(論理等価)なんて、ほとんど使う機会がないので、きれいさっぱり忘れてしまってけっこうです。こんなの知ってるとオタクだと思われるだけです。え? こばとは VBA オタクじゃないですよ? 何言ってるんですか?

コメント

  1. 匿名 より:

    ノンプログラマーなVBAerにはこういった記事が助かります。
    ところで、”Imp”と”Eqv”の真理値表の見出しがいずれも”Xor”になっています。

    • こばと より:

       お役に立てて何よりです(^_^)/
       見出しは訂正しておきました。
       すべての記事を1人でチェックするには限界があるので、ミスを指摘していただけると本当に助かります。ありがとうございました。