こんにちは!Excel VBAの世界へようこそ。
マクロの記録ボタンを押すだけの世界から一歩踏み出し、自分の手でコードを書き始めると、ワクワクする一方で「エラーが出たらどうしよう…」という不安がよぎりますよね。
今回は、プログラミング中級者へのステップアップとして絶対に避けて通れない「エラーハンドリングと変数の初期化(クリーンアップ処理)」について、優しく、そして本質的に解説していきます。
ここをクリアできれば、あなたの書くVBAコードは「ただ動くもの」から「プロの現場で通用する堅牢なシステム」へと生まれ変わります。一緒にマスターしていきましょう!
—
1. なぜエラー時の「片付け」が必要なのか?
皆さんは、お友達を家に招いて盛大にパーティーをしたあと、散らかった部屋をそのままにして寝てしまいますか? おそらく、片付けをしてから休むはずです。
VBAのコードもこれと全く同じです。
プログラムが実行されるとき、Excelはメモリ(作業机)の上に「ファイルを開く」「巨大なデータを読み込む」「別のアプリを起動する」といったための資源(オブジェクトやメモリ)を確保します。
もし、処理の途中でエラーが発生してプログラムがプツッと強制終了してしまったらどうなるでしょう?
確保したメモリや開いたファイルが宙ぶらりんのまま放置(メモリリーク)され、Excelが重くなったり、最悪の場合はファイルが破損したりする原因になります。
だからこそ、「エラーが起きたときでも、必ず元の状態に片付けてから終了する(クリーンアップする)」という仕組みが必要なのです。
—
2. 事故現場を安全に収束させる「On Error GoTo」の基本
VBAには、エラーが発生したときにプログラムの行き先を変える魔法の言葉があります。それが `On Error GoTo` です。
まずは、図解の代わりに、コードの流れをイメージしてみましょう。
[正常なルート]
処理スタート ──> ファイル操作 ──> データ処理 ──> 正常終了 (Exit Sub)
│
【ここでエラー発生!】
▼
[異常なルート] (ジャンプ!)
エラーハンドラ ◄──────────────────────┘
┗ メモリ解放 & 変数の初期化 ──> 終了
この流れをコードで表現したのが、以下の「黄金の定型パターン」です。
—
3. 【実践】メモリリークを防ぐクリーンアップ・テンプレート
現場のプロが必ず使っている、エラーハンドリングの基本形がこちらです。そのままコピペしてテンプレートとして使えます。
Sub ProErrorHandlingTemplate()
‘ 1. 変数の宣言
Dim wbTarget As Workbook
Dim wsData As Worksheet
Dim isSucceeded As Boolean
‘ 初期値を設定
isSucceeded = False
‘ 2. エラー発生時のジャンプ先を指定
On Error GoTo ErrorHandler
‘ — 【ここからメインの処理】 —
‘ 例:処理対象のブックを開く(メモリを消費する操作)
Set wbTarget = Workbooks.Open(ThisWorkbook.Path & “\data.xlsx”)
Set wsData = wbTarget.Sheets(1)
‘ 何らかの処理…
wsData.Range(“A1”).Value = “処理完了”
‘ 正常にここまで到達したフラグを立てる
isSucceeded = True
‘ — 【ここまでメインの処理】 —
CleanUp:
‘ ==========================================
‘ 3. クリーンアップ処理(正常・異常にかかわらず必ず実行)
‘ ==========================================
‘ 開いたままのオブジェクトがあれば閉じて解放する
If Not wbTarget Is Nothing Then
‘ 保存せずに閉じる場合(必要に応じて変更してください)
wbTarget.Close SaveChanges:=False
Set wbTarget = Nothing ‘ メモリから完全消去
End If
Set wsData = Nothing
‘ 画面描画や警告表示などを元に戻す(重要)
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Exit Sub ‘ これがないと、エラーが起きていないのにErrorHandlerを通ってしまう!
ErrorHandler:
‘ ==========================================
’ 4. エラー発生時の処理
‘ ==========================================
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical, “システムエラー”
‘ クリーンアップ処理へジャンプ
Resume CleanUp
End Sub
—
4. コードの重要ポイントを深掘り解説
初心者の方が特に躓きやすいポイントを、先輩エンジニアの視点から3つに絞って解説します。
① `Exit Sub` の壁を忘れない
`CleanUp:` ラベルの直前に `Exit Sub` があることに気づきましたか?
これ、もの凄く重要です。もしこの `Exit Sub` がないと、プログラムが正常に終わったはずなのに、下の `ErrorHandler` まで流れ落ちていってしまいます。 「正常に終わったら、お片付け(CleanUp)をしたあと、ここでスッとプログラムを終了してね」という命綱の役割をしています。
② オブジェクト変数には `Nothing` を入れる
VBAでは、処理が終わったあとに `Set wsData = Nothing` と記述してメモリ上の参照を明示的に切る作法(ガベージコレクションの補助)が、コードの安定性を飛躍的に高めます。特に外部ブックやデータベース接続を扱うときは必須です。
③ 環境設定(画面描画など)の復元
マクロの高速化のために `Application.ScreenUpdating = False`(画面描画の停止)を使ったことはありませんか?
もしエラーで止まったときにこれが `False` のまま放置されると、Excelの画面がフリーズしたように見え、ユーザーがパニックを起こします。クリーンアップ処理の中で必ず元の `True` に戻すのがプロの流儀です。
—
5. まとめ:ここをクリアすれば、VBAの基本はバッチリ!
お疲れ様でした!今回は少し高度な「エラーハンドリングとクリーンアップ」について解説しました。
- エラーが起きても、開いたものは閉じる、確保したメモリは解放する。
- `On Error GoTo` でエラーハンドラへ飛ばし、必ず共通の `CleanUp` ラベルを通る構造にする。
- 正常終了時も、異常終了時も、お片付けの出口は一つにまとめる。
この型を一度覚えてしまえば、どんなに複雑なマクロを書くことになっても、あなたのコードは常に安全で、エラーに強いものになります。
ここをクリアしたあなたなら、もう「マクロの記録」に頼っていた頃の初心者ではありません。自信を持って、次の自動化の扉を開いていきましょう!
