LoginSignup
6
1
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【5分でVBA学習】マクロの記録の限界を越えた自動化の第一歩!「Ifステートメント」の使い方(後編) ~Excelフィルタリングツール コード解説 #7~

Last updated at Posted at 2024-06-16

1. はじめに

ARアドバンストテクノロジ株式会社(ARI)の鈴木タクヤです。

今回はExcelフィルタリングツールのソースコード解説第7回です。

(ツールの詳細については以下の記事を、「Excelフィルタリングツール解説シリーズ」タグの記事一覧については以下の記事下部「5. 解説記事のリンク」をご参照ください。)

今回のテーマは 解説第6回(前編) に引き続き、「Ifステートメント」の使い方です。

2. ブール型(Boolean)

Ifと関連の深い変数のデータ型に ブール型(Boolean) があります。これは真理値(真偽値)とよばれる、 ○:Trueか、×:False の2つの値のみのデータ型です。

真理値とは(「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典)

「If ~ Then」の「~」の部分の条件式は、じつはこのブール型の変数で表すこともできます。というよりも、実はすべての条件式は 「正しい(真)」の場合は「True」、「誤り(偽)」の場合は「False」 と、ブール型で評価されます。

Ifステートメントの使用例③
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 です」に上書きされます。したがって実行結果は以下の通りです。
image.png

しれっと使用していますが 「Dim 変数1 As データ型, 変数2 As データ型, ・・・」 と1行で複数の変数を宣言することができます。

また、例③の x = Trueコメントアウト(後述) すると・・・

Ifステートメントの使用例③’
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

↓実行結果
image.png

このように、 x に何も代入しないと上の例③’のIfステートメントはスキップされるため、ブール型の変数の初期値は False であることが分かります。

しれっと使用かつ、実は今まで何度も登場していますが、VBAコードに 「'」(シングルクォート) が登場する場合、そこから行末まではプログラム上の命令ではなくただの「コメント」として扱われ、処理されません。コメントとして記述を無効化することを 「コメントアウト」 と言います。

3.よく使われるブール演算子(論理演算子)の紹介

ブール演算子とは(「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典)

3-1 And

And は「○○かつ△△」の 「かつ」 を表します。複数の条件式を And でつなぐと、すべての条件を満たす場合のみTrue(真)と判定され、1つでも条件を満たさなければFalse(偽)と判定されます。

以下の表をご覧ください。
image.png
この記事の執筆時点で私は、LPICレベル1の資格取得のための学習中です。この資格の取得には101試験と102試験の両方に合格しないといけませんが、まだ101試験しか受けていません。

この表のExcelシートを表示している状態で以下のマクロを実行すると・・・

Ifステートメントの使用例④
Sub a()
    
    If Range("A2").Value = "合格" And Range("B2").Value = "合格" Then
        Range("C2").Value = "○"
    Else
        Range("C2").Value = "×"
    End If

End Sub

↓実行結果
image.png
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」と書かれています。これは「そいつを 仕留め ても 生け捕り でも、懸賞金を払うぜ」という意味です。
以下の表をご覧ください。
image.png
この例では「死亡」かつ「生存」という シュレディンガーの猫1 みたいな状況はないと思いますが、今回は指名手配犯を生け捕りにしたとしましょう。

この表のシートを表示している状態で以下のマクロを実行すると・・・

Ifステートメントの使用例⑤
Sub a()
    
    If Range("A2").Value = "○" Or Range("B2").Value = "○" Then
        Range("C2").Value = "○"
    Else
        Range("C2").Value = "×"
    End If

End Sub

↓実行結果
image.png
C2セルに「○」が付きました!(受験料より懸賞金を狙うべきか・・・)

3-3 Not

Not は「○○でない」の 「でない」 を表します。 Not の後ろの条件式の「True」か「False」かの評価を反転させます。

Ifステートメントの使用例⑥
Sub a()
    Dim x As Boolean, msg As String
    x = True
    msg = "「いいね」がほしい…"
    
    If Not x Then
        msg = "「いいね」ください"
    End If
    
    MsgBox msg
End Sub

↓実行結果
image.png
この例では冒頭でブール型の変数 x にTrueを代入し、Ifステートメントで Not x とすることでFalseになるため、変数 msg に "「いいね」ください" を代入する処理はスキップされます。

3-4 Excelフィルタリングツールにおける使用例

AndOr はFunctionプロシージャ checkFormat の以下の部分で登場します。

Excelフィルタリングツールより抜粋(流し見でOK)
    '英字部分が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 の以下の部分で登場します。

Excelフィルタリングツールより抜粋(流し見でOK)
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)

  1. シュレディンガーの猫:物理学者シュレディンガーの思考実験に登場する、生きながら死んでいる猫。気になる方はググって量子力学の世界を垣間見てきてください。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1