【エラーにならない】 VBA条件分岐完全ガイドコードのテンプレを紹介

このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています

マクロの条件分岐の書き方&テンプレートを紹介

プログラミングでは基本となる構文 「条件分岐」。VBA初心者であれば是非とも理解しておきたい機能です。

しかしマクロの記録では生成されない機能であることや1行で書けるコードではない為分かりにくい様です。

EnjoyExcel

条件分岐はワークシート関数にも用意されている機能です。
よって馴染みはありますがコードにするとなると難しいようです。

ある程度内容を理解する事も大事なのですが条件分岐についてはフォーマットとして覚えてしまうのも有効です。

理由は「型がある程度決まっているから」です。

この記事でわかる事

まずは条件分岐がどんなものなのか理解する事が出来る様になります。

大きく分けて4種類の条件分岐を紹介します。エラーを出さない様全て丁寧に解説します。

  1. 4種類の条件分岐の使い方が分かる
  2. 条件分岐と繰り返し処理を合わせて勉強できる

加えて条件分岐の種類毎に繰り返し処理のFor~Nextステートメントとコラボした記事を用意しました。

関連記事の中では条件分岐と繰り返し処理を一緒に使ったコードの解説をします。

この記事含め関連記事を読むとご自身の仕事をマクロに置き換える事が出来るようになります

参考:ファイル、フォルダの扱いは別記事にします

ファイル、フォルダの取り回しについて負担に感じている人が少し少ない気がしました。

数名の方に聞いてみると初心者の皆様では未だ難しいと感じるに至ってない傾向がありました。

ファイルやフォルダとの連携は中級者様が取り組む内容です。まだ勉強していませんという意見が多かったです。

ファイル、フォルダの取り回しは少々難しいので別途記事を用意します。

VBAで転記|ブック間で文字列をコピペするマクロの作り方を教えます

関連記事

条件分岐とMsgBox(メッセージボックス)を一緒に使用しています。

VBA-11マクロ内でMsgBoxとIFステートメントを組み合わせる

目次(各項目へのリンク機能付き)

条件分岐とは

そもそも「条件分岐とは何か」を説明します。

私が調べものをする時に使っている本では条件分岐は以下の様に書かれています。

特定の条件が成立している時だけ処理を実行させたい、または特定の条件に応じて異なる処理を実行させたいといったことがあります。これを条件分岐、または分岐といいます。

パーフェクトVBA 97ページ 高橋宣成 著 技術評論社

基本的に書かれたコードは1本の通り道を最初から最後まで走り切ります。

その中で条件によって処理を分けたい時があります。そこで分岐を作る機能を一般的に条件分岐と呼んでいます。

例えばこのボールはゴールラインを越えたのか?越えてないのか?でその後の立ち振る舞いは変わります。

メリット

VBAで条件分岐を使うメリットを教えてください

適度に使うと可読性があがります。総合的にはコードを少なくする事が出来ます

条件分岐を使うという事は内容により処理を分けたいという事です。

よってコードの量が増えて複雑になることが想定されるのですが条件分岐はその問題を解決してくれます。

分岐構造の型(ステートメント)を使うことでコードが少なくなります。

可読性が上がる、ミスが減る、メンテナンス性が上がる等良い事ばかりです。

デメリット

VBAで条件分岐を使うデメリットを教えてください

初心者のうちは難しくて使いにくい傾向があります

最初の頃は条件分岐をコードに組み込む事自体がストレスになります。

単純に使いにくいというのがデメリットです。

しかしここをクリアしないと実務をマクロ化するのは難しいです。

デメリットは乗り越えるとメリットに変わります。ここで勉強してメリットに変えてしまいましょう。

4種類の条件分岐

以下4種類です。順番に紹介していきます。

  1. If~Then
    • 一定条件のもと処理を分ける
  2. Select~Case
    • 一定条件に対して複数の回答を用意する
  3. If~ElseIf
    • 一定条件に合致しない時は別の条件を提示する
  4. Ifのネスト
    • 条件を組み合わせる事で多様な選択肢に対応する

各分岐の解説で使用するデータについて

4つの事例を紹介する為に中小企業庁が作成している中小企業白書からデータを借ります。

2022年度版の白書の中から開業率についてのデータを利用させていただきます。

具体的な数値は使いません。開業率が高い都道府県を書き出しただけです。

開業率の説明やその他詳細については引用元を掲載しておきます。

開業率は、当該年度に雇用関係が新規に成立した事業所数/前年度末の適用事業所数である。

2022年版中小企業白書 I-32ページ

今回は開業率が高かった都道府県TOP10を使わせていただきます。

D列の各都道府県の末尾を確認し条件と一致したらE列に末尾と同じ文字を書き出すという作業をします。

本記事も関連記事も全てこのワークシートの値を使ってコードを紹介します。

今回の記事では4つの条件分岐を解説します。どの条件分岐もセルE5に値を入れる為のコードを紹介しています。

