VBAのIf文を使いこなそう! 条件分岐の基本をスッキリ解説

VBAのIf文について知りたい
条件が複数の場合の記述方法が知りたい
論理演算子(Or・And・Not)の使い方が知りたい

条件によって処理を変えなければならない場合ってよくありますよね。そんなときVBAではIf文を使用します。

しかし、場合によっては複雑な条件を記述する必要がありますので、どのように書けばよいか悩んでしまうこともあるのではないでしょうか?

そこで、この記事ではVBAでのIf文の基本から複数条件の指定方法や論理演算子、比較演算子(等号・不等号)の使い方など、応用的な方法についても解説していきます。

この記事はこんな人のために書きました!

  • VBAでのIf文の書き方・使い方を理解したい
  • 条件が複数の場合の記述方法を理解したい
  • 論理演算子(Or・And・Not)の使い方を理解したい
  • 比較演算子(等号・不等号)の使い方を理解したい
  • もっと応用的な方法についても知っておきたい

If文をマスターすれば、さまざまな条件で処理を分岐することができるので非常に便利です。今回はそんなIf文について、使い方をわかりやすく解説していますので、ぜひご覧になってください。

目次

VBAのIf文とは

If文は、2つの値の大小関係や、等しい・等しくないなどの条件により処理を変える場合によく使われます。

If文は以下のように記述します。

If 条件式 Then
    処理1
Else
    処理2
End If

大小関係や、等しい・等しくないなどの条件式がTrueの場合にThen以降に記述する処理を行います。Falseの場合にはElse以降に記述する処理を行うか、もしくは記述する処理がない場合はIf文のブロック外に出ます。

それではIf文の使い方について、サンプルコードをみながら詳しく解説していきます。

条件が複数の場合(ElseIf)

ElseIf文で複数の条件で処理を分ける場合についてみていきます。記述した条件式に一致しない場合の記述するときは、ElseステートメントもしくはElseIfステートメントを使用します。

ElseIf文の使い方

ElseIf文は以下のように記述します。

If 条件式1 Then
    処理1
ElseIf 条件式2 Then
    処理2
Else
    処理3
End If

それではサンプルコードで使い方を確認しましょう。このサンプルコードでは、4年に一度の「うるう年」かどうかの判定をしています。

Sub macro1()
    Dim year As Integer, str As String
    
    'うるう年の場合
    year = 2016
    
    '結果表示の処理
    If year Mod 4 = 0 Then
        str = str & year & "年はうるう年です!" & vbCrLf
    Else
        str = str & year & "年はうるう年ではありません!" & vbCrLf
    End If
    
    'うるう年でない場合
    year = 2017
    
    '結果表示の処理
    If year Mod 4 = 0 Then
        str = str & year & "年はうるう年です!" & vbCrLf
    ElseIf year Mod 4 <> 0 Then
        str = str & year & "年はうるう年ではありません!" & vbCrLf
    Else
        '何もしない
    End If
    
    MsgBox str, vbInformation
End Sub

実行結果:
if_elseif

このサンプルコードでは、西暦年数が4で割り切れる場合は「うるう年です」と、それ以外の場合は「うるう年ではありません」と表示します。なお、ElseIfステートメントとElseステートメントを記述したあとで「何もしない」とコメントアウトだけ記述し、処理を記述していない部分があります。

これでも問題になることはありません。

処理が1行の場合の記述の省略

If文の処理が1行の場合、If文と処理を1行にまとめて記述することができます。ただし、1行にまとめられるのはElseIf-Thenステートメントのあとの処理部分だけです。

次のようにしてIf文と処理を1行にまとめます。

If False Then
ElseIf 条件式1 Then 処理1
Else: 処理2
End If

If文の最初の条件と処理を1行にまとめるとエラーになり、またElseステートメントのあとの処理もエラーとなります。

Elseステートメントの後の処理はElseステートメントの後に「:」(コロン)で、複数行を1行にまとめることができます。

サンプルコードで確認しましょう。

Sub macro2()
    Dim year As Integer, str As String
    
    'うるう年の場合
    year = 2016
    
    '結果表示の処理
    If year Mod 4 = 0 Then
        str = str & year & "年はうるう年です!" & vbCrLf
    Else: str = str & year & "年はうるう年ではありません!" & vbCrLf
    End If
    
    'うるう年でない場合
    year = 2017
    
    '結果表示の処理
    If Flse Then
    ElseIf year Mod 4 = 0 Then str = str & year & "年はうるう年です!" & vbCrLf
    Else: str = str & year & "年はうるう年ではありません!" & vbCrLf
    End If
    
    MsgBox str, vbInformation
End Sub

実行結果:
if_elseif

このサンプルコードではまず「:」(コロン)を使ってElseステートのあとの処理を1行にまとめています。

次にうるう年でない場合では、If文の最初の条件を1行にまとめるために、わざと最初の条件をFalseにして1行にまとめて、ElseIfステートメントで条件を入力しています。

If文の入れ子(ネスト)の使い方

If文の条件の中で、さらに条件を追加したい場合ってありますよね。これをif文の入れ子(ネスト)と言います。

