VBAのエラーは「構文エラー」と「実行時エラー」の2種類です。構文エラーはコードを書いた時点で止まる書き方のミス、実行時エラーはマクロが動いている途中で止まるデータや環境の問題です。種類がわかると、落ち着いて原因を探せるようになります。
この記事では、次の内容を順番に解説します。
- 構文エラーと実行時エラーの違い
- それぞれのよくある原因と直し方
- 頻出の実行時エラー番号と対処法
- On Errorを使ったエラー処理の基本
2種類のエラーを比較するには?
VBAのエラーはまず「いつ発生するか」で分類できます。
| 比較項目 | 構文エラー | 実行時エラー |
|---|---|---|
| 発生タイミング | コードを書いた時点・実行直前 | マクロを実行している途中 |
| 主な原因 | スペルミス・括弧の閉じ忘れなど | 存在しないシート・0除算・型の不一致など |
| 見え方 | コードが赤くなる・「構文エラー」の枠が出る | 「エラー ‘番号’」の番号付きウィンドウが出る |
| 処理の実行 | 一切動かない | エラーが出た行まで動いてから止まる |
| On Errorでの回避 | できない(書き方を直すしかない) | できる |
構文エラーを直すには?
構文エラーはVBAの文法に合っていない書き方が原因です。マクロは一切実行されないため、コードを修正しないと先に進めません。
よくある構文エラー①:スペルミス
' 誤り:「MsgBoxx」という命令は存在しない
MsgBoxx "こんにちは"
' 正しい書き方
MsgBox "こんにちは"
確認のコツ:正しく入力すると MsgBox の M と B が自動で大文字になります。小文字のままになっている場合はスペルが間違っています。
よくある構文エラー②:括弧の閉じ忘れ
' 誤り:「)」が抜けている
MsgBox ("おはよう"
' 正しい書き方
MsgBox ("おはよう")
よくある構文エラー③:End If・End Sub の書き忘れ
' 誤り:End If がない
Sub Test()
If Cells(1, 1).Value = "" Then
MsgBox "空欄です"
' ← End If がないのでエラー
End Sub
' 正しい書き方
Sub Test()
If Cells(1, 1).Value = "" Then
MsgBox "空欄です"
End If
End Sub
予防策:If と書いたらすぐ End If を書く、Sub と書いたらすぐ End Sub を書く習慣をつけると閉じ忘れを防げます。
よくある構文エラー④:文字列をダブルクォーテーションで囲んでいない
' 誤り:文字列なのに「"」がない
Cells(1, 1).Value = 未入力
' 正しい書き方
Cells(1, 1).Value = "未入力"
実行時エラーを直すには?
実行時エラーはコードの書き方自体は正しくても、実行中に予期しない状況が起きると発生します。エラーが出た行が黄色くハイライトされるので、そこを起点に原因を探します。
よくある実行時エラー①:存在しないシートを指定した(エラー9)
' 誤り:「集計」シートが存在しない場合にエラーになる
Sheets("集計").Range("A1").Value = 100
' 対策:シートが存在するか確認してから操作する
Dim ws As Worksheet
On Error Resume Next
Set ws = Sheets("集計")
On Error GoTo 0
If ws Is Nothing Then
MsgBox "「集計」シートが見つかりません"
Else
ws.Range("A1").Value = 100
End If
よくある実行時エラー②:開いていないブックを操作した(エラー9)
' 誤り:売上.xlsxが開かれていない状態で実行するとエラー
Workbooks("売上.xlsx").Worksheets("1月").Range("A1").Value = 100
' 対策:Workbooks.Openで先に開いてから操作する
Dim wb As Workbook
Set wb = Workbooks.Open("C:¥Users¥Desktop¥売上.xlsx")
wb.Worksheets("1月").Range("A1").Value = 100
よくある実行時エラー③:0で割ってしまった(エラー11)
' 誤り:0で割るとエラー
Dim x As Long
x = 10 / 0
' 対策:割る前に0かどうか確認する
Dim divisor As Long
divisor = Cells(1, 1).Value
If divisor = 0 Then
MsgBox "0では割れません"
Else
MsgBox 10 / divisor
End If
よくある実行時エラー④:型の不一致(エラー13)
' 誤り:数値型の変数に文字列を代入しようとするとエラー
Dim score As Long
score = "優" ' ← 文字列を数値型に入れようとしてエラー
' 対策:IsNumericで数値かどうか確認してから代入する
If IsNumeric(Cells(1, 1).Value) Then
score = Cells(1, 1).Value
Else
MsgBox "数値を入力してください"
End If
よくある実行時エラー⑤:行・列の範囲外(エラー1004)
' 誤り:Excelの最大行数を超えた行を指定するとエラー
Range("A2000000").Value = "NG"
' 対策:最終行を動的に取得して範囲内に収める
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Cells(lastRow + 1, 1).Value = "追加データ"
頻出エラー番号を確認するには?
実行時エラーにはエラー番号が表示されます。番号を知っておくと原因の見当をつけやすくなります。
| エラー番号 | エラー名 | 主な原因 |
|---|---|---|
| エラー 9 | インデックスが有効範囲にありません | 存在しないシート名・ブック名を指定した |
| エラー 11 | 0で除算しました | 割り算の分母が0になった |
| エラー 13 | 型が一致しません | 数値型の変数に文字列を入れようとした |
| エラー 91 | オブジェクト変数またはWithブロック変数が設定されていません | Setしていない変数を使おうとした |
| エラー 1004 | アプリケーション定義またはオブジェクト定義のエラー | セル範囲の指定ミス・存在しないシートへの操作など |
| エラー 400 | フォームは既に表示されています | ユーザーフォームを二重に表示しようとした |
On Errorでエラー処理をするには?
実行時エラーは On Error 文を使って処理できます。ただし使い方を間違えるとエラーを見逃す原因になるため、使い所を絞るのがポイントです。
On Error Resume Next:エラーが出ても続行する
' エラーが出ても次の行に進む(エラーを無視する)
On Error Resume Next
Set ws = Sheets("存在しないシート")
On Error GoTo 0 ' ← 必ずここでリセットする
' Setできたかどうかを確認してから処理する
If ws Is Nothing Then
MsgBox "シートが見つかりませんでした"
Exit Sub
End If
ws.Range("A1").Value = "OK"
注意:On Error Resume Next を使ったあとは必ず On Error GoTo 0 でリセットしてください。リセットしないと、その後のエラーもすべて無視されてしまいます。
On Error GoTo:エラーが出たら指定した場所に飛ぶ
Sub SafeMacro()
On Error GoTo ErrHandler ' エラーが出たら ErrHandler に飛ぶ
' ここに通常の処理を書く
Sheets("集計").Range("A1").Value = 100
MsgBox "完了しました"
Exit Sub ' 正常終了したらここで終わる
ErrHandler:
MsgBox "エラーが発生しました:" & Err.Description
End Sub
エラーが起きたときにメッセージを表示したり、ログを残したりするのに向いています。
まとめ
- 構文エラー:書き方のミスが原因。コードを書いた時点で止まる。スペルミス・括弧の閉じ忘れ・End Ifの書き忘れが多い。
- 実行時エラー:データや環境の問題が原因。実行してから止まる。番号を手がかりに原因を探す。
- 頻出エラー番号:9(シート不在)・11(0除算)・13(型不一致)・1004(範囲外)を覚えておくと対処が早くなる。
- On Error:実行時エラーの対処に使える。ただし
Resume Next後は必ずGoTo 0でリセットする。 - エラーは誰にでも起きる。種類と原因を知っておくことで、落ち着いて対処できるようになる。
よくある質問
エラーが出たときにまず何を確認すればいいですか?
まずエラーウィンドウの「番号」と「説明」を読みましょう。次に「デバッグ」ボタンをクリックすると、エラーが発生した行が黄色くハイライトされます。その行の変数の値(カーソルをあてると表示される)や、参照しているシート名・セル範囲が正しいかを確認するのが最初のステップです。
「コンパイルエラー」は構文エラーと同じですか?
似ていますが少し異なります。構文エラーはコードを1行書いた時点で検知されるものです。コンパイルエラーはマクロ全体を実行しようとしたときにVBAがコード全体をチェックして検知するエラーで、「変数が定義されていません」「Subまたはファンクションが定義されていません」などが該当します。どちらも書き方の問題であることは同じです。
On Error Resume Nextを使うと何が危険ですか?
書いた後に On Error GoTo 0 でリセットしないと、その後のコード全体でエラーが無視され続けます。意図しない動作が起きても気づかないまま処理が進んでしまうため、バグの原因になります。使う場合は「1〜2行だけに絞って使い、すぐリセットする」のが基本です。
エラー番号はどこで調べられますか?
VBEでエラーが発生したときに表示されるウィンドウの「ヘルプ」ボタンを押すと、公式ドキュメントに飛べます。また「VBA エラー 9」のように検索エンジンで調べると日本語の解説が多く見つかります。Err.Number と Err.Description をMsgBoxで表示するコードを一時的に追加して確認する方法もよく使われます。
実行時エラーが出たり出なかったりするのはなぜですか?
実行時エラーはデータや環境に依存するため、「ファイルが開いているかどうか」「シートが存在するかどうか」「セルに数値が入っているかどうか」によって発生したりしなかったりします。自分のPCでは動いても他の人のPCで止まる、ということも起こります。対策として、処理の前に「シートが存在するか」「値が数値かどうか」などを確認するコードを入れておくと安定したマクロになります。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