加えて各分岐に用意した記事ではFor~Nextステートメントを使い全都道府県の末尾を入力するコードを紹介します。

1_If~Thenステートメント

条件分岐の中でも基本となる型(ステートメント)です。

If~Thenステートメントは2通りの分岐を作ります。

構文

If~Thenステートメントの構文です。

If  条件 Then
 条件Trueの処理
Else
 条件Falseの処理
End If
VB

IfとThenの間に用意される「条件」が起点になります。

ここで提示された条件とセルの情報が合致している時はThenとElseの間に書かれたコードが実行されます。

これは「条件Trueの処理」という事になります

代わって提示された条件とセルの情報が合致しない時はElseとEnd Ifの間に書かれたコードが実行されます。

これは「条件Falseの処理」という事になります

End If で締めましょう

最後に「End If」を書き忘れない様にしてください。

上からコードを書いていると条件を書いて分岐先の式を書くと安心して「End If」を忘れがちです。

使い方

ワークシートとコードを紹介します。

再度セルの画像を用意しました。-1
再度セルの画像を用意しました。-1

では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
VB

解説

結論から申し上げますとプログラムが正常に終了するとセル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ステートメントを使って複数のセルに条件分岐の結果を記入するためのコードを用意しました。

If&For~Nextステートメント

2_Select Caseステートメント

1つの条件に対して複数の回答を用意したい時に有効なコードを紹介します。

今回の都道府県の事例の様に条件は1つで回答を複数用意したい時に使う事になります。

Select Caseステートメントは1つの条件に対して複数の分岐を用意出来ます。

構文

Select Caseステートメントの構文です。

Select Case 条件
 Case 条件の回答A
  条件が回答Aに合致した時の処理
 Case 条件の回答B
  条件が回答Bに合致した時の処理
 Case 条件の回答C
  条件が回答Cに合致した時の処理
 Case 条件の回答D
  条件が回答Dに合致した時の処理
 ・・・・・
End Select
VB

SelectCaseはコードの実行方法にポイントがあります。

Case句は上から実行されます。条件と合致して用意した処理が実行されるとEnd Selectに移動します。

用意した全てのコードを実行する事はありません。

条件と合致し回答があればそこまでは処理を行いすぐにEnd Selectに移動し次のコードに進んでいきます。

End Select で締めましょう

通常のIfステートメント同様「End Select」が足りないとエラーメッセージが出てしまいます。

コンパイルエラーの原因はコードの間違いです。

コードを書き間違えている、何か足りない等本来のコードを形成出来てないというエラーです。

エラーメッセージだけでは分からないことが多いのですがこのエラーは分かり易いですね。

End Selectが無いと言っているので書き足してあげましょう。

使い方

ワークシートとコードを紹介します。

再度セルの画像を用意しました。-2
再度セルの画像を用意しました。-2
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
VB

解説

セルE5には「県」という文字が入力されます。2行目のコードで条件を設定しています。

ここでは「セルD5の最後の文字」という条件を設定します。

3行目以降でセルD5の最後の文字に対して選択肢が用意されています。

合致するところに書いてるコードが実行される事になります。

ここでは15行目のCase句と条件が合致するので17行目のコードが実行されることになります。

用意された条件に一致しない時は19行目のCaseElse句で回収されます。

今回はD5セルの末尾の文字が都道府県以外であった時はセルE5には空欄が用意されます。

課題

Select Caseステートメントは1つの条件に対して複数の選択肢を用意するには非常に有効なコードです。

しかし条件自体を複数用意したい時には向かないコードです。

関連記事

Select CaseステートメントとFor~Nextステートメントを使っています。

複数のセルに条件分岐の結果を記入するためのコードを用意しました。

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
VB

Select Caseステートメント同様コードは上から実行されます。

最初の条件に合致した際はそこで用意された処理を終えるとすぐにEnd Ifに進み次のコードに移ります。

コードは上から実行されます。条件と合致して用意した処理が実行されるとEnd Ifに移動します。

上記の構文を例にすると条件AでTrueとなった際は条件A向けの処理を実行しEnd Ifに進むことになります。

続いてもう1つポイントを紹介しておきます。

If~ElseIfステートメントで指定する条件は出来る限り少なくしましょう。

理由は「可読性が落ちるから」です。

1つのIf~ElseIfステートメント内でElseIfを使用するのは3~5回に留めましょう。

Select Caseステートメントはコードをシンプルに用意する事が出来ます。

選択肢が多くても可読性に影響を及ぼす事は少ない(もちろん多すぎると見難いです)です。

ElseIfステートメントはより複雑に条件設定出来る分コードが長くなり可読性が落ちます。

1つのステートメント内でElseIfを使うのは3~5の範囲でおさえましょう。

End If で締めましょう

通常のIfステートメントと同じです。「End If」を忘れない様にしてください。

使い方

ワークシートとコードを紹介します。

