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

お知らせ記事には広告が含まれておりますがExcelのスキルUPに繋がる様コンテンツ自体は手を抜かずに作成しております

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

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

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

加えて実務に落とし込む際に難しいと感じる要素として上位に挙げられる事が多いです。

この情報に対して裏付けとなるデータを紹介します。

私100人以上の方々とVBAについて会話をしてきました。

皆様がどんなところを難しいと思っていたのかある程度傾向を取る様にしています。

EnjoyExcel
EnjoyExcel

データを見ると「実務に落とし込む際難しいと感じている機能」に傾向がありました。

繰り返し処理と並んで条件分岐を挙げる方が多かったです。

実務に落とし込む際難しいと感じる機能
(対象:VBA初心者約100名 複数回答可)
繰り返し処理
73人
条件分岐
63人
ファイル、フォルダの取り回し
32人

条件分岐については半数以上の皆様が難しいと感じている様です。

理解できた4割の人の話を聞くとワークシート関数のIF文が分かる人が多かったです。

ここが繰り返し処理よりは難しいと感じる人が少なかった点ではないかと推測しています。

僅差ではありますが「繰り返し処理」より「条件分岐」の方が理解し易いというデータがでました。

まずは条件分岐を勉強して基礎を固めようという結論に至りましたので今回の記事を用意した次第です。

この記事でわかる事

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

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

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

Enjoy Excel

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

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

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

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

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

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

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

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

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

関連記事

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

良く読まれている記事ですVBA-11マクロ内でMsgBoxとIFステートメントを組み合わせる

使用するデータについて

今回使用するデータは中小企業庁さんが作成している中小企業白書です。

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

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

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

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

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

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

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

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

今回の記事では4つの条件分岐について解説します。

どの条件分岐もセルE5に値を入れる為のコードを紹介しています。

関連記事ではFor~Nextステートメントを使って全ての都道府県の末尾を入力するコードを紹介します。

条件分岐とは

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

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

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

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

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

その中で条件によって処理を分けたい時があります。

そこで分岐を作る機能を一般的に条件分岐と呼んでいます。

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

メリット

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

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

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

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

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

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

デメリット

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

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

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

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

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

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

4種類の条件分岐

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

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

If~Thenステートメント

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

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

構文

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

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

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

解説

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

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

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

POINT

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

解説

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

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

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

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

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

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

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

課題

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

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

関連記事

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

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

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に進み次のコードに移ります。

POINT

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

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

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

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

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

POINT

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

解説

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

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

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

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

このコードは2つの条件を組み合わせて全通りの組み合わせを簡単に再現出来ます。

条件はAとBの2つです。全通りの分岐を用意すると4つです。

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

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

作り方も簡単です。

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

POINT

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ステートメントを用意しました。

POINT

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

一番外枠が赤文字のIf~Thenステートメントです。

ここで条件Falseの時に青文字のIf~Thenステートメントに移ります。

条件Falseとなった際は緑文字のIf~Thenステートメントに入ります。

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

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

If~Thenステートメントの型をそもまま埋め込んでいるだけなので考え方としては基本のIf~Thenステートメントが採用されます

続いてデメリットです。

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

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

End If で締めましょう

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

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

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

使い方

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

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

解説

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

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

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

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

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

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

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

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

課題

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

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

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

関連記事

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

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

まとめ

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

本日勉強したこと
  1. 4種類の条件分岐の使い方
  2. 条件分岐と繰り返し処理を

    合わせて考える

条件分岐は

対話を再現します


Enjoy Excel

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

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

EnjoyExcel

タイトルとURLをコピーしました