VBAマクロを実行しているとき、
「途中でエラーになったから、前の処理に戻りたい」
「条件を満たさなかった場合だけ、1つ前のステップを再実行したい」
といったケースに遭遇することがあります。
しかし、VBAには「戻る」ボタンのような直接的な命令はありません。
そのため、論理的に前の処理を再現する方法を設計する必要があります。
この記事では、VBAで「前の処理に戻る」動作を実現する考え方とコード例を解説します。
条件分岐やフラグ管理、エラー処理の活用法まで含め、実務に応用できる内容を丁寧に紹介します。
目次
✅ 「前の処理に戻る」はどういう意味か?
まず、「前の処理に戻る」とはどのような状態を指すのかを明確にしておきましょう。
状況によって、意味が変わります。
・前のステップをやり直す
たとえば、3段階の処理のうち2段階目で問題が起きた場合に、
「1段階目に戻って再実行したい」といったケースです。
・同じブロック内で再試行する
入力チェックやファイルの存在確認など、
条件を満たさない場合に「もう一度同じ処理を行いたい」ことがあります。
これは“戻る”というより“繰り返す”動作に近いものです。
・エラー発生時に直前の状態へ戻す
途中で予期しないエラーが起きたとき、
「その直前までの状態に戻して再開したい」場合もあります。
この場合は、**エラー処理構文(On Error)**を使って制御します。
✅ 基本構文:「GoTo」で処理を戻す
VBAで任意の箇所に処理を戻したいとき、
最もシンプルなのが「GoToステートメント」です。
Sub SampleGoTo()
Dim answer As VbMsgBoxResult
Step1:
answer = MsgBox("処理を続けますか?", vbYesNo)
If answer = vbNo Then
GoTo Step1 ' 前の処理に戻る
End If
MsgBox "処理を完了しました。"
End Sub
この例では、「いいえ」を選択すると同じステップに戻ります。
つまり、条件を満たすまで同じ処理を繰り返す構造です。
参考:【VBA】Application.Gotoメソッドとは:セル・範囲を移動
⚙ ポイント:
- GoToを多用するとコードが読みにくくなりがちなので、
「戻る箇所」を限定的に使うのがベストです。 - 長大なマクロでは「Do Loop」構文で代替するのが推奨されます。
✅ 「Do Loop」で前の処理を再実行する方法
GoToの代わりに「Do Loop」を使えば、
自然な流れで“前に戻る”構造を作ることができます。
Sub RetryExample()
Dim filePath As String
Do
filePath = InputBox("ファイル名を入力してください")
If Dir(filePath) = "" Then
MsgBox "ファイルが見つかりません。もう一度入力してください。"
Else
Exit Do ' 条件を満たしたら抜ける
End If
Loop
MsgBox "ファイルが見つかりました。処理を続行します。"
End Sub
この構文では、ファイルが見つからない限り何度でも同じ処理に“戻る”ことができます。
GoToよりも読みやすく、実務でも多用されるパターンです。
参考:【VBA】処理が終わってから次の処理を実行する方法|DoEvents・待機・同期制御の基本と実例
✅ 処理ステップを管理して「戻る」設計を行う
複数の処理が連続している場合、ステップ番号や状態を変数で管理すると柔軟に戻る制御ができます。
Sub StepReturnExample()
Dim stepNo As Integer
stepNo = 1
Do While stepNo <= 3
Select Case stepNo
Case 1
MsgBox "ステップ1:データを取得します。"
stepNo = 2
Case 2
MsgBox "ステップ2:データを集計します。"
If MsgBox("やり直しますか?", vbYesNo) = vbYes Then
stepNo = 1 ' 前の処理に戻る
Else
stepNo = 3
End If
Case 3
MsgBox "ステップ3:結果を出力します。"
stepNo = 4 ' 終了
End Select
Loop
MsgBox "すべての処理が完了しました。"
End Sub
このようにステップ番号を制御すれば、
ユーザー操作に応じて「戻る」「進む」を自由に制御可能です。
処理の流れが明確になり、エラーにも強い構成になります。
参考:【VBA】Select Case文の使用例と適用パターン|条件分岐を効率化する方法
✅ エラー発生時に「前の処理」に戻る方法
予期せぬエラーが起きた場合、VBAは通常そのまま停止します。
しかし、「On Error GoTo」を使えば、前の処理を再試行する構造を実現できます。
Sub ErrorReturnExample()
On Error GoTo ErrHandler
Dim ws As Worksheet
Set ws = Sheets("集計")
ws.Range("A1").Value = "テスト"
MsgBox "正常終了"
Exit Sub
ErrHandler:
MsgBox "エラーが発生しました。再試行します。"
Resume Next ' 前の行の次から再開
End Sub
「Resume」には3つの使い方があります。
参考:【VBA】On Error Resume Nextでエラーを無視してエラーの制御
参考:【VBA】処理を取り消す方法|強制終了・中断・エラー時の対策まとめ
| キーワード | 意味 |
|---|---|
| Resume | エラーが発生した行を再実行 |
| Resume Next | エラーの次の行から実行再開 |
| Resume [ラベル名] | 任意の処理位置へ戻る |
たとえば、「Resume Step1」のように書くと、指定したラベルに戻ることができます。
これを利用して、エラー発生時に前段階へ戻す仕組みを作ることができます。
✅ 条件付きで前の処理をスキップ・再試行する
場合によっては、前の処理に戻るのではなく「スキップして次へ」または「戻して再試行する」ことも求められます。
以下はその応用例です。
Sub ConditionalReturnExample()
Dim i As Long
For i = 1 To 10
If Cells(i, 1).Value = "" Then
MsgBox i & "行目が空白です。前の処理に戻ります。"
i = i - 1 ' カウンタを戻して再試行
GoTo ContinueLoop
End If
ContinueLoop:
Debug.Print "処理:" & i
Next i
MsgBox "完了しました。"
End Sub
ここでは「i = i - 1」によって、実質的に“前の行の処理”に戻るようにしています。
ループ処理ではこのようにカウンタを操作することで、柔軟に再実行が可能です。
✅ 実務でよく使われる「前処理復元」のテクニック
現場で求められる“前に戻る”動作は、
単純なジャンプではなく「前の状態を復元して再開する」ことが多いです。
その代表的な方法を紹介します。
・元データをバックアップしておく
処理の最初にデータをバックアップしておけば、
エラー発生時に「前の状態」に戻せます。
Sub BackupBeforeProcess()
Dim backupRange As Variant
backupRange = Range("A1:A10").Value ' 配列に保持(前の状態)
On Error GoTo RestoreData
' --- 処理 ---
Range("A1:A10").ClearContents
' ※ここでエラー発生を想定
Exit Sub
RestoreData:
Range("A1:A10").Value = backupRange ' 前の処理状態を復元
MsgBox "エラーのためデータを復元しました。"
End Sub
これにより、途中で失敗しても「前の状態へ戻す」ことが可能です。
・チェックポイントを設定する
長い処理では、「どこまで進んだか」をログに記録しておくと、
再実行時に途中から再開したり、前の処理だけ再実行することができます。
Sub CheckPointExample()
Dim currentStep As String
currentStep = "Start"
On Error GoTo HandleError
currentStep = "Import"
' --- データ読み込み処理 ---
currentStep = "Calc"
' --- 計算処理 ---
currentStep = "Output"
' --- 出力処理 ---
MsgBox "すべての処理が完了しました。"
Exit Sub
HandleError:
MsgBox "エラー発生:" & currentStep & "で停止しました。" & vbCrLf & "必要に応じて前の処理に戻って再実行してください。"
End Sub
このように「どの処理で止まったか」を可視化しておけば、
再開位置や戻るポイントを簡単に把握できます。
✅ 実務例:入力チェックで前に戻すマクロ
以下は、実務で頻繁に使われる「入力不備なら前へ戻る」例です。
Sub InputValidationExample()
Dim nameValue As String
Dim ageValue As Variant
Step1:
nameValue = InputBox("氏名を入力してください:")
If nameValue = "" Then
MsgBox "氏名は必須です。再入力してください。"
GoTo Step1
End If
Step2:
ageValue = InputBox("年齢を入力してください:")
If Not IsNumeric(ageValue) Or ageValue <= 0 Then
MsgBox "正しい数値を入力してください。"
GoTo Step2
End If
MsgBox "登録完了:" & nameValue & "(" & ageValue & "歳)"
End Sub
ユーザーの入力内容を逐次チェックし、不備があればそのステップに戻して再入力を促す構造です。
これも「前の処理に戻る」典型的な応用例です。
✅ 「前の処理に戻る」構造をきれいに保つための注意点
「戻る」構造を設計すると、コードが複雑化しやすくなります。
以下のポイントを押さえておきましょう。
- GoToの使いすぎに注意
→ ループ構文や関数化で可読性を保つ。 - 状態を変数で管理する
→ 処理の進行度を「ステップ番号」「フラグ」で保持。 - エラー処理と併用する
→ Resume構文で安全に再試行できるようにする。 - データのバックアップを取る
→ 前の状態に戻せる仕組みを用意する。
■ まとめ:VBAで「前の処理に戻る」には設計と工夫が必要
- VBAには「戻る」命令はないが、GoTo・Do Loop・変数管理で再現可能
- 「ステップ制御」や「フラグ管理」で柔軟に前の段階へ戻せる
- エラー時は
On Error GoToとResumeで安全に再実行 - 実務では、バックアップやチェックポイントで「前の状態の復元」が効果的
- コードの流れを見える化しておくと、保守性が高まる
VBAで“前の処理に戻る”動作をうまく組み込むと、
マクロが「止まらない」「壊れない」安定したツールになります。
単なるやり直しではなく、状態を保った再試行ロジックとして設計するのがプロのVBA技術です。