GoTo
文は、プログラムの実行を指定したラベルに直接ジャンプさせる命令です。古くからある構文であり、特定の状況では便利に使える一方で、使い方を誤るとコードが読みにくくなり、保守性を著しく低下させるため注意が必要です。ここでは、GoTo
の基本的な使い方から注意点、代表的な利用例まで、2000文字程度で解説します。
■ GoTo の基本構文
GoTo ラベル名
この命令を記述すると、プログラムは直ちに指定したラベルの位置にジャンプして、そこから処理を続けます。ラベルは、任意の文字列の後にコロン(:)を付けて定義します。
■ 基本的な例
Sub SampleGoTo()
Dim num As Integer
num = 10
If num > 5 Then
GoTo OverFive
End If
MsgBox "5以下です"
Exit Sub
OverFive:
MsgBox "5より大きいです"
End Sub
この例では、変数 num
が5より大きいため、GoTo OverFive
によりラベル OverFive:
にジャンプし、「5より大きいです」というメッセージが表示されます。GoTo
を使うことで、条件によって異なる処理に分岐できます。
■ GoTo の主な用途
GoTo
の主な用途は次のとおりです:
- エラーハンドリング
- 複雑な条件分岐の簡略化
- 重複コードの回避
ただし、これらのほとんどは If
や Select Case
、Exit
など他の制御構文で代替可能です。
■ エラーハンドリングでの使用例
VBAでは On Error GoTo ラベル名
という構文で、エラー発生時にジャンプ先を指定することができます。これは GoTo
の代表的で安全な使用例です。
Sub ErrorHandlingExample()
On Error GoTo ErrorHandler
Dim x As Integer
x = 10 / 0 ' ゼロ除算エラー発生
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました:" & Err.Description
End Sub
このように On Error GoTo
を使うことで、エラー発生時に専用の処理にジャンプして安全に処理を終了できます。
■ GoTo 使用上の注意点
1. スパゲッティコードになる恐れ
GoTo
を多用すると、コードがジャンプだらけになり、処理の流れを追うのが難しくなります。
2. 可読性・保守性の低下
他の開発者が読んだときに理解しにくくなり、バグ修正や改良が困難になります。
3. ループ内での使用に注意
For
や Do
などのループ処理の途中で GoTo
を使うと、ループ構造が破壊されることがあり、意図しない動作をする場合があります。
■ GoTo を避けるための代替手段
- If~Then~Else
- Select Case
- Exit Sub / Exit Function / Exit Do / Exit For
- DoEvents(イベント処理)
たとえば、以下のような GoTo
を使ったコード:
If a > 10 Then
GoTo NextStep
End If
MsgBox "10以下です"
Exit Sub
NextStep:
MsgBox "11以上です"
は、次のように書き換えることができます:
If a > 10 Then
MsgBox "11以上です"
Else
MsgBox "10以下です"
End If
このようにすれば、処理の流れが明確になり、読みやすくなります。
■ GoTo の適切な使用場面
GoTo
は「禁止」されているわけではなく、以下のようなケースでは有効に使えます:
- 複数のネストされた条件分岐の最後で一括処理を行いたい
- 簡単なエラーハンドリング
- Exit Sub/Function 前に共通処理を一カ所に集める
例:後片付け処理の一元化
Sub CloseFile()
On Error GoTo CleanUp
Open "C:\example.txt" For Input As #1
' ファイル処理など
CleanUp:
Close #1
End Sub
■ まとめ
GoTo
文は、プログラムの実行を任意の位置にジャンプさせるための制御文です。VBAでは主に以下のように活用されます:
- エラーハンドリングのための
On Error GoTo
- 処理の簡略化(ただし限定的)
- 繰り返し処理や条件分岐の簡素化(ただし過度な使用は禁物)
ただし、過度な使用はコードの可読性を下げ、保守性を著しく損なうため、使う場面をよく吟味し、なるべく If
や Select Case
、Exit
文など他の制御構文で代替するのが望ましいです。