ExcelVBA【Ifのネスト&For】マクロ内で分岐とループを組み合わせる-4

お知らせこの記事は【エラーにならない】 VBA条件分岐完全ガイドコードのテンプレを紹介の関連記事です

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

Ifステートメントのネスト(入れ子)とループを組み合わせる

VBAで条件分岐や繰り返し処理が理解出来る様になると気付く事があります。

「条件分岐を1つ設定しただけではやりたい事が再現できない」という事です。

スキルが上がってくると複数条件の設定等より難しい事を考えられる様になるのですがコードがついてきません。

これを解決させるのがIfステートメントのネストです。「入れ子」と呼ばれることもあります。

今回の記事のポイントはこの「ネスト」です。ネストを使えば条件分岐の選択肢を増やす事ができます。

最初にIfステートメントのおさらいをします。通常の構文で作る分岐は基本的には2通りです。

ここにネスト構造を設定する事で4通り等多くの選択肢を提供する事ができる様になります。

俗に言う「if の中に if」という状態を作り出します。確かに配置、状態としては合っていますね。

今回はFor~Nextステートメントを織り交ぜながらIf~Thenステートメントのネストを解説していきます。

EnjoyExcel
EnjoyExcel

ここを押さえると理解が進む」というポイントを紹介していきます。動画もありますよ。

ネストが組めるようになると「プログラミングしてるな」という実感が出てきます。

記事を読んでいただく前にネストをイメージしてもらう為に画像を1枚用意しました。

画像はネストそのものです。このユニットと同じ様に内々に構造を持つという状態を意識して記事を読んでください。

ネスト構造がイメージできる画像(収納具合からネスト構造を想像)
綺麗なネスト構造です。イメージだけで用意した画像です。

この記事でわかる事

省略しているわけではなくシンプルに1つです。

If~ThenステートメントのネストとFor〜Nextステートメントの組み合わせについて勉強します。

この記事でわかる事
  1. If~Thenステートメントのネストと

    For~Nextステートメントの

    組み合わせ

この記事で

型を習得しましょう


Enjoy Excel

関連記事

条件分岐と繰り返し処理の解説記事です。

条件分岐

Ifステートメントの基本的な使い方&MsgBoxと一緒に使う方法を解説しています。

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

If~Thenステートメントのネストを含め4つの条件分岐についてコードを用いて解説しています。

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

繰り返し処理

For~Nextステートメントの解説記事です。

関連記事VBA-12繰り返し処理をFor~Nextステートメントで学習する

Ifステートメントのネスト

まずはIfステートメントのネストについて説明します。

Wikipediaではネスティングというキーワードで紹介されています。

ネスト入れ子とは、プログラムの構造が再帰的に繰り返されて記述されること。

このような構造をネスト構造: Nested structure)、入れ子構造と呼ぶ。

Wikipedia:ネスティング

これだけ読んでもよく分からないので見た目で理解できるようにします。

上段のIfステートメントは選択肢が2つです。下は4つです。

Sub ネスト()
'************************************
If 条件A Then
  '条件AがTrue ・・・1
Else
  '条件AがFalse ・・・2
End If
'************************************
If 条件A Then
  '条件AがTrueという前提

  If 条件B Then
    '条件AがTrueかつ条件BがTrue ・・・1
  Else
    '条件AがTrueかつ条件BがFalse ・・・2
  End If

Else
  '条件AがFalseという前提

  If 条件B Then
    '条件AがFalseかつ条件BがTrue ・・・3
  Else
    '条件AがFalseかつ条件BがFalse ・・・4
  End If

End If
'************************************
End Sub

こうやってIfステートメントの中にIfステートメントを用意する事で選択肢を増やしています。

これが「ネスト」と呼ばれている構造です。複数の分岐で評価が行われて最適な選択肢を提供してくれます。

参考Microsoftのドキュメントの中でも「入れ子」という名前でネスト構造が説明されています。

入れ子になった制御構造 (Visual Basic)

If~ThenのネストとFor~Nextステートメントの組み合わせ

ネスト構造のIfステートメントはFor~Nextステートメントと一緒に使われる事が多いです。

