こんにちは!Excel VBAの世界へようこそ。
マクロの記録から一歩踏み出し、「自分でコードを書けるようになりたい!」と奮闘しているあなたへ。
今回は、VBAプログラミングにおいて避けて通れない、しかし中級者へのステップアップには絶対に欠けない「エラーハンドリングと変数の初期化」という極めて重要なテーマについてお話しします。
「エラーが起きたとき、変数の値ってどうなっているの?」
「途中でマクロが止まったせいで、変数が変な状態のまま残ってしまった…」
そんな疑問を持ったことはありませんか?
ここをクリアすれば、あなたの書くマクロは見違えるほど堅牢になり、予期せぬバグに怯える必要がなくなります。優しく、そして本質的なところまで丁寧に解説していきますね。ここをクリアすれば、Excel VBAの基本はバッチリですよ!一緒にマスターしていきましょう!
—
1. なぜ「エラーハンドリング」が必要なのか?
私たちが書いたVBAコードは、完璧に動いているうちは良いのですが、現実のビジネス環境では様々な「想定外」が起こります。
- 処理対象のファイルがない!
- シート名が書き換わっていて見つからない!
- 数値を入れるべきセルに文字が入っていた!
こうしたトラブルが発生したとき、VBAは容赦なく「実行時エラー」を発生させ、黄色いハイライトとともに強制終了します。
ここで問題になるのが、「エラーが発生した瞬間、メモリ上の変数はどうなっているのか?」という点です。
ゾンビ化した変数の恐怖
VBAでは、エラーが発生して処理が中断されたとき、その瞬間に変数が保持していた値やオブジェクトは、そのままメモリ上に残されます。
もし、その「中途半端な状態の変数」を抱えたまま、再びマクロを動かしたり、誤ったデータを上書き保存してしまったりしたら……想像するだけでゾッとしますよね。実務の現場では、これが原因でデータが破損する大事故につながることもあります。
だからこそ、「エラーが起きたら、安全に後始末(クリーンアップ)をして、変数をキレイに初期化する」という仕組みが必要なのです。
—
2. On Error GoTo の基本と「ジャンプ」のからくり
VBAでエラーハンドリングを行うための基本文法が `On Error GoTo` です。
まずは、その仕組みを視覚的に捉えてみましょう。
[正常な処理の流れ]
1. 変数を宣言・初期化
2. データを処理する ──(ここでエラー発生!)──┐
3. ファイルを保存する │
4. 終了 │
▼
[エラーハンドリングの流れ] [エラー処理ラベル]
1. 変数を宣言・初期化 OnError_Label:
2. データを処理する ──(エラー)──> ・画面更新を戻す
3. (スキップされる) ・変数をクリア・初期化
4. 終了 <──────────────────────────・メッセージ表示
コードの構造としては、あらかじめ「エラーが起きたらここに飛んでね」という避難場所(ラベル)を用意しておくイメージです。
基本的なコードの形
実際のVBAコードで見てみましょう。
Sub SampleErrorHandling()
‘ 1. 変数の宣言
Dim targetValue As Long
Dim ws As Worksheet
‘ 2. エラー発生時のジャンプ先を指定
On Error GoTo ErrorHandler
‘ — 処理のメイン —
Set ws = ThisWorkbook.Sheets(“存在しないシート”) ‘ ← ここでエラーが起きる!
targetValue = ws.Range(“A1”).Value
MsgBox “処理が正常に完了しました。”, vbInformation
‘ 3. 正常終了時は、ここでプロシージャを抜け出す(重要!)
Exit Sub
ErrorHandler:
‘ — エラー発生時のクリーンアップ処理 —
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
‘ 変数の解放と初期化
Set ws = Nothing
targetValue = 0
‘ 終了処理
End Sub
ここで非常に重要なポイントがあります。それは、「正常に処理が終わった場合でも、エラー処理ラベル(ErrorHandler)を通ってしまうミスを防ぐこと」です。
正常終了のルートの直前に `Exit Sub` を置くことで、エラーが起きなかった場合はそのまま綺麗にプログラムを終了させます。これを忘れると、エラーが起きていないのにエラー処理が走るという怪奇現象が起きますので注意してくださいね。
—
3. 実践!堅牢なコードのための「クリーンアップ&再初期化」
さて、ここからが本題です。単にエラーメッセージを出して終わるのではなく、「変数の状態の整合性を保つ(綺麗にリセットする)」ための実践的なテクニックを解説します。
プログラミング初学者がやりがちなのが、「エラーが起きたから、もうプログラムを止めるだけでいいや」という放置です。しかし、Excel VBAはExcelという巨大なアプリケーションのメモリを共有しています。特にオブジェクト変数(WorksheetやRange、Workbookなど)は、メモリを解放してあげないと、思わぬメモリリークや動作不良の原因になります。
以下のコードは、実務でそのまま使える、極めて堅牢なエラーハンドリングのテンプレートです。
Sub RobustDataProcess()
‘ 変数の宣言(冒頭でまとめて行う)
Dim wbSource As Workbook
Dim wsTarget As Worksheet
Dim lastRow As Long
Dim i As Long
‘ 画面描画の停止(処理高速化とチラツキ防止)
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual ‘ 自動計算停止
‘ エラー監視の開始
On Error GoTo CleanUp
‘ — メイン処理 —
‘ (例として、別ブックを開いてデータを処理する想定)
Set wbSource = Workbooks.Open(ThisWorkbook.Path & “\data.xlsx”)
Set wsTarget = ThisWorkbook.Sheets(“集計”)
lastRow = wsTarget.Cells(wsTarget.Rows.Count, “A”).End(xlUp).Row
For i = 2 to lastRow
‘ 何らかのデータ処理
wsTarget.Cells(i, “B.Value”).Value = wsTarget.Cells(i, “A”).Value 1.1
0 Next i
wbSource.Close SaveChanges:=False
MsgBox “データの集計が完了しました!”, vbInformation
CleanUp:
‘ ==========================================
‘ ここが変数の整合性を保つクリーンアップ領域
‘ ==========================================
If Err.Number <> 0 Then
‘ エラーが発生してジャンプしてきた場合
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical
‘ 開いてしまったブックがあれば、変更を破棄して閉じる
If Not wbSource Is Nothing Then
wbSource.Close SaveChanges:=False
End If
End If
‘ 【超重要】オブジェクト変数のメモリ解放(Nothing代入)
Set wbSource = Nothing
Set wsTarget = Nothing
‘ 【重要】数値や文字列変数の初期化
lastRow = 0
i = 0
‘ Excelの環境設定を必ず元に戻す!
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
‘ プロシージャの正常終了
Exit Sub
‘ 正常終了時はExit Subを通るため、CleanUpラベルの下側は
‘ 「エラー時だけでなく、正常時も通る共通の片付け場所」として機能します。
End Sub
このコードの美しいポイント
1. 共通の出口(Single Exit Point)を作っている
`CleanUp:` というラベルを、エラー時だけでなく正常終了時にも通る「共通の片付け場所」として活用しています。これにより、書き忘れや処理の抜け漏れを防ぎます。
2. オブジェクト変数の `Nothing` クリア
`Set wbSource = Nothing` や `Set wsTarget = Nothing` を行うことで、Excelのメモリ上に残った参照を完全に切り離しています。これを怠ると、マクロ終了後もファイルが掴まれたままになり、「ファイルが削除できません」といったエラーの元になります。
3. 環境設定の復旧
処理の最初に `ScreenUpdating = False`(画面描画停止)や `Calculation = xlCalculationManual`(手動計算)にしている場合、エラーで中断したときにも必ず元の状態(True / Automatic)に戻さなければなりません。これを怠ると、エラー後にExcel全体の画面がフリーズしたように見えたり、他のシートで計算式が自動更新されなくなったりする大惨事になります。クリーンアップ処理は、変数のためだけでなく「Excel環境のため」にも必須なのです。
—
4. まとめ:プロフェッショナルへの第一歩
いかがでしたでしょうか?
「動くだけのコード」を書く段階から、「どんな状況でも安全に後片付けができるコード」を書く段階へ。この意識の転換こそが、マクロの記録から脱却し、真のVBAエンジニアへと成長するための分水嶺です。
- エラーが起きたとき、変数は中途半端な値や参照を保持したまま残る。
- `On Error GoTo` を使って安全なクリーンアップ処理(ラベル)へ誘導する。
- オブジェクト変数は `Nothing` で確実に解放し、数値や環境設定も初期化する。
最初は少し難しく感じるかもしれませんが、このテンプレートを自分の引き出しに持っておくだけで、あなたの書くマクロの信頼性は劇的に向上します。
ここをクリアしたあなたなら、もう基本はバッチリです!自信を持って、次の自動化チャレンジに進んでくださいね。応援しています!