再度セルの画像を用意しました。-3
再度セルの画像を用意しました。-3
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
VB

解説

結論ですがセル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ステートメントを使っています。

複数のセルに条件分岐の結果を記入するためのコードを用意しました。

ElseIf&For~Nextステートメント

4_Ifステートメントのネスト

If~Thenステートメントの中にさらにIf~Thenステートメントを埋め込んだコードを紹介します。

ある命令の構造の中にさらに同じ構造を入れ込むことを「ネスト」または「入れ子」と呼びます。

入れ子といえばマトリョーシカです。

以下画像では現在地から豊田方面に向かうには2回の分岐があります。

このような状況を再現出来るのがIf~Thenステートメントのネストのメリットです。

分岐先でさらに分岐を作ることができるのが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
VB

1つ目の構文です。外枠に居る「条件A」のコードが幹となるIf~Thenステートメントです。

このコードの中に「条件B」を2つ組み合わせて4通りの組み合わせを再現しています。

繰り返しとなりますが条件はAとBの2つです。全通りの分岐を用意すると4つです。

以下リストの条件によって処理を分岐出来る様にコードを組んでいます。

番号条件戻り値条件戻り値
1ATrueBTrue
2ATrueBFalse
3AFalseBTrue
4AFalseBFalse
提示した構文は上記リストの組み合わせを作る事が出来ます

作り方も簡単です。

既存のIf~Thenステートメントの中にIf~Thenステートメントを埋め込むだけです。

If~Thenステートメントの中にIf~Thenステートメントを埋め込む事が出来ます。

条件Aの式の間に条件Bのコードが居ます。

ここが1つ目の埋め込まれたIf~Thenステートメントです。

続いて条件AのElseとEnd Ifの間に条件Bで書かれたコードが居ます。

ここが2つ目のIf~Thenステートメントです。

分岐先の作り方によっては「条件Aの中に条件Bを2つ」ではなく「条件Aの中に条件B、条件C」を作る事も可能です。

より多くの組み合わせを再現出来るのが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
VB

ElseとEndIfの間に新たなIf~Thenステートメントを組み込んでいるコードです。

上記の構文では3層のIf~Thenステートメントを用意しました。

一番外枠が「条件A」のIf~Thenステートメントです。

ここで条件Falseの時に「条件B」のIf~Thenステートメントに移ります。

続いて条件Falseとなった際は「条件C」のIf~Thenステートメントに入ります。

全ての条件でFalseの時はElse句に処理が流れるという具合です。

End If で締めましょう

通常のIfステートメントと同じです。「End If」を忘れない様にしてください。

ポイントとしてはIfステートメントを書いたら先に必要な「End If」を書いてしまいましょう。

そのあとスペースを広げて中に入る文字を書いていくという流れにすると「End If」の忘れ防止になります。

階層は深ければ良いというわけではない

If~ElseIfステートメント同様可読性の問題もありますので階層は3~5階層に留めましょう。

ステートメントの階層は3~5階層に留めましょう

メリット/デメリット

紹介した2つの構文のメリットとしてはIf~ElseIfステートメントを使うより分かり易いです。

考え方としては基本のIf~Thenステートメントと同じ

続いてデメリットです。

コードが増えるのでミスの可能性が上がります

初心者のうちは可読性が上がるでデメリットよりもメリットの方が大きいです。

使い方

ワークシートとコードを紹介します。

再度セルの画像を用意しました。-4
再度セルの画像を用意しました。-4
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
VB

解説

構文のところで2つ目に紹介したコードを使っています。

条件を確認していく中でセルの内容と合致したところに記載されているコードが実行されます。

結論としてはセルE5には「県」の文字が入力されます。

ここでは17行目に書いてあるコード(条件)がセルの内容と一致します。

よって19行目のコードが実行されることになります。

ステートメントの上部に書かれた条件とセルの内容が一致した際はそこで用意されたコードが実行されます。

その後30行目のEnd Ifに移動し次のコードに進みます。

代わって全ての条件に一致しない時は21行目のElse句を通り23行目のコードが実行されることになります。

課題

コードが多くなるのでミスの可能性は増えます。見た目も文字が多い分可読性は下がります。

しかしインデント(字下げ)を適切に行うと可読性が高くなり見やすくなります。(動画解説はこちら

初心者のうちに複雑な条件分岐を組む事になった際はこの構文がおすすめです。

関連記事

If~ThenステートメントのネストとFor~Nextステートメントを使っています。

複数のセルに条件分岐の結果を記入するためのコードを用意しました。

Ifのネスト&For~Nextステートメント

まとめ

本日勉強した事をまとめてみました。

  1. 4種類の条件分岐の使い方
  2. 条件分岐と繰り返し処理を合わせて考える

関連記事の中でFor~Nextステートメントを使ってより複雑な処理に対してコードを用意しています。

この記事が理解出来た人は関連記事も読んでみてください。

EnjoyExcel

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!