マクロの条件分岐の書き方&テンプレートを紹介
プログラミングでは基本となる構文 「条件分岐」。VBA初心者であれば是非とも理解しておきたい機能です。
しかしマクロの記録では生成されない機能であることや1行で書けるコードではない為分かりにくい様です。
加えて実務に落とし込む際に難しいと感じる要素として上位に挙げられる事が多いです。
この情報に対して裏付けとなるデータを紹介します。
私100人以上の方々とVBAについて会話をしてきました。
皆様がどんなところを難しいと思っていたのかある程度傾向を取る様にしています。
データを見ると「実務に落とし込む際難しいと感じている機能」に傾向がありました。
繰り返し処理と並んで条件分岐を挙げる方が多かったです。
条件分岐については半数以上の皆様が難しいと感じている様です。
条件分岐を理解できた4割の人の話を聞くとワークシート関数のIF文が分かる人が多かったです。
繰り返し処理は関数は無いです。ここが繰り返し処理よりは難しいと感じる人が少なかった点ではないかと推測しています。
僅差ではありますが「繰り返し処理」より「条件分岐」の方が理解し易いというデータがでました。
よって本記事では理解できる可能性が高い条件分岐から先に勉強していく事にします。
条件分岐が理解できたら繰り返し処理の勉強も出来る様に関連記事も用意していますのでこのまま記事をご覧ください。
この記事でわかる事
まずは条件分岐がどんなものなのか理解する事が出来る様になります。
大きく分けて4種類の条件分岐を紹介します。エラーを出さない様全て丁寧に解説します。
- 4種類の条件分岐の使い方が分かる
- 条件分岐と繰り返し処理を合わせて勉強できる
条件分岐が分かる様に
なりますEnjoy Excel
加えて条件分岐の種類毎に繰り返し処理のFor~Nextステートメントとコラボした記事を用意しました。
関連記事の中では条件分岐と繰り返し処理を一緒に使ったコードの解説をします。
この記事含め関連記事を読むとご自身の仕事をマクロに置き換える事が出来るようになります。
参考:ファイル、フォルダの扱いは別記事にします
ファイル、フォルダの取り回しについて負担に感じている人が少し少ない気がしました。
数名の方に聞いてみると初心者の皆様では未だ難しいと感じるに至ってない傾向がありました。
ファイルやフォルダとの連携は中級者様が取り組む内容です。まだ勉強していませんという意見が多かったです。
ファイル、フォルダの取り回しは少々難しいので別途記事を用意します。
関連記事VBAで転記|ブック間で文字列をコピペするマクロの作り方を教えます
関連記事
条件分岐とMsgBox(メッセージボックス)を一緒に使用しています。
良く読まれている記事ですVBA-11マクロ内でMsgBoxとIFステートメントを組み合わせる
条件分岐とは
そもそも「条件分岐とは何か」を説明します。
私が調べものをする時に使っている本では条件分岐は以下の様に書かれています。
特定の条件が成立している時だけ処理を実行させたい、または特定の条件に応じて異なる処理を実行させたいといったことがあります。これを条件分岐、または分岐といいます。
パーフェクトVBA 97ページ 高橋宣成 著 技術評論社
基本的に書かれたコードは1本の通り道を最初から最後まで走り切ります。
その中で条件によって処理を分けたい時があります。
そこで分岐を作る機能を一般的に条件分岐と呼んでいます。
メリット
条件分岐を使うという事は内容により処理を分けたいという事です。
よってコードの量が増えて複雑になることが想定されるのですが条件分岐はその問題を解決してくれます。
分岐構造の型(ステートメント)を使うことでコードが少なくなります。
可読性が上がる、ミスが減る、メンテナンス性が上がる等良い事ばかりです。
デメリット
最初の頃は条件分岐をコードに組み込む事自体がストレスになります。
単純に使いにくいというのがデメリットです。
しかしここをクリアしないと実務をマクロ化するのは難しいです。
デメリットは乗り越えるとメリットに変わります。ここで勉強してメリットに変えてしまいましょう。
4種類の条件分岐
以下4種類です。順番に紹介していきます。
- If~Then
- 一定条件のもと処理を分ける
- Select~Case
- 一定条件に対して複数の回答を用意する
- If~ElseIf
- 一定条件に合致しない時は別の条件を提示する
- Ifのネスト
- 条件を組み合わせる事で多様な選択肢に対応する
各分岐の解説で使用するデータについて
4つの事例を紹介する為に中小企業庁が作成している中小企業白書からデータを借ります。
2022年度版の白書の中から開業率についてのデータを利用させていただきます。
具体的な数値は使いません。開業率が高い都道府県を書き出しただけです。
開業率の説明やその他詳細については引用元を掲載しておきます。
開業率は、当該年度に雇用関係が新規に成立した事業所数/前年度末の適用事業所数である。
2022年版中小企業白書 I-32ページ
今回は開業率が高かった都道府県TOP10を使わせていただきます。
D列の各都道府県の末尾を確認し条件と一致したらE列に末尾と同じ文字を書き出すという作業をします。
今回の記事では4つの条件分岐について解説します。どの条件分岐もセルE5に値を入れる為のコードを紹介しています。
加えて各分岐に用意した記事ではFor~Nextステートメントを使い全都道府県の末尾を入力するコードを紹介しています。
1_If~Thenステートメント
条件分岐の中でも基本となる型(ステートメント)です。
構文
If~Thenステートメントの構文です。
If 条件 Then
条件Trueの処理
Else
条件Falseの処理
End If
IfとThenの間に用意される「条件」が起点になります。
ここで提示された条件とセルの情報が合致している時はThenとElseの間に書かれたコードが実行されます。
これは「条件Trueの処理」という事になります。
代わって提示された条件とセルの情報が合致しない時はElseとEnd Ifの間に書かれたコードが実行されます。
これは「条件Falseの処理」という事になります。
End If で締めましょう
最後に「End If」を書き忘れない様にしてください。
上からコードを書いていると条件を書いて分岐先の式を書くと安心して「End If」を忘れがちです。
使い方
ワークシートとコードを紹介します。
ではD5セルの文字列の末尾が「県」だったらセルE5に「県」という文字を入力するコードを紹介します。
Range(“E5”) = Right(Range(“D5”), 1) というコードでセルE5には「県」という文字が入ります。
Sub 条件分岐1()
If Right(Range("D5"), 1) = "県" Then
Range("E5") = "県"
Else
Range("E5") = ""
End If
End Sub
解説
結論から申し上げますとプログラムが正常に終了するとセルE5には「県」という文字が入力されます。
2行目でセルD5に入力されている「沖縄県」の最後の文字は「県」ですか?とたずねています。
「沖縄県」という文字列の最後の文字は「県」です。
よって条件としてはTrueの処理にあたる Range(“E5”) = “県” が実行されることになります。
その後は8行目のEnd Ifに進みます。5行目のElse句で用意されたコードを実行する事はありません。
「県」以外であった時はFalseの処理が実行されるのでセルE5は空欄という事になります。
5行目のElse句を通過後6行目のコードが実行されます。その後8行目のEnd Ifに進みます。
課題
この方法だと条件の分岐先は2通りしか提示出来ません。
都道府県の末尾1文字を扱うという事であれば最低4つの分岐が必要です。
入力ミスなどりより4つ以外の文字である可能性もあります。
関連記事
2通り以外の分岐先を用意するコードを用意しています。
For~Nextステートメントを使って複数のセルに条件分岐の結果を記入するためのコードを用意しました。
2_Select Caseステートメント
1つの条件に対して複数の回答を用意したい時に有効なコードを紹介します。
今回の都道府県の事例の様に条件は1つで回答を複数用意したい時に使う事になります。
構文
Select Caseステートメントの構文です。
Select Case 条件
Case 条件の回答A
条件が回答Aに合致した時の処理
Case 条件の回答B
条件が回答Bに合致した時の処理
Case 条件の回答C
条件が回答Cに合致した時の処理
Case 条件の回答D
条件が回答Dに合致した時の処理
・・・・・
End Select
SelectCaseはコードの実行方法にポイントがあります。
用意した全てのコードを実行する事はありません。
条件と合致し回答があればそこまでは処理を行いすぐにEnd Selectに移動し次のコードに進んでいきます。
End Select で締めましょう
通常のIfステートメント同様「End Select」が足りないとエラーメッセージが出てしまいます。
コンパイルエラーの原因はコードの間違いです。
コードを書き間違えている、何か足りない等本来のコードを形成出来てないというエラーです。
エラーメッセージだけでは分からないことが多いのですがこのエラーは分かり易いですね。
End Selectが無いと言っているので書き足してあげましょう。
使い方
ワークシートとコードを紹介します。
Sub 条件分岐2()
Select Case Right(Range("D5"), 1)
Case "都"
Range("E5") = "都"
Case "道"
Range("E5") = "道"
Case "府"
Range("E5") = "府"
Case "県"
Range("E5") = "県"
Case Else
Range("E5") = ""
End Select
End Sub
解説
セルE5には「県」という文字が入力されます。2行目のコードで条件を設定しています。
ここでは「セルD5の最後の文字」という条件を設定します。
3行目以降でセルD5の最後の文字に対して選択肢が用意されています。
合致するところに書いてるコードが実行される事になります。
ここでは15行目のCase句と条件が合致するので17行目のコードが実行されることになります。
用意された条件に一致しない時は19行目のCaseElse句で回収されます。
今回はD5セルの末尾の文字が都道府県以外であった時はセルE5には空欄が用意されます。
課題
Select Caseステートメントは1つの条件に対して複数の選択肢を用意するには非常に有効なコードです。
しかし条件自体を複数用意したい時には向かないコードです。
関連記事
Select CaseステートメントとFor~Nextステートメントを使っています。
複数のセルに条件分岐の結果を記入するためのコードを用意しました。
3_If~ElseIfステートメント
条件自体を複数設定したい時はIf~ElseIfステートメントを使用します。
例えば行先□□に向かう途中で・・・
- 「電車で○○駅に降りた時」
- 「バスで△△駅に降りた時」
- 「飛行機で××空港を使う」
という全く異なる条件を1つのステートメント内で設定出来ます。
構文
If~ElseIfステートメントの構文です。
If 条件A Then
条件A向けの処理
ElseIf 条件B Then
条件B向けの処理
ElseIf 条件C Then
条件C向けの処理
ElseIf 条件D Then
条件D向けの処理
・・・・・
Else 条件E
上記条件に全て当てはまらない時
End If
Select Caseステートメント同様コードは上から実行されます。
最初の条件に合致した際はそこで用意された処理を終えるとすぐにEnd Ifに進み次のコードに移ります。
上記の構文を例にすると条件AでTrueとなった際は条件A向けの処理を実行しEnd Ifに進むことになります。
続いてもう1つポイントを紹介しておきます。
If~ElseIfステートメントで指定する条件は出来る限り少なくしましょう。
理由は「可読性が落ちるから」です。
Select Caseステートメントはコードをシンプルに用意する事が出来ます。
選択肢が多くても可読性に影響を及ぼす事は少ない(もちろん多すぎると見難いです)です。
ElseIfステートメントはより複雑に条件設定出来る分コードが長くなり可読性が落ちます。
1つのステートメント内でElseIfを使うのは3~5の範囲でおさえましょう。
End If で締めましょう
通常のIfステートメントと同じです。「End If」を忘れない様にしてください。
使い方
ワークシートとコードを紹介します。
Sub 条件分岐3()
If Right(Range("D5"), 1) = "都" Then
Range("E5") = "都"
ElseIf Right(Range("D5"), 1) = "道" Then
Range("E5") = "道"
ElseIf Right(Range("D5"), 1) = "府" Then
Range("E5") = "府"
ElseIf Right(Range("D5"), 1) = "県" Then
Range("E5") = "県"
Else
Range("E5") = ""
End If
End Sub
解説
結論ですがセルE5には「県」という文字が入力されます。
基本となるコードは2行目のコード(Ifから始まるコード)です。
ここで最初の条件分岐が入ります。2行目の条件と一致しない時は5行目のElseIf句に進みます。
続いて条件を確認。11行目の「県」でセルの内容が条件と一致する為12行目のコードが実行されます。
例えば最初の条件である2行目のコードでセルの内容と一致した際は3行目のコードが実行されます。
次は17行目のEnd Ifに進み次のコードへ移るという流れを取ります。
条件と一致した時点で用意された処理を行いEnd Ifに進みステートメントを抜けます。
代わって全ての条件に一致しない時は14行目のElse句を通り15行目のコードが実行されることになります。
課題
これでかなり柔軟性を持ったコードが書ける様になります。
今回は条件に対してTrueの際は1行のコードを実行するような書き方をしています。
さらにIf~Thenステートメントを書く事も出来ます。課題はほとんどないです。
強いて挙げるとすると「初心者のうちは難しくて使いにくい」ぐらいです。
理由はコードの理解がしっかり出来てないと自分で書いてある事が分からなくなってしまうからです。
「そんなことあるのか?」と思われるでしょう。しかしあります。
書いた時は頑張って理解してコードを用意しているので大丈夫ですが1ヶ月後にコードを見てください。
「あれ?読めない」と感じる事があります。
「初心者あるある」なのですが時が経つと自分で書いたコードが読めなくて苦しむ事があります。
関連記事
If~ElseIfステートメントとFor~Nextステートメントを使っています。
複数のセルに条件分岐の結果を記入するためのコードを用意しました。
4_Ifステートメントのネスト
If~Thenステートメントの中にさらにIf~Thenステートメントを埋め込んだコードを紹介します。
ある命令の構造の中にさらに同じ構造を入れ込むことを「ネスト」または「入れ子」と呼びます。
以下画像では現在地から豊田方面に向かうには2回の分岐があります。
このような状況を再現出来るのがIf~Thenステートメントのネストのメリットです。
構文
Ifステートメントのネストの構文です。2つ紹介します。
If 条件A Then
If B Then
条件A=True、条件B=True
Else
条件A=True、条件B=False
End If
Else
If B Then
条件A=False、条件B=True
Else
条件A=False、条件B=False
End If
End If
1つ目の構文です。外枠に居る赤文字のコードが幹となるIf~Thenステートメントです。
このコードは2つの条件を組み合わせて全通りの組み合わせを簡単に再現出来ます。
条件はAとBの2つです。全通りの分岐を用意すると4つです。
以下リストの条件によって処理を分岐出来る様にコードを組んでいます。
番号 | 色 | 条件 | 戻り値 | 色 | 条件 | 戻り値 |
---|---|---|---|---|---|---|
1 | 赤 | A | True | 青 | B | True |
2 | 赤 | A | True | 青 | B | False |
3 | 赤 | A | False | 緑 | B | True |
4 | 赤 | A | False | 緑 | B | False |
作り方も簡単です。
既存のIf~Thenステートメントの中にIf~Thenステートメントを埋め込むだけです。
赤文字のThenとElseの間に青文字で書かれたコードが居ます。
ここがもう一つのIf~Thenステートメントです。
続いて赤文字のElseとEnd Ifの間に緑文字で書かれたコードが居ます。
ここもIf~Thenステートメントです。
青文字の群に進むには赤文字の枠で用意された条件でTrueの時だけです。
緑文字の群に進むには赤文字の枠で用意された条件でFalseの時だけです。
青文字と緑文字のステートメントは同じ条件Bを使用しています。
今回は条件AとBの組み合わせの選択肢を全通り作りたかった為このような仕様にしています。
分岐先の作り方によっては青文字と緑文字の条件は違っていても大丈夫です。
より多くの組み合わせを再現出来るのがIf~Thenステートメントのネストです。続いて2つ目の構文です。
If 条件A Then
条件A=True
Else
If B Then
条件B=True
Else
If C Then
条件C=True
Else
全ての条件に合致しない時の処理
End If
End If
End If
ElseとEndIfの間に新たなIf~Thenステートメントを組み込んでいるコードです。
上記の構文では3層のIf~Thenステートメントを用意しました。
一番外枠が赤文字のIf~Thenステートメントです。
ここで条件Falseの時に青文字のIf~Thenステートメントに移ります。
条件Falseとなった際は緑文字のIf~Thenステートメントに入ります。
If~ElseIfステートメント同様可読性の問題もありますので階層は3~5階層に留めましょう。
紹介した2つの構文のメリットとしてはIf~ElseIfステートメントを使うより分かり易いです。
続いてデメリットです。
初心者のうちは可読性が上がるでデメリットよりもメリットの方が大きいです。
End If で締めましょう
通常のIfステートメントと同じです。「End If」を忘れない様にしてください。
ポイントとしてはIfステートメントを書いたら先に必要な「End If」を書いてしまいましょう。
そのあとスペースを広げて中に入る文字を書いていくという流れにすると「End If」の忘れ防止になります。
使い方
ワークシートとコードを紹介します。
Sub 条件分岐4()
If Right(Range("D5"), 1) = "都" Then
Range("E5") = "都"
Else
If Right(Range("D5"), 1) = "道" Then
Range("E5") = "道"
Else
If Right(Range("D5"), 1) = "府" Then
Range("E5") = "府"
Else
If Right(Range("D5"), 1) = "県" Then
Range("E5") = "県"
Else
Range("E5") = ""
End If
End If
End If
End If
End Sub
解説
構文のところで2つ目に紹介したコードを使っています。
条件を確認していく中でセルの内容と合致したところに記載されているコードが実行されます。
結論としてはセルE5には「県」の文字が入力されます。
ここでは17行目に書いてあるコード(条件)がセルの内容と一致します。
よって19行目のコードが実行されることになります。
ステートメントの上部に書かれた条件とセルの内容が一致した際はそこで用意されたコードが実行されます。
その後30行目のEnd Ifに移動し次のコードに進みます。
代わって全ての条件に一致しない時は21行目のElse句を通り23行目のコードが実行されることになります。
課題
コードが多くなるのでミスの可能性は増えます。見た目も文字が多い分可読性は下がります。
しかしインデント(字下げ)を適切に行うと可読性が高くなり見やすくなります。(動画解説はこちら)
初心者のうちに複雑な条件分岐を組む事になった際はこの構文がおすすめです。
関連記事
If~ThenステートメントのネストとFor~Nextステートメントを使っています。
複数のセルに条件分岐の結果を記入するためのコードを用意しました。
まとめ
本日勉強した事をまとめてみました。
- 4種類の条件分岐の使い方
- 条件分岐と繰り返し処理を
合わせて考える
対話を再現します
Enjoy Excel
関連記事の中でFor~Nextステートメントを使ってより複雑な処理に対してコードを用意しています。
この記事が理解出来た人は関連記事も読んでみてください。