先ほどの例を変更します。「うるう年」といえば夏季オリンピックの開催年ですよね。そしてオリンピックは冬季も開催されます。以下のサンプルコードでは、西暦年数でオリンピックの開催年かどうかの判断を追加しています。

Sub macro3()
    Dim year As Integer, str As String
    
    'うるう年の場合
    year = 2016
    
    '結果表示の処理
    If year Mod 4 = 0 Then
        str = str & year & "年はうるう年で、夏季オリンピック開催年です!" & vbCrLf
    Else
        If year Mod 4 = 2 Then
            str = str & year & "年はうるう年ではありませんが、冬季オリンピックの開催年です!" & vbCrLf
        Else
            str = str & year & "年はうるう年ではありませし、オリンピックも開催されません!" & vbCrLf
        End If
    End If
    
    'うるう年でなく、オリンピック開催年でもない場合
    year = 2017
    
    '結果表示の処理
    If year Mod 4 = 0 Then
        str = str & year & "年はうるう年で、夏季オリンピック開催年です!" & vbCrLf
    Else
        If year Mod 4 = 2 Then
            str = str & year & "年はうるう年ではありませんが、冬季オリンピックの開催年です!" & vbCrLf
        Else
            str = str & year & "年はうるう年ではありませし、オリンピックも開催されません!" & vbCrLf
        End If
    End If
    
    'うるう年ではないが、オリンピック開催年の場合
    year = 2018
    
    '結果表示の処理
    If year Mod 4 = 0 Then
        str = str & year & "年はうるう年で、夏季オリンピック開催年です!" & vbCrLf
    Else
        If year Mod 4 = 2 Then
            str = str & year & "年はうるう年ではありませんが、冬季オリンピックの開催年です!" & vbCrLf
        Else
            str = str & year & "年はうるう年ではありませし、オリンピックも開催されません!" & vbCrLf
        End If
    End If
    
    MsgBox str, vbInformation
End Sub

実行結果:
if_elseifネスト

このサンプルコードでは、ElseステートメントのあとにIf-Elseステートメントを記述し、入れ子になっています。

論理演算子(Or・And・Not)

If文の条件式が2つ以上ある場合について、みていきましょう。

条件式が2つ以上ある場合は、「Or」や「And」といった論理演算子を使います。論理演算子には、次のようなモノがあります。

論理演算子書き方例説明
OrA Or BAもしくはBのどちらか一方がTrueであれば、Trueの値を返す。
A、BどちらともFalseの場合のみ、Falseの値を返す。
AndA And BA、BどちらともTrueの場合のみ、Trueの値を返す。
AもしくはBのどちらか一方がFalseであれば、Falseの値を返す。
NotNot AAがTrueの場合Falseの値を返す。
Falseの場合Trueの値を返す。

それでは、実際の使い方をサンプルコードでみていきましょう。

Sub macro4()
    Dim year As Integer, str As String
    
    'うるう年の場合
    year = 2016
    
    '結果表示の処理
    If year Mod 4 = 0 Or year Mod 4 = 2 Then
        '「OR」の例
        str = str & year & "年は夏季もしくは冬季のオリンピック開催年です!" & vbCrLf
    ElseIf Not year Mod 4 = 0 And Not year Mod 4 = 2 Then
        '「NOT」と「AND」の例
        str = str & year & "年はオリンピック開催年ではありません!" & vbCrLf
    End If
    
    'うるう年でない場合
    year = 2017
    
    '結果表示の処理
    If year Mod 4 = 0 Or year Mod 4 = 2 Then
        '「OR」の例
        str = str & year & "年は夏季もしくは冬季のオリンピック開催年です!" & vbCrLf
    ElseIf Not year Mod 4 = 0 And Not year Mod 4 = 2 Then
        '「NOT」と「AND」の例
        str = str & year & "年はオリンピック開催年ではありません!" & vbCrLf
    End If
    
    MsgBox str, vbInformation
End Sub

実行結果:
if_elseif_andor

このサンプルコードでは、まず西暦年数が4で割り切れるか、もしくは余りが2の場合にオリンピック開催年かどうか判断しています。Or演算子を使って2つの条件のどちらか一方を満たすか「OR」の判定を行っています。

次にオリンピック開催年でない場合の判断をするために、Not演算子を使って西暦年数が4で割り切れない、余りが2でないという「NOT」の判定を行っています。

さらにAnd演算子を使って2つの条件を共に満たすか「AND」の判定を行っています。

比較演算子(等号・不等号)

比較演算子は2つの値を比較します。比較とは、どちらの値が大きいか小さいか、等しいか等しくないか、など二者を比べることです。

比較演算子の例をまとめました。

書き方例説明
不等号val1 < val2va1はval2より小さい
val1 <= val2val1はval2以下
val1 > val2val1はval2より大きい
val1 >= val2val1はval2以上
等号val1 = val2val1はval2と等しい
val1 <> val2val1はval2と等しくない

比較が正しければTrueを返し、間違っていればFalseを返します。

数値を比較する場合

等号・不等号について、サンプルコードをみていきましょう。

