Trueの場合はFalse、Falseの場合はTrueにしたい場合
VBAのBoolean型はTrueとFalseの2つの値しかありません。
その性質から、フラグや「OK or NG」や「On or Off」の判定結果のような用途として利用することが多い型です。
このように2つの値しか持たないため、用途として「TrueだったらFalseを設定する」「FalseだったらTrueを設定する」という使い方をされることが結構あります。
そのような場合に以下のようなコードを書いてあることがあります。
1 2 3 4 5 6 7 |
Sub BooleanChange(bFlg As Boolean) If bFlg = True Then bFlg = False Else bFlg = True End If End Sub |
上記の説明の通りに、「TrueだったらFalseを設定する」「FalseだったらTrueを設定する」というコードです。
これ自体、全く問題ありませんし、私も当ブログで同様の書き方でコード紹介している個所はいくつもあると思います。
ただ、これを1行で書ける方法があります。
Not演算子でBoolean型の値を判定できる
VBAにはNot演算子があります。
Not演算子はあまり出番がない演算子で、If文でオブジェクト変数に対して「Is Nothing」の判定の否定として「Not obj Is Nothing」のような使い方ぐらいしか見る機会が少ないです。
そのため、存在自体を忘れがちな演算子ですが、否定であることを利用してBoolean型の判定操作に使うことが出来ます。
1 2 3 |
Sub BooleanChange2(bFlg As Boolean) bFlg = Not bFlg End Sub |
元のBoolean型の変数値をNot演算子で反転させて、それを自分自身に代入することでTrueとFalseの反転を行うことが出来ます。
繰り返しになりますが、フラグや「OK or NG」や「On or Off」でBoolean型を利用している場合は、このような書き方が出来ます。
Not演算子でBoolean型を反転さえる際の注意点
上でも書きましたがNot演算子はあまり目にすることがないコードです。
そのため、「bFlg = Not bFlg」と書いてあるコードを見たときに理解できない方がいることが考えられます。
そういう場合はコードが長くなっても最初に書いたIf文のように書いた方がむしろ親切です。
そのあたりのバランスを考えた上で使うかどうかを判断してください。
なお、私自身は仕事用で他の人に見られることが想定される場合は、誤った解釈されることを避けるために、Not演算子を使わずにわざとIf文で冗長化することが多いです。