VBA講義室 > コードの構造化 > 分岐処理

分岐処理

GoTo ステートメント

プロシージャ内の指定した行(ラベル)に無条件に分岐するフロー制御ステートメント。

構文


GoTo line

引数の説明

行ラベル/行番号

いずれもコードの行位置識別のために使用。


GoTo LABEL1 'この後に何が書いてあっても
For i = 1 To 65536
Application.StatusBar = "Counter " & s & "回 "
Next i
LABEL1: 'ここへジャンプ
MsgBox "終了!"


GoTo 1 'この後に何が書いてあっても
For i = 1 To 65536
Application.StatusBar = "Counter " & s & "回 "
Next i
1 'ここへジャンプ
MsgBox "終了!"

【補足】

GoSub Return ステートメント

プロシージャ内のサブルーチンへの分岐と復帰を行うフロー制御ステートメント。

構文


GoSub line
...
line
...

Return

引数の説明

行ラベル/行番号

いずれもコードの行位置識別のために使用。


GoSub LABEL1
MsgBox "復帰しました。"
Exit Sub
LABEL1:
MsgBox "サブルーチンです。"
Return


GoSub 1
MsgBox "復帰しました。"
Exit Sub
1
MsgBox "サブルーチンです。"
Return

制御の流れ

  1. GoSub ステートメントで引数 line に指定された行位置へ処理が移る。
  2. 引数 line の次に指定されているステートメントを実行。
  3. Return ステートメントによって最後に実行された GoSub ステートメント直後のステートメントにへ処理が移る。

つまり、行ラベル/行番号 line からReturn ステートメント までに記述された内容を同一プロシージャ内に書かれた「サブルーチン」として実行する。

【補足】

GoSub ステートメントは、同一プロシージャ内の行ラベル/行番号 line からReturn ステートメント までのサブルーチンに制御を移すために使用するのであり、Sub プロシージャ(他のプロシージャ)を呼び出すものではない。
このステートメントも、GoTo ステートメントとほぼ同じ理由で可読性が低いとされており、嫌われる傾向にある。同一プロシージャ内でサブルーチン化するよりも、サブルーチン部分を別プロシージャとして独立させ、Call ステートメントで Sub プロシージャを呼び出す手法が一般的である。

【コラム】なぜ嫌われる? 「Go」 系ステートメント

GoToステートメントとGoSubステートメントが「可読性が低い」との理由で嫌われる傾向にある、と書いたが、実例を挙げてその考察をしてみよう。

GoSubステートメントの場合
例えば次のようなプロシージャ。


Sub GoSubTest()
GoSub LABEL1
MsgBox "復帰しました。"
Exit Sub

LABEL1:
MsgBox "サブルーチン 1 です。"
GoSub LABEL2
Return

LABEL2:
MsgBox "サブルーチン 2 です。"
Return
End Sub

おおむね次のような処理をしている。

GoSub LABEL1 でサブルーチン 1 へ制御が移行
>サブルーチン 1 で、メッセージ表示
>GoSub LABEL2 でサブルーチン 2 へ制御が移行
>サブルーチン 2 で、メッセージ表示
>Returnで呼び出し元のGoSub LABEL2の次の行へ復帰
>サブルーチン 1 のReturnで呼び出し元のGoSub LABEL1の次の行へ復帰
>メッセージ表示してプロシージャ終了

上記は行数が少ないので、何とかステップイン実行させなくても理解できるレベルだが・・・・
2つ存在するReturnによって復帰すべき呼び出し元のGoSubがどれであるのか、解りにくい、とされる。処理がひとつのプロシージャ内で下の行へ行ったり、上へ戻ったり、というのはどうも最近は嫌われるようだ。なおかつ、復帰すべきポイントがたくさんあると、その関連性を確認していくのはなかなか骨が折れる作業だ。
また、サブルーチン部分を単独で実行・検証できない、と言うのも嫌われる理由かもしれない。

「GoToの場合はラベル部分へ処理が移行するだけだから単純じゃないか」と言われるかもしれない。
が、例に挙げたコードのフロー構造もGoToとラベルだけで実現できる。
GoSubとReturnをGoToステートメントに置き換え、Returnで復帰すべき位置へラベルを追加すれば良い。ラベルがあると、どこに制御が移るか解りやすい、と感じる人がいるかもしれないが、処理が「下の行へ行ったり、上へ戻ったり」というのは、その流れを目で追いかけるのは規模が大きくなるほどたいへんなのである。

では、「可読性が良い」といわれるコードはどう言うものか、というと 「上から下へ向かって順番にステートメントが実行されるコード」と言えそうである。
「For Nextなんかは上下で行ったり来たりするじゃないか」との意見もあるかと思うが、繰り返し処理の場合は「ブロック化されており、その範囲内だけで行ったり来たりする」ので、そのほうが「可読性がある」と判断されるらしい。まあ、私もそう思う。

ただ、昔習ったBasicのクセで、GoTo〜とやりたくなることは良くあるのだけれど。


前(繰り返し処理) 目次


SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送