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

# 1. はじめに
ＡＲアドバンストテクノロジ株式会社（ＡＲＩ）の鈴木タクヤです。

早いもので、この解説シリーズも第6回です。

このシリーズは主に、__もしもVBAが使えたら__ という並行世界を目指す初心者に向けたものです。なかなかVBAの実践的な内容に入らないなーと思われるかもしれませんが、何事も基礎は大切。（私自身、当初はExcelフィルタリングツールの処理の流れをザックリ解説して終わろうかと思っていましたが、後輩の研修にも使えるかもと、方針を変更しました。）
また、それ知ってるよ！という方にも何かしらの気づきがあるような記事を目指しておりますので、よろしければお付き合いください。
__もしも、あなたから「いいね」が貰えたら、私はうれしいです。__

というわけで、今回はExcelフィルタリングツールのソースコード解説第6回です。

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

https://qiita.com/TakuyaSuzuki/items/75789a1cf0b3a7c31c0b

__[解説第5回](https://qiita.com/TakuyaSuzuki/items/2486e705198b5a70e235 "【5分でVBA学習】変数の有効範囲「スコープ」（おまけに猫とアクセス修飾子も添えて） ～Excelフィルタリングツール コード解説 #5～")__ は変数のスコープについての記事でしたが、今回のテーマは少し実践的な内容かつ、プログラミングにおける最重要項目の一つともいえる __「Ifステートメント」__ です。書き始めたら長くなってしまったので前後編に分けさせていただきます。

「Ifステートメント」をマスターすれば __「マクロの記録」__（__[解説第2回](https://qiita.com/TakuyaSuzuki/items/cbb8f2e32cc0294f53fe "【5分でVBA学習】避けては通れないSubプロシージャ ～Excelフィルタリングツール コード解説 #2～")__ のおまけ参照）では実現できないような複雑な処理を組めるようになります！

:::note warn
そもそも「マクロの記録」を知らないよ！という方は、 __[解説第2回](https://qiita.com/TakuyaSuzuki/items/cbb8f2e32cc0294f53fe "【5分でVBA学習】避けては通れないSubプロシージャ ～Excelフィルタリングツール コード解説 #2～")__ のおまけに使い方を載せているので、是非ご覧ください。__世界が変わります。__
:::

# 2. Ifステートメントとは 
「__If文__」とも呼ばれますが、「もしも○○だったら△△」という条件を記述するためのものです。最もシンプルな「もしも○○だったら△△」という条件分岐は以下のように記述します。
```vb:
    If ○○ Then　　　　'○○の部分にもしもの条件を記述
        △△　　　　　'条件に当てはまる場合のみ実行する処理を記述
    End If　　　　　　'条件に当てはまる場合のみ実行する処理の修了を宣言
```
::: note
以下のように一行で記載することもできますが、可読性（読みやすさ）が下がるためあまりお勧めしません。
```vb:
If ○○ Then △△
```
:::

```vb:Ifステートメントの使用例①
Sub a()
    Dim あなたからもらえたもの As String        '変数「あなたからもらえたもの」を宣言
    Dim 私の状態 As String                      '変数「私の状態」を宣言
    
    あなたからもらえたもの = "いいね"           '変数に文字列「いいね」を代入
    
    If あなたからもらえたもの = "いいね" Then   'Ifステートメントを使用
        私の状態 = "うれしい"                   '条件を満たす場合のみ実行
    End If                                      '条件分岐（もしもの世界）を修了
    
    MsgBox 私の状態                             '変数「私の状態」の値をメッセージボックスに表示

End Sub
```

__[解説第4回](https://qiita.com/TakuyaSuzuki/items/4402237239e338368257 "【5分でVBA学習】変数の使い方（おまけに定数も添えて） ～Excelフィルタリングツール コード解説 #4～")__ でも触れたように、変数名には日本語の漢字や仮名も使用できます。この例ではもしも変数 `あなたからもらえたもの` の値が「いいね」だったら、変数 `私の状態` に「うれしい」を代入するという条件分岐になります。Ifステートメントの直前で条件を満たすように `あなたからもらえたもの` に「いいね」を代入しているので、実行結果は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2566746/5b22b087-8c64-2fa8-c2a5-d88e4d56d133.png)
__もしも、あなたから「いいね」が貰えたら、私はうれしいです。__（くどい？）

また、「もしも」の条件に当てはまらなかった場合にだけ実行する処理は、以下の例のように __`Else`__ や __`ElseIf`__ を使用して記述します。

```vb:
    If ○○ Then        
        △△          
    ElseIf □□ Then    '○○の条件を満たさない場合の条件□□を追加
        ××            '○○ではないが□□の条件を満たす場合の処理を記述
    Else              
        ▼▼            'ここまでの条件をすべて満たさない場合の処理を記述
    End If            
```

```vb:Ifステートメントの使用例②
Sub a()
    Dim あなたからもらえたもの As String                '変数「あなたからもらえたもの」を宣言
    Dim 私の状態 As String                              '変数「私の状態」を宣言
    
    あなたからもらえたもの = "ストック"                 '👈変数に文字列「ストック」を代入
    
    If あなたからもらえたもの = "いいね" Then           'Ifステートメントを使用
        私の状態 = "うれしい"                           '「あなたからもらえたもの」の値が"いいね"の場合のみ実行
        
    ElseIf あなたからもらえたもの = "ストック" Then     '👈ElseIf で上の条件を満たさない場合の条件を追加
        私の状態 = "ちょっとうれしい"                   '「あなたからもらえたもの」の値が"いいね"ではなく、"ストック"の場合のみ実行
        
    Else                                                '👈上の条件をいずれも満たさない場合の処理開始を宣言
        私の状態 = "読んでもらえただけありがたい"        '「あなたからもらえたもの」が"いいね"でも"ストック"でもない場合のみ実行
        
    End If                                              
    
    MsgBox 私の状態                                     '変数「私の状態」の値をメッセージボックスに表示

End Sub
```
↓実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2566746/5d1c17f6-95ef-7387-a091-7f5bf9919d3d.png)

__[Excelフィルタリングツール](https://qiita.com/TakuyaSuzuki/items/75789a1cf0b3a7c31c0b "【ツール提供】Excelユーザなら全員使える?! Excelフィルタリングツール")__ では、例えば `clearFilter` というSubプロシージャの中で、以下のような記述が登場します。（起動モードを表す変数 `modeNo` の値が1でない場合のみ、2に設定するという処理です。（ここだけ見るとわけのわからない処理ですが・・・。）

```vb:Excelフィルタリングツールより抜粋
'■適用済みフィルタのクリア処理
Sub clearFilter()

    '起動モードを設定；modeNo=1:フィルタリング でないときは 2:フィルタのクリア に設定する
    If modeNo <> 1 Then
        modeNo = 2
    End If
（後略）
```
`If` や `ElseIf` の後に記述する条件式は `=` 以外にも、この例のように「等しくないこと」を表す `<>` や不等号（「未満」の場合 `<` 、「以上」の場合は `>=` など）も使用できます。
また、 `Not` を用いれば上の例の `modeNo <> 1` を `Not modeNo = 1` と表すこともできます。この `=` や `>=` などを __演算子__ と呼びます。（加算乗除の `+` `-` `*` `/` などの計算の記号も演算子の一種。）

演算子 `And` `Or` は後編で紹介しますが、すべては紹介できないので、詳しく知りたい方は以下の記事をご参照ください。この記事でちらっと触れられている `Like` についてはいずれこのシリーズでも取り上げる予定です。

https://excel-ubara.com/excelvba4/EXCEL_VBA_452.html

:::note

ちなみに、Ifステートメントは入れ子（ネスト）で使用することもできます。
```vb
    If ○○ Then        
        △△
        If ●● Then
            ▲▲
        End If
    End If
```

:::

# 3. おわりに
以上、__Ifステートメント__ の解説、前編でした。

補足ですが、今回紹介した例は説明のために単純なコードとなっているため、条件分岐と言いつつも実行結果は毎回同じものとなります。しかし、実際にIfステートメントを使用する必要がある場面では、処理の呼ばれ方によって結果が変わることがほとんどです。（○○が存在すれば～とか、セルの値が××の場合は～とか。）

次回の後編では、__「ブール型」__ の変数や __「論理演算子」__ を使用したIfステートメント、そして知っていると便利な __「ド・モルガンの法則」__ について解説したいと思います。

👇次回

https://qiita.com/TakuyaSuzuki/items/a38b2356d823a67f87ea

# 4. 参考文献
こちらは私がものすごくお世話になっている「エクセルの神髄」という解説サイト。より深く学習を進めたい方は是非。

https://excel-ubara.com/excelvba1/EXCELVBA320.html