条件が複数の場合の記述方法が知りたい
論理演算子(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
実行結果:
このサンプルコードでは、西暦年数が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
実行結果:
このサンプルコードではまず「:」(コロン)を使って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
実行結果:
このサンプルコードでは、ElseステートメントのあとにIf-Elseステートメントを記述し、入れ子になっています。
論理演算子(Or・And・Not)
If文の条件式が2つ以上ある場合について、みていきましょう。
条件式が2つ以上ある場合は、「Or」や「And」といった論理演算子を使います。論理演算子には、次のようなモノがあります。
論理演算子 | 書き方例 | 説明 |
---|---|---|
Or | A Or B | AもしくはBのどちらか一方がTrueであれば、Trueの値を返す。 A、BどちらともFalseの場合のみ、Falseの値を返す。 |
And | A And B | A、BどちらともTrueの場合のみ、Trueの値を返す。 AもしくはBのどちらか一方がFalseであれば、Falseの値を返す。 |
Not | Not A | Aが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
実行結果:
このサンプルコードでは、まず西暦年数が4で割り切れるか、もしくは余りが2の場合にオリンピック開催年かどうか判断しています。Or演算子を使って2つの条件のどちらか一方を満たすか「OR」の判定を行っています。
次にオリンピック開催年でない場合の判断をするために、Not演算子を使って西暦年数が4で割り切れない、余りが2でないという「NOT」の判定を行っています。
さらにAnd演算子を使って2つの条件を共に満たすか「AND」の判定を行っています。
比較演算子(等号・不等号)
比較演算子は2つの値を比較します。比較とは、どちらの値が大きいか小さいか、等しいか等しくないか、など二者を比べることです。
比較演算子の例をまとめました。
書き方例 | 説明 | |
---|---|---|
不等号 | val1 < val2 | va1はval2より小さい |
val1 <= val2 | val1はval2以下 | |
val1 > val2 | val1はval2より大きい | |
val1 >= val2 | val1はval2以上 | |
等号 | val1 = val2 | val1はval2と等しい |
val1 <> val2 | val1は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
実行結果:
文字列を比較する場合
文字列も等号を使って比較することができます。文字列の値が同じかどうか比較するには「=」記号を使い、違うかどうか比較するには「」記号を使います。
サンプルコードで確認しましょう。
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
実行結果:
このサンプルコードでは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の将来性や今後の対策などをこちらの記事でまとめているのでぜひご確認ください。
まとめ
ここでは、If文・If-Then-Else文の使い方、論理演算子の使い方、比較演算子の使い方などについて説明しました。条件分けが必要な複雑な処理をするためには、If文を頻繁に使うことになるでしょう。
そんなときに条件や判定が複雑になりどのように記述してよいか、わからなくなる場合もあるかもしれません。そんな場合はこの記事を何度も参考にして下さいね!