出来るだけシンプルな型を用意しました。この型で基本を身につけましょう。

最初に紹介した4通りの選択肢を用意したコードとは少し違います。ご注意ください。

Ifステートメントの中にIfステートメントを挟むという意味では以降のコードもネスト構造と言えます。

構文

実際に仕事をコードに落とし込む時は変数、始点、終点等の要素に数値が入っていないと分かりにくいです。

ここではあくまで配置として覚えてください。

For 変数 = 始点 to 終点
 If 条件A Then
  条件A=True
 Else
  If B Then
   条件B=True
  Else
   If C Then
    条件C=True
   Else
    全ての条件に合致しない時の処理
   End If
  End If
 End If
Next

考え方の基本となるところだけ解説しておきます。

大外にFor~Nextステートメントが配置されます。For句からNext句までをループする事になります。

ループの中ではループの回数と同じだけIf~Thenステートメントの処理が実行されることになります。

論理演算子など用いての演算により処理が進んでいくという具合です。

赤色の条件分岐の結果次第で青、もしくは緑色の条件分岐構文に処理が移動していく事になります。

次の処理へ進む度にIf文と対話しながら条件をこなしていく事で最適な結果を提供できる様になります。

具体的な使い方

サンプル用にワークシート1枚作成しました。セルには以下のような情報が記入されています。

D列の各行から末尾1文字を確認しE列の各行に末尾を入力するというコードを紹介します。

最終的にはセルE5~セルE14に文字が入ります。例えばセルE5には「県」が入ります。

・・・「事例として実用性が無い」と思いませんか。私も思います。

しかしネストを勉強するという観点だけに特化すると程よく使える事例となっています。

セルの画像-ネスト&繰り返し処理

画像に対応したコードです。複数条件分岐が用意されていますがやっている事は簡単ですのでご安心ください。

Sub 条件分岐と繰り返し4()

Dim r As Long

For r = 5 To Cells(Rows.Count, 4).End(xlUp).Row
    If Right(Cells(r, 4), 1) = "都" Then
      Cells(r, 5) = "都"
    Else
        If Right(Cells(r, 4), 1) = "道" Then
          Cells(r, 5) = "道"
        Else
            If Right(Cells(r, 4), 1) = "府" Then
                Cells(r, 5) = "府"
            Else
                If Right(Cells(r, 4), 1) = "県" Then
                    Cells(r, 5) = "県"
                Else
                    Cells(r, 5) = ""
                End If
            End If
        End If
    End If
Next

End Sub

解説

順番に解説します。

コードの概要

実行するとセルE5からセルE14まで漢字(文字列)が1文字ずつ入力されます。

セルE7が「都」、セルE13が「府」。残りは「県」です。

変数

3行目でDimから始まるコードは変数の宣言です。

ここで宣言されたLong型(Integerは使わない様にしましょう)の変数はコード内で数値として使用出来ます。

続いて5行目のコードです。変数に値を代入するというコードです。

始点は5ですが終点は見た事無いコードが書かれていますね。これは最終行を取得する為のコードです。

変数と最終行を取得するコードについて分からない方はリンクを用意しておきました。

各種要素については以下リンクを参照ください

これでリストの最終行を取得する事が出来ます。

今回のリストの配置からすると終点は14という数値を得る事が出来ます。

演算部分

通常通り上から実行されます。6行目で末尾は「都」ですか?と確認しています。

一致していれば7行目のコードが実行されることになります。

一致しない時は残りのIf~Then句を通過します。

先程は例で「都」の説明をしましたが実際は最初の値は沖縄県です。

15行目のIfステートメントでTrueとなり16行目のコードが実行されます。

セルに用意された文字の末尾が選択肢にかからなかった時はElseに進みます。

ここでは空欄になる様に設定していますが「値無し」などセルに文字を返しても良いです。

最後にループの解説です。23行目のNext句の後変数rは5から6に変化します。

その後6行目から再びIf~ElseIfステートメントを通過する事になります。

必要に応じてE列のセルに値を記入するという作業が進んでいきます。

