【VBA初心者向け】条件分岐(If文)の基本を学ぼう!

VBAの組み方

『○○を含んでいるなら…』のような、条件で動作が変わるコードの組み方が分からない
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) < 2525より小さい(25を含まない)データが処理される
<=以下Range(“D” & i) <= 2525以下(25を含む)データが処理される
>より大きいRange(“D” & i) > 2525より大きい(25を含まない)データが処理される
>=以上Range(“D” & i) >= 2525以上(25を含む)データが処理される
=等しいRange(“D” & i) = 2525のデータが処理される
<>等しくないRange(“D” & i) <> 2525ではないデータが処理される

なお、=/<>の二つは、文字列でも使用することができます。

※「○○を含む文字列」を条件として使用する

=(イコール)を使って文字列の条件を作ると、完全一致の条件しか作ることができません。

文字列に特定の文字を含む、部分一致の条件を作成する場合は、「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の学習方法として、当ブログではパラシュート式学習法を推奨しています。ぜひとも合わせてご確認ください。

コメント

タイトルとURLをコピーしました