テーマ
第9回目となる本稿のテーマは、「真偽値を扱うデータ型を使い、比較演算を行う」です。
プログラムはコンピューターが機械的に実行する「振る舞い」を人間が記述したものです。通常、いくつもの振る舞いを組み合わせて一つの仕事を生み出し、さらにそのように生み出された多くの仕事を束ねることでアプリケーションを作り上げます。コンピューターが行う一つ一つの計算は単純なものと言えますが、どの様な順序でそれらの計算を行い、あるいはスキップし、ときにループさせるのかといった意思決定をプログラムは必ず内包しています。このような「振る舞い」を変化させる判断や制御を行う文法を制御構造と呼び、その中でも特に条件判断に特化したものを条件分岐構文と呼びます。本稿で学習する真偽値は、このような条件分岐でよく用いられるデータ型です。条件を満たしていれば(即ち真であれば)「振る舞い A 」を行い、条件を満たしていなければ(即ち偽であれば)「振る舞い B 」を行う、そのような具合に真偽値は使用されます。
データ型(論理型)
データ型( Boolean 型)
真偽値には、二つしか値がありません。一つは真、もう一方は偽です。これを VBA の中ではそれぞれ True と False で表現します。読み方は True がトゥルー、False がフォルスです。二つしかありませんので簡単ですね。そしてこの2種類の値を扱うためのデータ型が Boolean 型です。ブーリアン型と読みます。
それでは以下のサンプルコードを Sheet1 シートモジュールへ記述してください。
Public Sub Chapter9()
Dim bool As Boolean
Debug.Print bool
bool = True
Debug.Print bool
End Sub
F5 キーを押してマクロを実行してください。以下のような結果がイミディエイトウインドウに表示されます。
False True
コードを解説します。Boolean 型変数 bool を宣言し、そのまま何も代入せずに出力しています。イミディエイトウインドウには False と表示されました。つまり、Boolean 型の初期値は False だということです。そして変数 bool へ True を代入してからもう一度 bool が保持している値を表示しています。結果は上記の通り True です。
Boolean 型は False か True かという二つの値しかとらないため、いたってシンプルです。初期値が False であることは覚えておきましょう。また、日本語での表記ももう一度確認しておきます。
False は 偽、True は 真 を表しています。
比較演算
Boolean 型が取りうる値は二種類しかないことは既に述べました。そのため他の多くのデータ型とは異なり、扱えるデータの範囲という論点はないも同然です。非常にシンプルなわけです。しかしながら、真や偽あるいは True False といった概念は、日常生活で使われることがないので何のことだか分かり難いかもしれません。ここでは、真偽の概念を実際に体験することでその理解を深めていきたいと思います。
既に算術演算については学習しました。+ – * / といった四則演算に用いるオペレーター、あるいは 余りを演算する Mod 、べき乗を演算する ^ といったオペレーターも学習しましたね。このような算術演算は、主に数値をオペランドとした演算で、その結果も数値となりました( & 演算子のみはオペランドも結果もテキストです)。ここでは新たに比較演算というものを紹介します。比較演算は算術演算のように数値をオペランドとすることが出来ますが、演算結果は数値にはならず、真偽値となるのが特徴です。以下のマクロを Sheet1 シートモジュールに追記しましょう。
Public Sub Chapter9_1()
Dim value50 As Long
Dim value100 As Long
value50 = 50
value100 = 100
Debug.Print "value50 < value100 : " & CStr(value50 < value100)
Debug.Print "value100 < value50 : " & CStr(value100 < value50)
Debug.Print "value100 <= 100 : " & CStr(value100 <= 100)
Debug.Print "value100 <= 90 : " & CStr(value100 <= 90)
Debug.Print "value50 = value100 : " & CStr(value50 = value100)
Debug.Print "value50 = 50 : " & CStr(value50 = 50)
Debug.Print "value50 / 2 <> 25 : " & CStr(value50 / 2 <> 25)
Debug.Print "value50 / 2 <> 30 : " & CStr(value50 / 2 <> 30)
End Sub
マクロの作成が終わったら実行してみましょう。イミディエイトウインドウへの出力結果は少し下へスクロールしたところへ表示しておきます。
このマクロでは、二つの Long 型変数 value50 と value100 を用意し、それぞれに 50, 100 を代入しています。そして Debug.Print によってそれぞれの数値を比較する式の「評価値」を出力しています。
CStr() は、Chapter7 で数値型の値をテキスト型へ変換できると既に説明しました。今回は数値型からテキスト型への変換ではなく、論理型からテキスト型への変換を行うために使っています。つまり、CStr() は論理型の値をテキスト型の値へ変換することも出来るということです。
論理型の値である True は、CStr(True) によって、”True” というテキスト型の値に変換されます。また、論理型の値 False は、CStr(False) によって、”False” というテキスト型の値に変換されるのです。
さて、最初の比較である value50 < value100 は、value50 よりも value100 が大きいとき、真と評価され True が評価値となります。いま、value50 には 50、value100 には 100 が保持されていますのでこの式の評価は真、即ち True です。
マクロの 9 行目にある式は、value100 < value50 です。これはどうでしょうか? 100 < 50 という不等式は成り立ちませんのでこの式は偽と評価され、評価値は False となります。
value50 < value100 : True value100 < value50 : False value100 <= 100 : True value100 <= 90 : False value50 = value100 : False value50 = 50 : True value50 / 2 <> 25 : False value50 / 2 <> 30 : True
このように両側のオペランドの大小を比較する演算子を比較演算子と呼びます。種類は多く、<, >, >=, <=, =, <> の 6 種類あります。不等号は数学と同じなので意味は分かると思います。注意が必要なのは = です。この記号は、今まで代入を意味する演算子、即ち代入演算子として用いてきましたが、比較演算子としても機能します。= はイコール記号ですので両側のオペランドが等しいときに真と評価されるオペレーターです。このマクロの 14 行目には
Debug.Print “value50 = value100 : ” & CStr(value50 = value100)
とありますね。この式の = は比較演算子として評価されますので、代入は行われませんので注意してください。それは次の行 15 行目の出力結果を見ても分かります。
Debug.Print “value50 = 50 : ” & CStr(value50 = 50)
この式は真と評価され True が出力されています。つまり 14 行目で 100 が代入されていないことを示しています。
17 行目 18 行目のコードで使われている <> は二つの記号で一つのオペレーターとなっています。これは = とは逆で、両オペランドが等しくないときに真となり True が評価値となります。直感的に理解できるとは思います。
まとめ
| データ型 | サイズ | 初期値 | データの範囲 |
|---|---|---|---|
| Boolean 型 | 2 | False | True, False |
Boolean 型のサイズは 2 bytes です。True か False かという2種類の値しかもたないデータ型ながら、2 バイトを必要としています。本来は 1 バイトで表現可能なデータ範囲ですが、おそらく Office 製品が 16 bit 版の時に「その使用頻度と速度を考慮して」効率の良い 2 バイトで設計され、64 bit 版になった今でもそれを踏襲しているからだろうと思います。
| オペレーター | 演算の種類 | オペランド | 使用例 | 演算結果 |
|---|---|---|---|---|
| < | 比較 | 両側 | 1 < 10 5 < 3 | True False |
| > | 比較 | 両側 | 1 > 10 5 > 3 | False True |
| <= | 比較 | 両側 | 1 <= 1 2 <= 1 | True False |
| >= | 比較 | 両側 | 1 >= 1 2 >= 1 | True True |
| = | 比較 | 両側 | 1 = 10 3 = 3 | False True |
| <> | 比較 | 両側 | 1 <> 10 3 <> 3 | True False |
今回学習した比較演算子の一覧を表にまとめておきました。ほとんどのオペレーターは直感的に使用方法を理解できると思いますので、特に難しい論点ではありません。唯一注意すべきなのは = で、代入演算子の = と区別する必要があることです。また、> と >= に関しては、< と <= で代用でき、代用した方が可読性が高まることからその使用を禁止しているプロジェクトも多く存在します。当サイトでも > と >= は基本的に使用しませんが、それを用いたコードを読める必要はあるので一覧には掲載しています。
それでは本稿はここで終わりです、お疲れさまでした。また次回お会いしましょう。