マクロの条件分岐と電線や線路の分岐は似ています
こちらの写真だと線路より電線の方が条件分岐と繰り返し処理がたくさん配置されている事が分かり易いですね。
何もしない分岐を作っても良いです

分岐させた条件の先には必ず作業を用意しないといけないわけではないです。

「AとBがTrueの時は何もしない」という分岐があっても大丈夫です。

用途や状況によってスルーする分岐を作る事はなんら問題ありません。

ネストにはインデント(字下げ)を使う

インデント(字下げ)を付けるとネスト構造が含まれたコードが見易くなります。

約1分の動画を用意しました。紹介したコードに対してインデント(字下げ)を使っています。

Spaceキーを使って余計見辛くなっているコードをみかけることがあります。

美しくないのでインデント(字下げ)の際はTabキーを使う様にしてください。(詳細は動画を見てください)

インデント(字下げ)を使えるという事はネスト構造を理解しているという見方も出来ます。

自分以外の他者に対しても見易いコードを作ると同時に自分のスキルもアピールする事ができます。

よってインデント(字下げ)は必ず使う様にしてください。

ネスト(入れ子)の制限はあるのか

「無い」です。しかし出来るだけネストは減らす方向でコードを考えましょう。

目安として3~5階層あたりで収まるようなコードを書く事をおすすめします。

理由は階層が深くなるにつれて可読性が下がり分かりにくくなるからです。

対策としてはコードの構想を再構築してシンプルな分岐を組むかサブルーチンに逃がすという方法をとります。

構想の再構築もサブルーチンもスキルが上がってくると自然に出来る様になります。

よって最初のうちはあまり気にせずまずはコードを書ける様にすることを考えてください。

複数条件の設定によりネストが複雑になってしまったら

構想としてネストが3~5階層では収まらないけどサブルーチンは分からないという段階ではここをチェック。

うまく使うとネスト(入れ子)を減らす事ができます。

  1. 変数をうまく使う
    • セルから取得した値を変数に格納して運用すると仕様によっては分岐が減る可能性有
  2. 条件分岐をまとめる
    • 条件を&でまとめる事ができれば単純に分岐が減る
  3. ワークシート側の仕様を変える
    • ワークシートに列を増やす等条件が絞れるようなネタを増やす

面倒となりますが出来るだけ自分で試行錯誤してください。それがスキルアップにつながります。

条件分岐と繰り返し処理の組み合わせはどんな仕様の仕事でも必ずついて回ります。

という事はここでコードのバリエーションを持てるようになると総じて他の仕事のレベルも上がります。

課題

SelectCase等他の条件分岐のステートメントと比較してコードの量が多くなる事で分かりにくくなります。

簡単に理解する事ができなくなるので「読みにくい」というのが課題です。

ただしセルに直書きする関数のIf文を理解されている方からすると別の捉え方をされる事があります。

むしろこのステートメント(ネスト構造)の方がしっくりくるはずです。

今までは横に書いていたワークシート関数をVBAの作法で縦書きしただけの違いです。

私はSelect CaseステートメントやElseIfステートメントの方が難しかったです。

まとめ

If~ThenステートメントのネストとFor~Nextステートメントを一緒に使いました。

そのままコピペしてご自身でコードを実行してみてください。

本日勉強したこと
  1. If~Thenステートメントのネストと

    For~Nextステートメントの

    組み合わせ

繰り返し読んで理解しましょう

Enjoy Excel

操作に慣れてきたら今回紹介したコードの逆パターンも試してみてください。

「Forの中にIf」ではなく「Ifの中にFor」です。事例次第ですがさらに出来ることが広がりますよ。

参考:ネスト構造を使った事例

応用ですが合格/不合格の判定などで1つの選択肢だけでは判断できない時に今回のコードは使えます。

たとえばAさんは国語と数学の判定はOKなんだけど英語がNGなので不合格という場合です。

国語は○です。数学も○です。最後に英語の分岐で不合格・・・なんていうコードを用意する事ができます。

色々なケースで使えるコードになっていますので皆様の情報に合わせて使ってみてください。

EnjoyExcel

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