『○○を含んでいるなら…』のような、条件で動作が変わるコードの組み方が分からない
IFの使い方はなんとなくわかるが、複数条件などの細かい表現が分からない
条件分岐を行うIFステートメントは、VBAの中で最も重要なコードの一つです。変数の考え方・For~Nextのループ処理に加えて、このIFステートメントを押さえれば、大体のVBAがかけてしまうくらい、重要な考え方の一つとなります。
ただ条件分岐は、「○○かつ○○」のような、数学の集合的な考え方をするので、とっつきにくいという方も多い領域です。
そこで今回は、条件分岐という言葉の意味から、IF文の基本的な使い方さらには複数条件の分岐まで、詳しく解説をしていきます。
是非この記事を参考にして、条件分岐の考え方・使い方をマスターしてください!
目次
条件分岐とは
条件分岐とは、『特定の条件に応じて、実行するコードを分岐させる仕組み』のことを言います。
エクセルの名簿から、25歳の人だけをピックアップするときの処理を例に、考えていきます。
この場合、ループ処理を使って上から順番に年齢を確認していき、25歳が見つかったらチェックをつけるというコードを作成します。
この時、25であればチェックをつけ、25でなければチェックをしない(何もしない)、という形で条件によって処理の方法が変わっています。
このように、条件によって処理を変えるという考え方を「条件分岐」と言います。そしてその条件分岐を、VBAで行うときに使われるコードがIF文(IFステートメント)です。
IF文の基本的な使い方
IF文(IFステートメント)は、VBAで条件分岐を行う最もポピュラーなコードです。
公式としては、次のように書きます。
If 条件式 Then
条件を満たしたときの処理
End If
先ほどの25歳にチェックをつけるというコードの場合、「年齢が25である」という部分が条件となり、「チェックをつける」という部分が処理になります。
なので1行目を判断するコードを作成する場合。
「D2」のセルの値が25なら(条件)、「E2」のセルにチェックを入れる(条件を満たした時の処理)というコードとなります。
これをコードに表すと次の通りです。
If Range(“D2”)=25 Then
Range(“E2″)=”〇”
End If
実際は一行ずつIf文のコードを書くことはなく、変数とループ処理を使って自動的に連続で確認していきます。ただ、If文の基本としては、上記のような形になるので、しっかりと理解をしておいてください。
※If分をループ処理の中に組み込んだサンプル
Sub if_sample()
Dim i As Long
Dim Maxrow As Long
'一番最後の行数を取得
Maxrow = Range("A1").End(xlDown).Row
'データの記載されている2行目~最後の行数までをループ処理
For i = 2 To Maxrow
'もしD列(年齢)のi行目が25だった場合
If Range("D" & i) = 25 Then
'E列(チェック)のi行目に〇を書く
Range("E" & i) = "〇"
End If
Next i
End Sub
比較演算子を知って、スムーズに分岐コードを書こう
先ほどの例の条件では、「年齢が25歳」すなわち「年齢=25歳」という、=(イコール)の形でした。ただ、この条件式には、以上・以下なども指定することができます。
先ほどのIf分を、ループ処理の中に組み込んだサンプルと合わせて、以下に紹介します。
特に、以上・以下と等しくないの書き方が、プログラム特有の書き方になっています。感覚的に書けるよう、よく理解をしておいてください。
演算子 | 説明 | サンプル | サンプルでの動き |
< | より小さい | Range(“D” & i) < 25 | 25より小さい(25を含まない)データが処理される |
<= | 以下 | Range(“D” & i) <= 25 | 25以下(25を含む)データが処理される |
> | より大きい | Range(“D” & i) > 25 | 25より大きい(25を含まない)データが処理される |
>= | 以上 | Range(“D” & i) >= 25 | 25以上(25を含む)データが処理される |
= | 等しい | Range(“D” & i) = 25 | 25のデータが処理される |
<> | 等しくない | Range(“D” & i) <> 25 | 25ではないデータが処理される |
なお、=/<>の二つは、文字列でも使用することができます。
※「○○を含む文字列」を条件として使用する
=(イコール)を使って文字列の条件を作ると、完全一致の条件しか作ることができません。
文字列に特定の文字を含む、部分一致の条件を作成する場合は、「Like」と「*(アスタリスク)」を使用して、条件式を記載します。
記載方法は、イコールの部分をLikeに変更し、文字列の内側の指定する文字の両端に*(アスタリスク)を追加します。
※IはForループ内の変数
If Range(“B” & I) Like “*大阪*” Then
Range(“E” & I) = “〇”
End If
このコードで、C2のセルに大阪という文字が含んでいる場合、E2セルに〇が書き込まれます。
なお、”大阪*”と書けば先頭の文字を固定した部分一致、逆に”*大阪”と書けば、終わりの文字を指定した部分一致となります。
Elseを使って、「○○以外」に分岐する
条件を満たしていない時に処理を追加する場合は、Elseを使います。コードとしては次のように書きます。
If 条件式 Then
条件を満たしたときの処理
Else
条件を満たしていないときの処理
End If
Elseは「指定した条件以外」という意味で、後ろに条件式やThenは書きません。
これをサンプルとして、25であれば〇という元々の処理に、「そうでなければ×」という処理を追加してみます。
これをコードとして書くと次のような形になります。
If Range(“D2”)=25 Then
Range(“E2″)=”〇”
Else
Range(“E2″)=”×”
End If
「○○以外」という分岐を加える場合、End IFの中にElseを書く、という書き方のルールは覚えておくようにしましょう。
※If分をループ処理の中に組み込んだサンプル
Sub if_sample()
Dim i As Long
Dim Maxrow As Long
'一番最後の行数を取得
Maxrow = Range("A1").End(xlDown).Row
'データの記載されている2行目~最後の行数までをループ処理
For i = 2 To Maxrow
'もしD列(年齢)のi行目が25だった場合
If Range("D" & i) = 25 Then
'E列(チェック)のi行目に〇を書く
Range("E" & i) = "〇"
'条件を満たしていない時
Else
'E列(チェック)のi行目に×を書く
Range("E" & i) = "×"
End If
Next i
End Sub
Else Ifを使って、別の条件に分岐する
先ほどは「○○以外」でしたが、他の条件を追加したいときに使うのがElseIfです。
If 条件式① Then
条件を満たしたときの処理
ElseIf 条件式② Then
条件②を満たしたときの処理
Else
条件①・②を満たしていない時の処理
End If
ElseIfは条件を新たに追加する為、後ろに条件式とThenを書く必要があります。
ElseIfはいくつでも追加できます。「ElseIf 条件式 Then」を追加することで、いくつでも条件を増やすことができます。
ちなみに条件がいくら増えても、②で紹介したElseは「すべての条件以外」実行される処理になります。
サンプルとして、25歳であれば「〇」、25歳より下なら「△」を、それ以外なら「×」をつける場合のコードを、以下で紹介します。
If Range(“D2”)=25 Then
Range(“E2″)=”〇”
ElseIf Range(“D2”)<25 Then
Range(“E2″)=”△”
Else
Range(“E2″)=”×”
End If
ほかの条件を追加する場合は、「ElseIf 条件 Then」を途中に書く。
この書き方を押さえておきましょう。
※If分をループ処理の中に組み込んだサンプル
Sub if_sample()
Dim i As Long
Dim Maxrow As Long
'一番最後の行数を取得
Maxrow = Range("A1").End(xlDown).Row
'データの記載されている2行目~最後の行数までをループ処理
For i = 2 To Maxrow
'もしD列(年齢)のi行目が25だった場合
If Range("D" & i) = 25 Then
'E列(チェック)のi行目に〇を書く
Range("E" & i) = "〇"
ElseIf Range("D" & i) < 25 Then
Range("E" & i) = "△"
'条件を満たしていない時
Else
Range("E" & i) = "×"
End If
Next i
End Sub
AND/ORを使えば、複合した要素の分岐ができる
ANDやORを使うことで、○○かつ△△といった、複合した要素の条件分岐ができるようになります。
先ほどのIf分をループ処理の中に組み込んだサンプルと合わせて、以下に紹介します。
論理式 | 説明 | サンプル | サンプルでの動き |
AND | ○○かつ△△ (論理積) | If Range("D" & i) = 25 And _ Range("B" & I) Like "*大阪*" Then | 年齢が25歳 住所に大阪が含まれる 両方満たしている時 |
OR | ○○もしくは△△ (論理和) | If Range("D" & i) = 25 Or _ Range("B" & I) Like "*大阪*" Then | 年齢が25歳 住所に大阪が含まれる どちらか満たしている時 |
AndやOrを使うことで、複合した要素や2つの行にまたがる要素を条件として使うことができるようになります。上記サンプルの年齢条件+住所条件のような形で、複雑な条件式を組み込むことが可能になります。
【発展】IFのネスト構造
ANDの条件式は、Ifの中にIfを書くことで同じ動きをさせることができます。
このように、同じ構造のものに同じ構造のものが入っている状態のことを「ネスト構造」と言い、IFのほかにもForループであっても、ネスト構造で表現を行うことができます。
※Andで書く場合(条件:年齢25かつ住所に大阪を含む)If Range("D" & i) = 25 And Range("B" & I) Like "*大阪*" Then
処理
End If
※Ifの中にIfを書くネスト構造で書く場合(条件:年齢25かつ住所に大阪を含む)If Range("D" & i) = 25
Then If Range("B" & I) Like "*大阪*" Then
処理
End If
End If
なおANDで代用できるという意味では、If文のネスト構造は必ずしも必要なものではありません。ANDの方が感覚的に使いやすいため、ネスト構造を全く使わないということも、理屈上は可能です。
ただ、ANDで横に長くなった条件式は、恐ろしく読みにいコードになってしまいます。それは、書いた人にはわかるというレベルではなく、後々デバッグや修正がかなり大変になるほどです。
個人利用の場合はきれいなコードを書く必要はないというのがモットーの当ブログですが、条件式はネスト構造で書くことを推奨します。
さいごに
今回はIf文について、条件分岐という言葉の意味からIfの使い方、その他演算式・ネスト構造まで解説しました。
If文は少しややこしい表現ではありますが、VBAを組むうえで必ず理解しておくべき、重要なコードとなります。
是非意味・コードの書き方をしっかり押さえて、効率的なコードを皆様も作っていってください。
なお、VBAの学習方法として、当ブログではパラシュート式学習法を推奨しています。ぜひとも合わせてご確認ください。
コメント