オリンピックではスケートやサッカーのように競技連盟のルールにより、出場に年齢制限があります。それを例として、みていきます。なお、等号のサンプルについては、前述のオリンピック開催年かどうかの判定を参考にしてくださいね。

Sub macro5()
    Dim age As Integer, limitLow As Integer, limitHigh As Integer, str As String
    
    'スケートの年齢制限は15歳以上
    limitLow = 15
    'サッカーの年齢制限は23歳以下
    limitHigh = 23
    
    '14歳の場合
    age = 14
    
    If age < limitLow Then
        str = str & age & "歳ではスケートは出場できません" & vbCrLf
    End If
    
    '15歳の場合
    age = 15
    
    If age >= limitLow Then
        str = str & age & "歳ではスケートは出場できます" & vbCrLf
    End If
    
    
    '23歳の場合
    age = 23
    
    If age <= limitHigh Then
        str = str & age & "歳ではサッカーは出場できます" & vbCrLf
    End If
    
    '24歳の場合
    age = 24
    
    If age > limitHigh Then
        str = str & age & "歳ではサッカーは出場できません" & vbCrLf
    End If
    
    MsgBox str, vbInformation
End Sub

実行結果:
if_elseif_出場

文字列を比較する場合

文字列も等号を使って比較することができます。文字列の値が同じかどうか比較するには「=」記号を使い、違うかどうか比較するには「」記号を使います。

サンプルコードで確認しましょう。

Sub macro6()
    Dim strA As String, strB As String, strMsg As String
    strA = "Hello VBA!"
    strB = "Hello vba!"
    
    If strA = strB Then
        strMsg = "同じ文字列です!"
    Else
        strMsg = "違う文字列です!"
    End If
    
    MsgBox strMsg, vbInformation
End Sub

実行結果:
if_elseif_文字列

このサンプルコードではString型の変数strAとstrBを「=」記号で比較しています。大文字と小文字を区別し、同じでないためFalseを返していることがわかります。

GoToでIf文の処理を別で記述する

If文はGoToステートメントと合わせて使われることも多いです。

以下のように記述します。

If 条件式 Then
    GoTo ラベル名
End If

ラベル名:
    処理

条件式を満足する場合にラベル名で記述された処理までジャンプします。その場合、End Ifステートメント以降からジャンプ先のラベル名との間に記述された処理は実行されませんので注意しましょう。

GoToステートメントの使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。

If Likeで文字列パターンの条件分岐

If文はLike演算子と一緒に使われる場合もあります。Like演算子は2つの文字列を比較するために使用します。

以下のように記述します。

If string Like pattern Then
    処理
End If

引数stringがpatternに一致する場合に処理が実行されます。patternにはパターンマッチング規則に準拠する文字列を指定することができます。

ワイルドカード文字や文字のリスト、文字の範囲を組み合わせて正規表現に近いパターンマッチングを行うことができます。

If Likeステートメントの使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。

VBAの将来性

VBAのスキルを学んで業務を効率化したい

このように思っている人は多いでしょう。

VBAの用途はさまざまで、

  • VBAのスキルがあれば転職できるのでは?
  • 業務効率化のスキルは需要が高そうだから

などが上げられます。確かに、業務効率化はどこの企業も目指していて、需要が高いように見えます。ただ、VBAを扱えることが強みになるかといわれると、すこし疑問があります。

VBAは基本的にエクセル上でしか使用することができません。しかし、最近では社内書式をスプレッドシートで管理している企業も増えており、今後エクセル自体の需要が少なくなってしまう可能性も考えられます。

そうなってしまうと、VBAを習得しても活躍の場が限られてしまいますよね。そう考えると将来的にVBAの需要はあまり高くないといえます。

ではVBAを学んでいる人はどうすればいいのでしょう。VBAの将来性や今後の対策などをこちらの記事でまとめているのでぜひご確認ください。

VBAの将来性

VBAのスキルを学んで業務を効率化したい

このように思っている人は多いでしょう。

VBAの用途はさまざまで、

  • VBAのスキルがあれば転職できるのでは?
  • 業務効率化のスキルは需要が高そうだから

などが上げられます。確かに、業務効率化はどこの企業も目指していて、需要が高いように見えます。ただ、VBAを扱えることが強みになるかといわれると、すこし疑問があります。

VBAは基本的にエクセル上でしか使用することができません。しかし、最近では社内書式をスプレッドシートで管理している企業も増えており、今後エクセル自体の需要が少なくなってしまう可能性も考えられます。

そうなってしまうと、VBAを習得しても活躍の場が限られてしまいますよね。そう考えると将来的にVBAの需要はあまり高くないといえます。

ではVBAを学んでいる人はどうすればいいのでしょう。VBAの将来性や今後の対策などをこちらの記事でまとめているのでぜひご確認ください。

まとめ

ここでは、If文・If-Then-Else文の使い方、論理演算子の使い方、比較演算子の使い方などについて説明しました。条件分けが必要な複雑な処理をするためには、If文を頻繁に使うことになるでしょう。

そんなときに条件や判定が複雑になりどのように記述してよいか、わからなくなる場合もあるかもしれません。そんな場合はこの記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次