Excelのデータを扱う際、条件によって処理内容を変えたいことはよくあると思います。そんな時に使用するのがIf文です。
VBAに限らずプログラミングを行う上では必須とも言えるIf文ですが、慣れないうちはどう使えばいいのか分からないことも多いかもしれません。
そこで、今回の記事ではVBAでIf文を使う方法について詳しく解説していきたいと思います。
VBAでのIf文はどう書く?
まず、If文とは「もし⚪︎⚪︎なら〜〜する」といったように、プログラムの中で指定した条件に応じて処理内容を変更する条件分岐に使用する基本的な文法です。VBAではIfステートメントとして実装されています。
VBAでIf文を使う場合は、以下のようにIfステートメントと条件式、処理内容を記述します。
【基本構文】
If 条件式 Then
処理内容
End If
条件式に指定した要件を満たすと条件式の判定はTrue(真)となり、ThenとEnd Ifの間に記述した処理内容を実行します。それ以外の場合はFalse(偽)と判定され、処理内容は実行されません。
分岐する条件が複数ある場合はどうする?
条件分岐をする際、指定したい条件が1つだけとは限りません。
複数の条件ごとに処理を分ける場合は、Elseステートメント、もしくはElseIfステートメントを使用します。
具体的な使い方について、サンプルコードを交えながら見ていきましょう。
VBAのElseIf文の使い方
If文のなかでElseステートメントやElseIfステートメントを使う場合は、次のように記述します。
【基本構文】
If 条件式1 Then
処理1
ElseIf 条件式2 Then
処理2
Else
処理3
End If
ElseIfステートメントは2つ目以降の分岐条件を指定する際に使用し、Elseステートメントはいずれの条件にも当てはまらなかった場合の処理を指定したい時に使用します。
条件を複数指定した場合、判定は上から順に行われ、1番最初に当てはまった条件の処理のみを実行します。
それでは、サンプルコードで実際の使い方を確認してみましょう。
【サンプルコード】
Sub sampleIf()
Dim mathScore As Integer, scienceScore As Integer
mathScore = 70
scienceScore = 25
'数学の点数が30点未満の場合
If mathScore < 30 Then
MsgBox "数学が赤点です"
'理科の点数が30点未満の場合
ElseIf scienceScore < 30 Then
MsgBox "理科が赤点です"
'それ以外
Else
MsgBox "赤点の科目はありません"
End If
End Sub
【実行結果】
ここでは科目ごとの点数を比較して、指定した数値を下回る場合に特定のメッセージを表示しています。
1行だけの処理の改行を省略してVBAを記述する
処理内容が1行のみで済む場合、以下のコードのように、条件式と処理内容をまとめて同じ行に記述することができます。
【記述例】
If 条件式 Then 処理内容
また、Elseステートメントも同様にまとめることができます。
If 条件式 Then 処理1 Else 処理2
ただし、ElseIfステートメントを使用する場合は、上記のように全てを1行でまとめることはできません。
代わりに、ElseIf以降の条件ごとの処理について、それぞれ1行で記述することはできます。
【記述例】
If 条件式1 Then
処理1
ElseIf 条件式1 Then 処理2
Else: 処理3
End If
上記のように記述する際は、Elseステートメントの後に「:」(コロン)を付ける必要があります。
先ほどのサンプルコードのIf文を、この書き方に従って記述すると以下のようになります。
【サンプルコード】
If mathScore < 30 Then
MsgBox "数学が赤点です"
ElseIf scienceScore < 30 Then MsgBox "理科が赤点です"
Else: MsgBox "赤点の科目はありません"
End If
どの書き方が見やすいと感じるかは状況や人それぞれですが、必要に応じて使い分けるとコードがより管理しやすくなるでしょう。
VBAのIf文の中でさらに条件分岐を追加する
If文の中でさらにIf文を使用することもできます。こうした状態を入れ子(ネスト)と言います。
ネストの重ねすぎはコードの見づらさに繋がるので注意が必要ですが、特定の条件下だけでさらに分岐を行いたい場合などに使える便利な方法です。
この方法を使って、先ほどのサンプルコードに新たな条件を追加してみましょう。
先ほどのコードでは、2科目とも赤点だった場合に適切なメッセージが表示されないので、If文を追加して対応できるようにします。
【サンプルコード】
Sub sampleIf2()
Dim mathScore As Integer, scienceScore As Integer
mathScore = 20
scienceScore = 25
If mathScore < 30 Then
If scienceScore < 30 Then
MsgBox "数学と理科の両方が赤点です"
Else
MsgBox "数学が赤点です"
End If
ElseIf scienceScore < 30 Then
MsgBox "理科が赤点です"
Else
MsgBox "赤点の科目はありません"
End If
End Sub
【実行結果】
上記の例では、数学の点数が赤点だった際にIf文でさらに理科の点数と比較をすることで、該当するものが数学だけなのか否かが判断できるようになりました。
先ほども述べたように、コードの見やすさという観点から基本的には入れ子にならないよう記述するのがベストですが、中にはこの方法でしか条件を上手く拾えない場合もあるので、方法の1つとして覚えておくと良いでしょう。
VBAの論理演算子(Or, And, Not)の使い方を解説
If文では、1つの条件式の中に複数の条件を指定することができます。その際、論理演算子というものを使用して式を記述する必要があります。
論理演算子の種類は、主に以下の3つがあります。
論理演算子 | 使用例 | 説明 |
---|---|---|
And | A And B | AとBの両方に条件が当てはまる時のみTrue判定になります。 どちらか片方、もしくは両方の条件が当てはまらない場合はFalseとなります。 |
Or | A Or B | AかBのどちらかが条件が当てはまる場合、True判定になります。 両方とも条件に当てはまらない場合はFalseとなります。 |
Not | Not A | 条件Aに当てはまらなかった場合にTrue判定となります。 反対に、条件に当てはまる場合はFalseとなります。 |
実際の使い方について、サンプルコードで見てみましょう。
【サンプルコード】
Sub sampleIf3()
Dim mathScore As Integer, scienceScore As Integer
mathScore = 70
scienceScore = 25
'数学の点数が30点未満、かつ理科の点数が30点未満の場合
If mathScore < 30 And scienceScore < 30 Then
MsgBox "赤点の科目が2科目あります"
'数学の点数が30点未満か、もしくは理科の点数が30点以上ではない場合
ElseIf mathScore < 30 Or Not scienceScore >= 30 Then
MsgBox "赤点の科目が1科目あります"
'それ以外
Else
MsgBox "赤点の科目はありません"
End If
End Sub
【実行結果】
1つ目の条件では、And演算子を使うことで「数学と理科の両方が赤点かどうか」を判断しています。
2つ目の条件では、Or演算子を使って「数学か理科のどちらかが赤点かどうか」を判断しています。
その際、理科の点数判断を30点未満かどうかではなく、30点以上かどうかで判断していますが、Not演算子が付いているので、Falseの判定が反転しTrue扱いとなっています。
VBAの比較演算子の使い方を解説
If文で使う演算子の種類には、論理演算子の他に比較演算子というものも存在します。これまでのサンプルコードで、数値を比較する際に使っていた記号のことです。
この演算子を使用することで、値の大小の比較や、等値か否かの判断などをすることができます。
比較演算子の種類は、主に以下の通りです。
比較演算子 | 使用例 | 説明 |
---|---|---|
= | A = B | AとBは等しい |
<> | A <> B | AとBは等しくない |
> | A > B | AはBより大きい |
< | A < B | AはBより小さい |
>= | A >= B | AはB以上 |
<= | A <= B | AはB以下 |
それでは、比較演算子の実際の使い方について見ていきましょう。
VBAで数値を比較する場合はどうする?
まずは、比較演算子を使って数値の比較をしてみましょう。
今度は、科目ごとの点数を足した総合点を基準とし、指定した数値より上か下かを判断します。
【サンプルコード】
Sub sampleIf4()
Dim totalScoreA As Integer, totalScoreB As Integer, totalScoreC As Integer
Dim str As String
'Aさんの総合点
totalScoreA = 370
'Bさんの総合点
totalScoreB = 320
'Cさんの総合点
totalScoreC = 350
'Aさんの総合点が350点より大きいか否か
If totalScoreA > 350 Then
str = str & "Aさんの総合点は350点より上です。" & vbCrLf
End If
'Bさんの総合点が350点より小さい否か
If totalScoreB < 350 Then
str = str & "Bさんの総合点は350点より下です。" & vbCrLf
End If
'Cさんの総合点が350点以上か
If totalScoreC >= 350 Then
'350点ちょうどか否か
If totalScoreC = 350 Then
str = str & "Cさんの総合点は350点ちょうどです。" & vbCrLf
Else
str = str & "Cさんの総合点は350点以上です。" & vbCrLf
End If
End If
MsgBox str
End Sub
【実行結果】
VBAで文字列を比較する場合はどうする?
文字列を比較する場合にも、同様に比較演算子を使用することができます。
文字列の値を比べる場合は、「=」記号を使用して同じ文字列かどうかを判断します。
サンプルコードで確認してみましょう。
【サンプルコード】
Sub sample5()
Dim strA As String, strB As String, msg As String
strA = "文字を比較しています!"
strB = "文字を比較しています!"
If strA = strB Then
msg = msg & "同じ文字列です" & vbCrLf
Else
msg = msg & "違う文字列です" & vbCrLf
End If
strA = "This is VBA"
strB = "This is vba"
If strA = strB Then
msg = msg & "同じ文字列です" & vbCrLf
Else
msg = msg & "違う文字列です" & vbCrLf
End If
MsgBox msg
End Sub
【実行結果】
strAとstrBを「=」記号で比較し、同じ文字列かどうかを判定しています。
大文字と小文字が区別されるため、1度目と2度目でそれぞれ結果が異なっています。
GotoステートメントでIf文の処理を分けて記述する
If文では、GoToステートメントを使用して処理を分けるケースもあります。
以下のように記述すると、条件を満たした際に指定のラベル名へと処理がジャンプします。
【基本構文】
If 条件式 Then
GoTo ラベル名
End If
ラベル名:
処理
GoToステートメントを使用した場合、ラベル先へと処理がジャンプすると、End Ifステートメント以降に記述した処理が実行されなくなるので注意が必要です。
実際のサンプルコードを見てみましょう。
【サンプルコード】
Sub sampleIfGoTo()
Dim totalScore As Integer
totalScore = 360
If totalScore > 300 Then
GoTo successLbl
End If
MsgBox "残念、不合格です"
successLbl:
MsgBox "おめでとうございます、合格です!"
End Sub
【実行結果】
このサンプルコードを実行した場合、End Ifステートメントの下に記述されたメッセージは表示されません。
If文の条件を満たしているため、ラベル先に記述したメッセージだけが表示されます。
VBAのIf Likeで文字列パターンの条件分岐をする
演算子の中には、ワイルドカードを使用して文字列の比較を行うLike演算子というものがあります。
「=」記号で文字列の比較を行った場合、完全一致したケースのみがTrueと判断されますが、Like演算子を使用することで部分一致での比較が可能になります。
Like演算子で使用するワイルドカードには、以下のような種類があります。
パターン | 説明 |
---|---|
? | 任意の1文字 |
* | 0文字以上の任意の文字 |
# | 任意の1桁の数字 |
[charlist] | charlistに指定した文字の中の任意の1文字 |
[!charlist] | charlistに指定していない任意の1文字 |
なお、Like演算子を使用する際は次のように記述します。
【基本構文】
If string Like pattern Then
処理
End If
patternの部分に指定した条件と文字列の一部が一致した場合、Trueと判定され処理が実行されます。
具体例について、以下のサンプルコードで見てみましょう。
【サンプルコード】
Sub sampleIfLike()
Dim str As String
str = "私は今、東京にいます"
If str Like "*東京*" Then
MsgBox str
End If
End Sub
【実行結果】
ワイルドカードは、「この部分には任意の文字が入りますよ」という意味で使います。
例えば、「⚪︎⚪︎県」という形式に当てはまる文字列かを判定したい時は、「*県」と記述することで条件指定することができます。「*」は文字の種類や数に関係なく使うことができるので、使う機会も多いかと思います。
上のサンプルコードの場合、「東京」という文字列が含まれているかどうかを条件に指定していますが、その文字が必ず文字列の先頭や最後尾に付くとは限らないため、「*」で文字の前後を挟んで指定しています。
まとめ
いかがでしたでしょうか?ここでは、VBAでIf文を使う方法について解説をしてきました。
様々な演算子との組み合わせで指定できる条件の幅がかなり広がるIf文ですが、使い方に慣れるまでは少々複雑に感じてしまうかもしれません。
いきなり全てを覚えるのは難しいかと思いますので、ぜひこの記事を参考にしながら繰り返し練習してみてくださいね!
関連記事
- VBAとは
- Excelで覚えておくべき17の基本関数と目的別逆引き一覧
- オートフィルターの設定・解除方法
- メッセージボックスの設定方法
- セルの値を取得・上書きするValueプロパティの使い方を解説
- 【Excel VBA】Functionの使い方を解説(宣言・引数、戻り値の指定、応用法)
- 【VBA入門】配列まとめ(宣言・初期化、反復処理、コピー、結合)
VBAの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。