【VBA】途中で処理を終了する方法!初心者にもできるエラー回避の決定版テクニック
VBAで「処理が止まらない…」「無限ループから抜け出せない…」
こんな経験をしたことはありませんか?
こんな問題は
Exit文・End文・GoTo文で簡単に解決
することができます。
この記事では、Exit文・End文の基本から、緊急時のCtrl+Break、さらにDoEvents関数を使った高度なキャンセル処理まで、エクセル業務で本当に使える終了テクニックを完全解説します。
「なぜそうなるのか?」から「どう使い分けるのか?」まで、サンプルコードを使って分かりやすくお伝えするので、
読み終わる頃にはエラーに怯えることなく自信を持ってVBAを書けるようになるでしょう。
VBAで処理を途中で終了する基本的な3つの方法
VBAで処理を途中で終了する方法は、プログラムの効率化とエラー回避において非常に重要な技術です。
なぜなら、
大量のデータ処理や複雑な計算処理において、条件によって処理を停止することで無駄な処理時間を削減し、システムの負荷を軽減できるから
です。
特にVBA初心者の方は、「無限ループ」や「メモリ不足によるフリーズ」に陥ってしまうことが多いため、適切な終了処理の実装は必須スキルといえます。
簡単に実装できる基本となる3つの方法をご紹介します。
Exit文を使った部分終了の方法
Exit文は、現在実行中のプロシージャやループから部分的に抜け出すための最も基本的な終了方法です。
この方法が推奨される理由は、
プログラム全体を停止することなく特定の処理ブロックのみを終了できるため、プログラムの流れを制御しやすいから
です。
たとえば、For文やDo文のループ処理中に特定の条件が満たされた場合に、そのループのみを抜け出したい場面で威力を発揮します。
Sub ExitSample()
Dim i As Integer
For i = 1 To 10
If i = 5 Then
Exit For 'i=5の時にFor文を抜ける
End If
Debug.Print i
Next i
Debug.Print "ループ終了後の処理"
End Sub
このコードでは、
変数iが1から10まで順番に処理される予定でしたが、i=5になった瞬間にExit For文が実行され、For文から抜け出す。
結果として1、2、3、4のみが出力され、その後「ループ終了後の処理」が実行される
という内容です。
Exit文はループの種類に応じてExit For、Exit Do、Exit Subなど使い分けることで、柔軟な処理制御が可能になります。
End文を使った全体終了の方法
End文は、VBAプログラム全体を完全に停止させる強力な終了方法です。
この方法は、
致命的なエラーが発生した場合や、プログラムの続行が危険と判断される状況において、確実にすべての処理を停止する
ときに使用します。
特に、データベースへの書き込み処理中にエラーが発生した場合など、データの整合性を保つために即座に全処理を停止する必要がある場面で重要な役割を果たします。
Sub EndSample()
Dim result As Integer
result = 100 / 0 'ゼロ除算エラーが発生する可能性
If Err.Number <> 0 Then
MsgBox "致命的なエラーが発生しました"
End 'プログラム全体を終了
End If
Debug.Print "この行は実行されません"
End Sub
このコードでは、
ゼロ除算による致命的なエラーが発生した場合、End文によってVBAプログラム全体が即座に停止する
という内容です
End文が実行されると、それ以降のすべてのコードは実行されず、VBAエディタの実行状態も完全にリセットされます。
ただし、End文は非常に強力なため、通常の処理制御ではExit文を使用し、本当に必要な場合のみ使用するようにしましょう。
Return文とGoTo文を使った条件分岐終了
Return文とGoTo文を組み合わせた条件分岐終了は、複雑な処理フローにおいて柔軟な終了制御を実現する高度な方法です。
この手法が有効な理由は、
複数の条件判定を経て異なる終了処理を実行したい場合や、エラー処理とクリーンアップ処理を組み合わせた安全な終了処理を実装したい場合に、構造化されたプログラムを作成できるから
です。
特に、大規模なデータ処理や外部システムとの連携処理において、処理の状況に応じた適切な終了処理が必要な場面で威力を発揮します。
Sub GotoReturnSample()
Dim data As String
Dim errorFlag As Boolean
data = "サンプルデータ"
errorFlag = False
' データ検証処理
If Len(data) = 0 Then
errorFlag = True
GoTo ErrorExit
End If
' 正常処理
Debug.Print "処理成功: " & data
GoTo NormalExit
ErrorExit:
Debug.Print "エラーが発生しました"
' エラー時のクリーンアップ処理
Return
NormalExit:
Debug.Print "正常終了しました"
Return
End Sub
このコードでは、
データが空の場合はGoTo ErrorExitによってエラー処理部分にジャンプし、正常な場合はGoTo NormalExitで正常終了処理に移行する
という内容です。
各終了点でReturn文を使用することで、プロシージャから適切に抜け出し、呼び出し元に制御を戻すことができます。
【場面別】VBA処理終了のパターンと具体的なコード例
VBA処理終了のパターンは、使用する構文や処理の種類によって最適な手法が異なります。
実際の業務では、単純なループ処理から複雑なプロシージャ呼び出しまで様々な場面で処理終了が必要になるため、それぞれの特性を理解して適切に使い分けることが重要です。
特に、For文やDo文などのループ処理、SubプロシージャやFunctionプロシージャでの終了処理、条件分岐による動的な終了制御は、実務で頻繁に使用される基本パターンです。
どのような処理においても安全で効率的な終了制御を実装できるようしましょう。
For文・Do文のループ処理を途中で抜ける方法
ループ処理を途中で抜ける方法は、繰り返し処理の効率化において最も重要な技術の一つです。
大量のデータを処理する際に、目的の結果が見つかった時点で残りの無駄な処理を省略することで、実行時間の大幅な短縮とメモリの節約に繋がります。
繰り返し処理が実装されたマクロにおいて、
セルの検索処理やデータ集計処理では、条件が満たされた時点でループを抜けることが一般的な手法
です。
Sub LoopExitSample()
Dim i As Integer
Dim targetFound As Boolean
' For文での検索処理
For i = 1 To 1000
If Cells(i, 1).Value = "検索対象" Then
targetFound = True
Exit For '目的のデータが見つかったらループを抜ける
End If
Next i
' Do文での条件処理
Dim counter As Integer
counter = 1
Do
If counter > 100 Then
Exit Do '上限に達したらループを抜ける
End If
counter = counter + 1
Loop
Debug.Print "処理完了"
End Sub
このコードでは、
For文で1000行のセルを検索する処理において、目的の「検索対象」が見つかった時点でExit For文により即座にループを抜ける。
また、Do文では counter が100を超えた場合にExit Do文でループを終了する
という内容です。
このように、Exit For文とExit Do文を適切に使い分けることで、不要な処理を回避し、プログラムのパフォーマンスを大幅に向上させることができます。
関連記事「For文と関数IFの組み合わせ方法」では、条件分岐と繰り返し処理を組み合わせた効率化マクロの作り方が紹介されています。
SubプロシージャとFunctionプロシージャの終了方法
SubプロシージャとFunctionプロシージャの終了方法は、モジュール化されたプログラム開発において、適切な処理制御を実現するための基本技術です。
Subプロシージャは処理の実行のみを目的とするのに対し、Functionプロシージャは戻り値を返すことが前提となっているため、
それぞれ異なる終了処理が必要になります。
特に、エラー処理や条件分岐において、適切なタイミングでプロシージャから抜け出すことで、プログラムの安定性と保守性を大幅に向上させることができます。
Sub SubProcedureSample()
Dim userName As String
userName = InputBox("ユーザー名を入力してください")
' ユーザーがキャンセルした場合は処理を終了
If userName = "" Then
MsgBox "処理をキャンセルしました"
Exit Sub 'Subプロシージャを終了
End If
Debug.Print "ようこそ " & userName & " さん"
End Sub
Function FunctionSample(inputValue As Integer) As String
' 負の数が入力された場合は空文字を返して終了
If inputValue < 0 Then
FunctionSample = ""
Exit Function 'Functionプロシージャを終了
End If
FunctionSample = "正の数: " & inputValue
End Function
このコードでは、
Subプロシージャにおいてユーザーが入力をキャンセルした場合、Exit Sub文により処理を終了する。
一方、Functionプロシージャでは負の数が入力された場合、戻り値に空文字を設定してからExit Function文で終了する
という内容です。
Exit Sub文とExit Function文の使い分けにより、それぞれのプロシージャの特性に応じた適切な終了処理を実装できます。
関連記事「Functionプロシージャの使い方」では、戻り値の設定や配列との組み合わせ方法が紹介されています。
条件に応じて処理を分岐・終了する実践コード
条件に応じた処理分岐・終了は、実際のエクセル業務に導入される効率化マクロには必要不可欠なVBAです。
重要な理由は、
ユーザーの入力値やシステムの状態に応じて動的に処理を変更することで、柔軟で安全なVBAコードに仕上げることができるから
です。
特に、データ検証、ファイル操作、データベース接続などの処理において、様々な条件や例外状況に対応するため、複数の終了パターンを用意することが実務では必須となります。
Sub ConditionalExitSample()
Dim filePath As String
Dim fileSize As Long
Dim processMode As Integer
filePath = "C:\data\sample.xlsx"
processMode = 1 ' 1:通常処理, 2:高速処理, 3:詳細処理
' ファイル存在チェック
If Dir(filePath) = "" Then
MsgBox "ファイルが見つかりません: " & filePath
Exit Sub
End If
' ファイルサイズチェック
fileSize = FileLen(filePath)
If fileSize > 10485760 Then ' 10MB以上
MsgBox "ファイルサイズが大きすぎます"
Exit Sub
End If
' 処理モードによる分岐
Select Case processMode
Case 1
Debug.Print "通常処理を開始します"
Case 2
Debug.Print "高速処理を開始します"
Case 3
Debug.Print "詳細処理を開始します"
Case Else
MsgBox "無効な処理モードです"
Exit Sub
End Select
Debug.Print "処理が正常に完了しました"
End Sub
このコードでは、
ファイルの存在確認、サイズチェック、処理モードの検証という複数の条件に応じて、適切なタイミングでExit Sub文による終了処理を実行する。
各条件でエラーが発生した場合は即座に処理を終了し、すべての条件をクリアした場合のみ本来の処理を継続する
という内容です。
このような条件分岐と終了処理の組み合わせにより、予期しないエラーを防ぎ、安全で信頼性の高いプログラムを実現できます。
VBA処理が固まった時の強制終了テクニック
VBA処理が固まった時の強制終了テクニックは、VBA開発において避けて通れない重要なスキルです。
なぜなら、
複雑な処理や大量データの操作において、無限ループやメモリ不足によるフリーズは必ず発生するトラブルであり、適切な対処法を知らないと作業が完全に停止してしまうから
です。
デバッグ中にプログラムが応答しなくなる。。。
こんな問題を解決することができます。
ここからは、キーボードショートカット、プログラム内での制御機能、システムレベルでの強制終了という3段階の対処法をご紹介します。
Ctrl+BreakキーとEscキーによる緊急停止
Ctrl+BreakキーとEscキーによる緊急停止は、VBA実行中のプログラムを即座に中断するための最も基本的で効果的な方法です。
プログラムが無限ループに陥った場合や予想以上に長時間実行される処理において、システムの応答性を維持しながら安全に処理を停止することができます。
特に、大量のセル操作やファイル処理を行う際に、処理時間が予想を上回る場合の緊急措置として非常に有効です。
Sub LongProcessSample()
Dim i As Long
Dim j As Long
' 長時間処理のサンプル(意図的に重い処理)
For i = 1 To 1000000
For j = 1 To 1000
' 複雑な計算処理
Cells(1, 1).Value = i * j
Next j
' この処理中にCtrl+Breakキーで停止可能
If i Mod 1000 = 0 Then
Debug.Print "進行状況: " & i & "/1000000"
End If
Next i
Debug.Print "処理完了"
End Sub
このコードは意図的に重い処理を実行するサンプルで、
実行中にCtrl+Breakキー(Windowsの場合)またはEscキー(Macの場合)を押すことで、VBAの実行を中断できる。
中断されると「コードの実行が中断されました」というダイアログが表示され、「終了」ボタンで完全に停止、「継続」ボタンで処理を再開、「デバッグ」ボタンでコードエディタに戻ることができる。
という内容です。
サンプルコードを使って処理を中断できるか実際に試してみてください。
DoEvents関数を使ったキャンセル処理の実装
DoEvents関数は、一時的にVBAの処理を中断してWindowsに制御を渡し、マウスクリックやキーボード入力などのユーザー操作を処理できるようにします。
長時間実行される処理において、ユーザーが任意のタイミングで処理を中断できる機能を提供する高度な技術です。
DoEvents関数の使用は、
プログラム内部にキャンセル機能を組み込むことができ、システムの応答性を維持しながら処理を制御できる
という特徴があります。
特に、進捗表示と組み合わせることで、ユーザーが安心して長時間処理を実行できる環境を提供できます。
Sub DoEventsCancel()
Dim i As Long
Dim cancelFlag As Boolean
Dim userForm As Object ' ユーザーフォームの参照
' キャンセルフラグの初期化
cancelFlag = False
For i = 1 To 100000
' 処理の実行
Cells(i, 1).Value = "データ" & i
' 100回に1回DoEventsを実行してシステムの応答性を維持
If i Mod 100 = 0 Then
DoEvents ' Windowsメッセージを処理
' 進捗表示とキャンセルチェック
Application.StatusBar = "処理中... " & i & "/100000 (" & _
Format(i / 100000, "0%") & ")"
' Escキーが押されたかチェック
If Application.EnableCancelKey = xlErrorHandler Then
If MsgBox("処理を中断しますか?", vbYesNo) = vbYes Then
cancelFlag = True
Exit For
End If
End If
End If
Next i
' 処理結果の表示
If cancelFlag Then
Application.StatusBar = "処理がキャンセルされました"
Else
Application.StatusBar = "処理が完了しました"
End If
End Sub
このコードでは、
DoEvents関数を定期的に呼び出すことで、長時間処理中でもWindowsのメッセージ処理を継続し、システムの応答性を維持する。
100回の処理ごとにDoEventsを実行し、同時に進捗表示とキャンセルチェックを行う。
ユーザーがEscキーを押すか特定の条件が満たされた場合、確認ダイアログを表示してキャンセルフラグを設定し、Exit For文でループを抜ける
という内容です。
この実装により、ユーザーが安心して長時間処理を実行できる環境を提供できます。
関連記事「DoEvents関数の使い方」では、「応答なし」の5つの対処法が紹介されています。
タスクマネージャーからの強制終了方法
タスクマネージャーからの強制終了方法は、VBAプログラムが完全に応答しなくなった場合の最終手段として重要な技術です。
Ctrl+BreakキーやDoEvents関数でも制御できないほど深刻なエラーが発生した場合に、タスクマネージャーでプロセスを強制終了することで、システム全体の安定性を回復することができます。
ただし、この方法は保存されていないデータが失われる可能性があるため、最後の手段として慎重に使用してください。
Sub RiskyProcessSample()
' 危険な処理の例(実際には実行しないでください)
Dim arr() As String
Dim i As Long
' メモリを大量に消費する処理
Do
i = i + 1
ReDim Preserve arr(1 To i * 1000000)
arr(i * 1000000) = "大量データ" & i
Debug.Print "配列サイズ: " & UBound(arr)
Loop
' この処理は無限ループでメモリを消費し続けるため
' 最終的にシステムがフリーズする可能性があります
End Sub
このコードは、永遠とVBAの処理を続ける危険なコードです。
このような危険な処理が実行されてしまった場合、まずCtrl+Alt+Deleteキーを押してタスクマネージャーを起動します。
プロセスタブで「Microsoft Excel」または「EXCEL.EXE」を選択し、「タスクの終了」ボタンをクリックすることで、Excel全体を強制終了することが可能。
Windows 10以降では、Ctrl+Shift+Escキーで直接タスクマネージャーを起動することも可能です。
ただし、この方法を使用すると保存されていないファイルのデータは失われるため、定期的な保存と、上記で説明したDoEvents関数を使用した安全な処理制御の実装が重要になります。
VBA初心者が効率化マクロを導入する方法
VBAなんて扱ったことないけど、素早く処理が完了する効率化マクロを導入したい!
こんな問題を解決する方法がこちら
- マクロの開発を外注に依頼する
- マクロが設定されたエクセルファイルをダウンロードする
- 参考書やネットでVBAスキルを身に付ける
VBAスキルを身に着ける前は、「マクロ開発の外注」で対応していましたが、
今では自分で効率化マクロをサクッと導入しちゃいます。
完成されたマクロを使ってエクセル業務を処理する
↓
作業効率が2倍以上アップ!!
↓
便利すぎて自分でもマクロを設定したいと考え始める
↓
参考書やネットの情報でVBAスキルを身に付ける
↓
マクロ開発を代行できる程のスキルを習得
VBAは
他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
という特徴があります。
外注した方が楽だけど、費用がかかる。自分で導入すれば費用は0円だけど時間がかかる。。
いずれにせよ、効率化マクロを導入できれば作業効率が飛躍的にアップするのは間違いありません。
あなたに合った方法で導入しちゃいましょう。
マクロ開発を外注に依頼する
マクロ開発を外注に依頼する方法は
VBAを全く扱えない方でもエクセル作業を自動化できる最も簡単な方法
です。
「こんなデータ抽出作業を自動化したい」「作った資料を自動的にPDFで保存したい」「決まった様式に写真を自動で貼り付けたい」
こんな感じで実現したい内容を依頼するだけで業務内容に合ったマクロを開発してくれます。

