VBAでマクロを作成していると、
「条件によって処理を途中で中断したい」
「エラーが発生したら特定の処理へ移動させたい」
といった場面に必ず遭遇します。
そのときに登場するのが
GoToステートメントです。
しかし、GoToは
- 使ってはいけない命令
- コードが読みにくくなる原因
- バグを生みやすい構文
といった印象を持たれることも多く、
「避けるべきもの」と理解されていることも少なくありません。
一方で、実務では
- エラー処理
- 共通終了処理
- 条件不一致時の安全な中断
などにおいて、
GoToは非常に有効な制御手段になります。
重要なのは、
使うか使わないかではなく、どの場面で使うかを判断できることです。
この記事では、
- GoToステートメントの基本
- 誤用されやすいパターン
- 実務で安全に使う設計方法
- ExitやIfとの使い分け
- 将来の保守や引き継ぎを見据えた考え方
まで、
実務で困らないレベルまで整理して解説します。
目次
- ✅ GoToステートメントとは|処理を指定した場所へ移動させる基本構文
- ・構文:GoToステートメントの基本形
- ・例:条件に応じてエラー処理へ移動する
- ・なぜこの書き方にしているのか
- ・別の書き方との違い
- ・実務でのメリット
- ✅ GoToが危険と言われる理由|処理の流れが見えなくなる典型例
- ・例:GoToを多用した危険なコード
- ・このコードで起きる問題
- ・実務で実際に起きるトラブル
- ✅ GoToを使うべき場面|エラー処理と終了処理を安全にまとめる方法
- ・例:エラー処理にGoToを使用する
- ・なぜこの書き方にするのか
- ・実務での重要なポイント
- ✅ GoToとExitの違い|処理を終了するか移動するかを判断する
- ・例:終了前に共通処理を実行する
- ・なぜこの書き方にしているのか
- ・実務で起きやすい失敗
- ✅ GoToを安全に使う設計ルール|将来の修正や引き継ぎを見据える
- ・ルール:ジャンプ先は1か所に限定する
- ・ルール:前方ジャンプのみ使用する
- ・禁止:後方ジャンプ
- ・ルール:意味のあるラベル名を使う
- ✅ まとめ:GoToは使い方を理解すれば安全な制御手段になる
- ・この記事のポイント
- ・実務での次のステップ
✅ GoToステートメントとは|処理を指定した場所へ移動させる基本構文
GoToステートメントは、
処理の流れを指定した位置へ移動させる命令です。
この仕組みを正しく理解しないまま使い始めると、
「どこからこの処理に来たのか分からない」
「条件を追加したら急に動かなくなった」
といったトラブルが発生しやすくなります。
特に、業務で使うマクロは
一度作って終わりではなく、
後から修正や追加が繰り返されます。
そのとき、
処理の流れが整理されていないコードは、
修正するたびに不具合を生みやすくなります。
この章ではまず、
GoToの基本構文と動作を正しく理解し、
後から壊れないコードを書くための前提を整えていきます。
・構文:GoToステートメントの基本形
GoTo ラベル名
ラベル名:
処理
・例:条件に応じてエラー処理へ移動する
Sub CheckValue()
Dim inputValue As Long
inputValue = Range("A1").Value
If inputValue <= 0 Then
GoTo ErrorHandler
End If
MsgBox "正常な値です"
Exit Sub
ErrorHandler:
MsgBox "値が正しくありません"
End Sub
・なぜこの書き方にしているのか
理由は、
異常時の処理を1か所にまとめるため
です。
・別の書き方との違い
例えば:
If inputValue <= 0 Then
MsgBox "エラー"
Exit Sub
End If
この書き方でも動きます。
しかし、処理が増えると:
同じエラー処理が何度も出てくる
ようになります。
・実務でのメリット
- エラー処理を統一できる
- 修正箇所が1か所になる
- 引き継ぎが容易になる
✅ GoToが危険と言われる理由|処理の流れが見えなくなる典型例
GoToが問題になるのは、
処理の流れを整理せずに使った場合です。
この段階で使い方を誤ると、
数か月後に条件を追加したとき、
「なぜこの処理がここで動くのか分からない」
という状態が発生します。
特に担当者が変わった場合、
コードの流れが追えないだけで、
修正が止まってしまうこともあります。
このような状況を防ぐためにも、
誤用されやすいパターンを知っておくことが重要です。
・例:GoToを多用した危険なコード
Sub BadExample()
GoTo Step3
Step1:
MsgBox "Step1"
GoTo Step2
Step2:
MsgBox "Step2"
GoTo Step1
Step3:
MsgBox "Step3"
End Sub
・このコードで起きる問題
- 処理の流れが追えない
- 無限ループの可能性がある
- 修正が難しい
- デバッグが困難
・実務で実際に起きるトラブル
誰も修正できない
変更するのが怖い
原因が分からない
GoToが危険だと言われる理由は、単に命令そのものに問題があるのではなく、使い方や設計が整理されていない場合に、処理の流れが見えなくなるためです。
「では、どの場面なら安全に使えるのか」「避けるべき使い方は何か」といった判断基準については、「【VBA】GoToステートメントの理解と使用方法|禁止すべき?使うべき?実務での正しい判断基準」もあわせて確認しておくと、安心してGoToを使えるようになります。
✅ GoToを使うべき場面|エラー処理と終了処理を安全にまとめる方法
GoToは、
特定の用途に限定して使うことで非常に強力な手段になります。
この判断を曖昧にしたまま処理を追加していくと、
通常処理と例外処理が混ざり、
条件を増やすたびに修正箇所が増えていきます。
そして最終的には、
一部の条件だけ処理が止まる
といった現象が発生します。
そのため、
GoToは「何でも使える命令」ではなく、
用途を明確に限定して使うことが重要になります。
・例:エラー処理にGoToを使用する
Sub ErrorProcess()
On Error GoTo ErrorHandler
Dim result As Double
result = 10 / 0
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました"
End Sub
・なぜこの書き方にするのか
理由は:
すべてのエラー処理を1か所にまとめられるため
です。
・実務での重要なポイント
特に:
- ファイル操作
- データ更新
- 設定変更
では、
途中で止まると業務が止まる
可能性があります。
✅ GoToとExitの違い|処理を終了するか移動するかを判断する
GoToとExitは似ているようで、
役割がまったく異なります。
この違いを理解していないままコードを書くと、
終了処理が実行されないまま処理が終わり、
設定が戻らない
画面が更新されない
といった問題が発生することがあります。
特に、
- ScreenUpdating
- Calculation
- ファイル接続
などを扱う場合、
この違いは非常に重要になります。
・例:終了前に共通処理を実行する
Sub ProcessSample()
Application.ScreenUpdating = False
If Range("A1").Value = "" Then
GoTo ExitProcess
End If
MsgBox "処理を実行しました"
ExitProcess:
Application.ScreenUpdating = True
End Sub
・なぜこの書き方にしているのか
理由:
終了前の後処理を必ず実行するため
です。
・実務で起きやすい失敗
画面が更新されない
処理が止まったように見える
Excelが固まったように見える
Exitは単に処理を止める命令ではなく、どのタイミングで終了させるかによって、後処理の実行やデータの整合性に大きく影響します。
実務で安全に終了処理を設計するための具体的な考え方については、「【VBA】Exit Subの基本~実用的な使い方|処理制御と安全なマクロ設計を完全解説」もあわせて確認しておくと、想定外の停止トラブルを防ぎやすくなります。
✅ GoToを安全に使う設計ルール|将来の修正や引き継ぎを見据える
GoToは便利な命令ですが、
設計ルールを決めずに使い始めると、
処理が増えたときに一気に管理が難しくなります。
特に、業務で使用するマクロは、
一度作って終わりではありません。
- 条件が増える
- データ形式が変わる
- 担当者が変わる
といった変化が必ず発生します。
そのとき、
ルールのないGoToは
最も修正しにくいコードになります。
この章では、
将来の修正や引き継ぎを見据えた
安全な使い方を整理します。
・ルール:ジャンプ先は1か所に限定する
推奨:
ErrorHandler
ExitProcess
・ルール:前方ジャンプのみ使用する
上 → 下
・禁止:後方ジャンプ
下 → 上
理由:
無限ループの原因になるため
・ルール:意味のあるラベル名を使う
悪い例:
GoTo A
良い例:
GoTo ErrorHandler
GoTo ExitProcess 制御構文は便利ですが、使い方を誤るとエラーの原因が見えなくなり、後から修正が難しくなることがあります。
特にエラーをそのまま無視して処理を進めてしまう On Error Resume Next は、意図せず不具合を見逃す原因になることも少なくありません。
エラー制御の危険な落とし穴については、「【VBA】On Error Resume Nextでエラーを無視してエラーの制御|危険な理由」もあわせて確認しておくと、安全なマクロ設計につながります。
✅ まとめ:GoToは使い方を理解すれば安全な制御手段になる
GoToは危険な命令ではありません。
問題になるのは、
設計なしで使った場合
です。
・この記事のポイント
- GoToは処理を指定した場所へ移動させる命令
- エラー処理や終了処理に適している
- 条件分岐の代替として使うべきではない
- ルールを決めて使用することが重要
- 将来の修正や引き継ぎを見据えた設計が必要
・実務での次のステップ
GoToを理解したら、
次は:
- Exit Subの使い分け
- エラー処理の設計
- 処理停止と再開の管理
といった
処理制御全体の設計を理解することが重要になります。
その積み重ねが、
壊れにくく、引き継ぎやすいマクロを作る基盤になります。