1. はじめに
ARアドバンストテクノロジ株式会社(ARI)の鈴木タクヤです。
今回はExcelフィルタリングツールのソースコード解説第7回です。
(ツールの詳細については以下の記事を、「Excelフィルタリングツール解説シリーズ」タグの記事一覧については以下の記事下部「5. 解説記事のリンク」をご参照ください。)
今回のテーマは 解説第6回(前編) に引き続き、「Ifステートメント」の使い方です。
2. ブール型(Boolean)
Ifと関連の深い変数のデータ型に ブール型(Boolean) があります。これは真理値(真偽値)とよばれる、 ○:Trueか、×:False の2つの値のみのデータ型です。
真理値とは(「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典)
「If ~ Then」の「~」の部分の条件式は、じつはこのブール型の変数で表すこともできます。というよりも、実はすべての条件式は 「正しい(真)」の場合は「True」、「誤り(偽)」の場合は「False」 と、ブール型で評価されます。
Sub a()
Dim x As Boolean, msg As String
x = True
msg = "xの値は False です"
If x Then
msg = "xの値は True です"
End If
MsgBox msg
End Sub
この例ではブール型の変数 x
にTrueを代入し、 If x Then
というIfステートメントで条件分岐しています。Trueは 「正しい」 という意味になるため、次の行でString型の変数 msg
の値は「xの値は True です」に上書きされます。したがって実行結果は以下の通りです。
しれっと使用していますが 「Dim 変数1 As データ型, 変数2 As データ型, ・・・」 と1行で複数の変数を宣言することができます。
また、例③の x = True
を コメントアウト(後述) すると・・・
Sub a()
Dim x As Boolean, msg As String
'x = True 👈コメントアウト(無効化)
msg = "xの値は False です"
If x Then
msg = "xの値は True です"
End If
MsgBox msg
End Sub
このように、 x
に何も代入しないと上の例③’のIfステートメントはスキップされるため、ブール型の変数の初期値は False であることが分かります。
しれっと使用かつ、実は今まで何度も登場していますが、VBAコードに 「'」(シングルクォート) が登場する場合、そこから行末まではプログラム上の命令ではなくただの「コメント」として扱われ、処理されません。コメントとして記述を無効化することを 「コメントアウト」 と言います。
3.よく使われるブール演算子(論理演算子)の紹介
ブール演算子とは(「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典)
3-1 And
And
は「○○かつ△△」の 「かつ」 を表します。複数の条件式を And
でつなぐと、すべての条件を満たす場合のみTrue(真)と判定され、1つでも条件を満たさなければFalse(偽)と判定されます。
以下の表をご覧ください。
この記事の執筆時点で私は、LPICレベル1の資格取得のための学習中です。この資格の取得には101試験と102試験の両方に合格しないといけませんが、まだ101試験しか受けていません。
この表のExcelシートを表示している状態で以下のマクロを実行すると・・・
Sub a()
If Range("A2").Value = "合格" And Range("B2").Value = "合格" Then
Range("C2").Value = "○"
Else
Range("C2").Value = "×"
End If
End Sub
↓実行結果
C2セルに「×」が付きました!(このままでは会社に受験料を請求できない・・・)
上の例の Range()
はセルの範囲を表す Rangeオブジェクト です。 Range("A2")
のように単一のセルも表せます。 .Value
は「~の値」を表します。
ここで注意が必要ですが、If ~ Then の間にある Range("A2").Value = "合格"
は、「A2セルの値が『合格』である」という条件を表します。しかし、次の行の Range("C2").Value = "○"
は「C2セルの値に『○』を設定する」という意味になります。 =
には「左辺と右辺が等しい」、「左辺に右辺の値を代入・設定する」という2つの意味があります。
ちなみに上の例では .Value
を省略することができます。
3-2 Or
Or
は「○○または△△」の 「または」 を表します。複数の条件式を Or
でつなぐと、1つでも条件を満たせばTrue(真)と判定され、すべての条件を満さない場合のみFalse(偽)と判定されます。
マンガ「ONEPIECE」には海賊(や山賊)の指名手配書が登場しますが、そこに「DEAD OR ALIVE」と書かれています。これは「そいつを 仕留め ても 生け捕り でも、懸賞金を払うぜ」という意味です。
以下の表をご覧ください。
この例では「死亡」かつ「生存」という シュレディンガーの猫1 みたいな状況はないと思いますが、今回は指名手配犯を生け捕りにしたとしましょう。
この表のシートを表示している状態で以下のマクロを実行すると・・・
Sub a()
If Range("A2").Value = "○" Or Range("B2").Value = "○" Then
Range("C2").Value = "○"
Else
Range("C2").Value = "×"
End If
End Sub
↓実行結果
C2セルに「○」が付きました!(受験料より懸賞金を狙うべきか・・・)
3-3 Not
Not
は「○○でない」の 「でない」 を表します。 Not
の後ろの条件式の「True」か「False」かの評価を反転させます。
Sub a()
Dim x As Boolean, msg As String
x = True
msg = "「いいね」がほしい…"
If Not x Then
msg = "「いいね」ください"
End If
MsgBox msg
End Sub
↓実行結果
この例では冒頭でブール型の変数 x
にTrueを代入し、Ifステートメントで Not x
とすることでFalseになるため、変数 msg
に "「いいね」ください" を代入する処理はスキップされます。
3-4 Excelフィルタリングツールにおける使用例
And
、Or
はFunctionプロシージャ checkFormat
の以下の部分で登場します。
'英字部分が3桁の場合の整合性チェック
If startingPositionOfRowNo = 4 Then
If (Mid(cellReference, 1, 1) Like "[Y-Z]") _
Or (Mid(cellReference, 1, 1) = "X" And Mid(cellReference, 2, 1) Like "[G-Z]") _
Or (Mid(cellReference, 1, 1) = "X" And Mid(cellReference, 2, 1) = "F" And Mid(cellReference, 3, 1) Like "[E-Z]") _
Then
Call showFormatErrorMessage(3)
End If
End If
また Not
は例えばSubプロシージャ activateSheet
の以下の部分で登場します。
If Not sheetExists Then
MsgBox "シート「" & sheetName & "」が「" & wb.Name & "」に存在しません。"
Call endMacro
End If
4. おわりに
以上、前後編にわたる「Ifステートメント」の解説でした。
普段手作業で行っているExcelの編集作業を「マクロの記録」で保存し、「Ifステートメント」を使用しながら条件分岐を追加することで、自動化できる処理の幅を広げることができます。なるべく仕事はマクロに任せて楽をしましょう!
次回は、処理の幅をさらに広げる「For...Next ステートメント」について解説します。
👇次回
5. おまけ;ド・モルガンの法則
ブール型と関係が深い「ド・モルガンの法則」について紹介します。高校数学で習った記憶のある方もいると思いますが、これを知っているとコードを読みやすいものにできる場合があります。
これは数学者オーガスタス・ド・モルガンが発案したといわれる法則で
・「"P かつ Q"でない」は「"Pでない" または "Qでない"」に等しい
・「"P または Q"でない」は「"Pでない" かつ "Qでない"」に等しい
というものです。
要は、And
でつながった条件全体を否定(Not
)すると、それぞれの条件の否定をOr
でつないだものと同じ意味になり、Or
でつながった条件全体を否定すると、それぞれの条件の否定をAnd
でつないだものと同じ意味になるというものです。
あの日 あの時 あの場所で 君に会えなかったら 僕等は いつまでも 見知らぬ二人のまま(「ラブ・ストーリーは突然に」©小田和正)
という歌詞があります。これは
If Not(あの日君に会えた And あの時君に会えた And あの場所で君に会えた) Then
僕等はいつまでも見知らぬ二人のまま = True
End If
'※日本語の部分はブール型変数
ということかと思います。このIfステートメントはド・モルガンの法則により
If (Not あの日君に会えた) Or (Not あの時君に会えた) Or (Not あの場所で君に会えた) Then
僕等はいつまでも見知らぬ二人のまま = True
End If
と書き換えられるということです。(例えば、あの日あの時に会っていたとしてもあの場所じゃなかったら、ただすれ違っただけで知り合いにはならなかった・・・みたいな?)
ド・モルガンの法則を利用することで、例えば以下のようなIfステートメントは意味を変えずにすっきりと書き換えることができます。(「以上」の否定は「未満」、否定の否定は肯定。)
If Not( i >= 0 And (Not str = "○")) Then
'※「iが0以上かつ『strが"○"でない』」でない場合
If i < 0 Or str = "○" Then
'※「iが0未満またはstrが"○"」の場合
条件式が複雑で否定が絡むような場合には、書き換えを検討してみてください。
6. 参考文献
こちらはMicrosoftの公式ドキュメントです。
こちらは私がものすごくお世話になっている「エクセルの神髄」という解説サイト。より深く学習を進めたい方は是非。
ド・モルガンの法則(Wikipedia)
-
シュレディンガーの猫:物理学者シュレディンガーの思考実験に登場する、生きながら死んでいる猫。気になる方はググって量子力学の世界を垣間見てきてください。 ↩