VBA GO TO

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 の主な用途は次のとおりです:

  1. エラーハンドリング
  2. 複雑な条件分岐の簡略化
  3. 重複コードの回避

ただし、これらのほとんどは IfSelect CaseExit など他の制御構文で代替可能です。


■ エラーハンドリングでの使用例

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. ループ内での使用に注意

ForDo などのループ処理の途中で 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
  • 処理の簡略化(ただし限定的)
  • 繰り返し処理や条件分岐の簡素化(ただし過度な使用は禁物)

ただし、過度な使用はコードの可読性を下げ、保守性を著しく損なうため、使う場面をよく吟味し、なるべく IfSelect CaseExit 文など他の制御構文で代替するのが望ましいです。

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