ガッツポーズの人
デメリットは、費用がかかることだけ。
開発内容、依頼先によってかかる費用は大きく異なります。
私が会社員の頃利用していた業者さんは1マクロあたり2万円~3万円の費用がかかりました。

疑問がある人
ちなみに、マメBlogでもエクセルマクロ開発代行サービスを承っています。
開発内容の確認、VBAコードの設定、動作確認後の調整、など全ての工程を私(マメ父ちゃん)が行っているので、
費用が安い!スピード納期!!
でやらせてもらっています。
ほとんど独学で身に付けたVBAスキルなので、内容によっては開発できないこともあるのでご了承ください。
ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。
マクロが設定されたエクセルファイルをダウンロードする
VBA初心者でも『マクロが設定されたエクセルファイルをダウンロード』することで、
すぐに使っているエクセルにマクロを導入することができます。
VBA初心者でも形になっているマクロをゲットできる、費用が安い、
というメリットがあります。
しかし、
想定するマクロを見つけることが難しい、業務内容に合わせるためのアレンジが必要
というデメリットもあります。

ガッツポーズの人
個人ブログやファイルを販売できるサイト「note」や「Tips」ではいろんなマクロの情報が掲載されているので是非参考にしてみてください。
今までマメBlogで受注した効率化マクロを下記のnoteで掲載していますので併せてチェックしてみてください。
参考書やネットでVBAスキルを身に付ける
先程も紹介しましたが、
VBAは他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
プログラミングです。
言い換えると、
情報量が豊富なので自分で勉強できちゃう
ということです。
私のVBAスキルはほとんど独学で身に付けたもので、
考えた処理のほとんどをVBAで表現できるレベルにまで到達した!
と思っています。
私の作ったマクロをプロのプログラマーが見れば、
お前の書くコードはインチキだ!「変数の宣言」とか「引数」を正しく使えよ!!
と感じるはずです。
でも、
私からすればどうでもいい!!!想定した内容を正しく処理できればよくないですか!?
独学であっても『写真を貼り付けるマクロ』『全てのシートをPDF出力するマクロ』『連番を振るマクロ』など、
業務内容に合ったマクロを開発できるようになれます。
独学でVBAスキルを身に付けるコツは、
エラーが発生してもいいからひたすらコードを書く、なんでもいいからエクセル作業をマクロ化してみる
です。
とは言っても、全くの知識0の方は何をすればいいかわからないですよね。
VBA知識0の初心者の方は、参考書『たった1秒で仕事が片づくExcel自動化の教科書【増強完全版】』を読んでみてください。
VBAの知識0の方でもすいすい読み進められる内容になっています。
やさしい内容にも関わらず「え!!VBAを使えばこんなことできるの!?」と感動すると思います。
実際に私はこの参考書を読んでからVBAの勉強を始めました。

ひらめく人
VBAの魅力を発見した後は、
ひたすら自動化したい内容のコードを書くだけ
です。
【VBA 固まる】【VBA 無限ループ解除】でネット検索すれば知りたいコードをすぐにゲットできます。
実現したい処理に向かって、「調べる→書いてみる→エラーを改善する→調べる」を繰り返していると
自然といろんなマクロが作れるようになっているはずです。
VBAに興味が湧いてきたという方は今からVBA学習をスタートさせちゃいましょう。