VBAのよくあるエラーと対処法
VBAを書いていると必ずエラーに遭遇します。エラーメッセージが英語で何を言っているかわからない、どこを直せばいいかわからない——そんな状況を脱するための、よくあるエラーパターンと解決策をまとめます。
エラーの種類を理解する
VBAのエラーは大きく3種類に分かれます。
コンパイルエラー(Compile Error):コードの文法が間違っているときに出ます。実行前に検出されるため、動作する前に止まります。Sub と End Sub の対応が取れていない、If に対応する End If がない、といったケースが典型です。
実行時エラー(Run-time Error):コードの文法は正しいが、実行中に問題が起きたときに出ます。「存在しないシートを参照した」「0で割り算をした」などが該当します。どの行で止まったかが黄色くハイライトされます。
論理エラー:エラーが出ずに処理は完了するが、結果が意図と違う状態です。コードの構造や条件式の誤りが原因で、最も見つけにくいタイプです。
よくある実行時エラーと対処法
「実行時エラー '9': インデックスが有効範囲にありません」
原因:存在しないシート名やインデックス番号を参照したときに出ます。
' これがエラーになるケース
Set ws = Worksheets("集計シート") ' 「集計シート」というシートが存在しない
対処法:シート名のスペルミスや全角・半角の違いを確認します。以下のようにシート名を変数で確認するのも有効です。
' シートが存在するか確認してから処理する
Dim ws As Worksheet
For Each ws In Worksheets
Debug.Print ws.Name ' イミディエイトウィンドウにシート名を表示
Next ws
Debug.Print の結果はVBAエディタ下部の「イミディエイトウィンドウ」(表示されていない場合は「表示」→「イミディエイトウィンドウ」)に出力されます。
「実行時エラー '13': 型が一致しません」
原因:数値を期待しているところに文字列が入っているなど、データの型が合っていないときに出ます。
Dim i As Long
i = "テスト" ' Longに文字列を入れようとしている
対処法:セルから読み込んだ値を使う場合、想定外のデータが入っている可能性があります。IsNumeric() 関数で数値かどうかを確認してから処理するのが安全です。
If IsNumeric(ws.Cells(i, 1).Value) Then
' 数値の場合だけ処理する
End If
「実行時エラー '1004': アプリケーション定義またはオブジェクト定義のエラーです」
原因:範囲外のセルを参照したり、読み取り専用のセルに書き込もうとしたりしたときに出ます。
対処法:黄色くハイライトされた行のセル参照が正しいか確認します。特に行番号・列番号の計算ミス(0行目や負の行番号など)が原因になることが多いです。
' よくあるミス:0行目を参照してしまう
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' データが1行もない場合、lastRowが1になり、For i = 2 To 1 は実行されないので安全
' ただし lastRow - 1 を別の計算に使うと0になってエラーになることがある
「実行時エラー '91': オブジェクト変数またはWithブロック変数が設定されていません」
原因:Set で設定する前の変数を使おうとしたときに出ます。
Dim ws As Worksheet
' Set ws = ActiveSheet ← これを忘れている
ws.Range("A1").Value = "テスト" ' wsが設定されていないのでエラー
対処法:オブジェクト型の変数(Worksheet, Range, Workbookなど)は必ず Set で代入してから使います。
よくあるコンパイルエラー
「コンパイルエラー: 変数が定義されていません」
原因:コードの先頭に Option Explicit が書かれていると、宣言していない変数を使ったときにこのエラーが出ます。
Option Explicit は「すべての変数を Dim で宣言することを強制する」設定です。エラーを見つけやすくするために設定することを推奨します(VBAエディタの「ツール」→「オプション」→「変数の宣言を強制する」にチェックを入れると自動で追加されます)。
対処法:使っている変数を Dim で宣言します。
' 宣言前に使ってエラーになるケース
Sub サンプル()
goukei = 0 ' goukeiが宣言されていない
End Sub
' 正しい書き方
Sub サンプル()
Dim goukei As Long
goukei = 0
End Sub
「コンパイルエラー: Subまたはfunctionが定義されていません」
原因:存在しない関数名や、スペルミスのある関数名を呼び出しているときに出ます。よく起きるのは全角文字が混入したケースです。
対処法:エラーが出た部分(青くなります)を確認し、関数名のスペルを確認します。コードを全部削除して書き直したほうが早いこともあります。
デバッグの基本テクニック
ブレークポイントを使う
処理を途中で止めて状態を確認したいときは、VBAエディタで行番号の左側の灰色部分をクリックすると赤い丸(ブレークポイント)が設定できます。実行するとその行で止まり、変数の値を確認できます。
止まった状態で変数にマウスをホバーすると、その時点の値が表示されます。
Debug.Print で値を確認する
Debug.Print "i=" & i & ", 値=" & ws.Cells(i, 1).Value
繰り返し処理の中でこのように書くと、イミディエイトウィンドウに各行の処理状況が出力されます。どこで想定外の値になっているかを特定するのに便利です。
MsgBox で一時確認する
デバッグ中は MsgBox で値を表示して確認することもできます。ただし繰り返し処理の中に入れると毎回ダイアログが出るので、確認が終わったら削除するのを忘れずに。
MsgBox "現在の行: " & i & vbCrLf & "値: " & ws.Cells(i, 1).Value
エラーが出たときの手順
- エラーメッセージを読む:番号と説明文を確認する
- 黄色くハイライトされた行を確認する:どの処理で止まったかを特定する
- 変数の値を確認する:ホバーまたは
Debug.Printで期待通りの値かチェック - 前後の流れを確認する:その行に来る前に何が起きているか
「エラーが怖い」と感じる間は成長中のサインです。エラーメッセージは問題の場所を教えてくれる道案内なので、無視せずに読む習慣をつけると上達が早まります。
まとめ
VBAのエラーは大きく「文法エラー」「実行時エラー」「論理エラー」の3種類です。実行時エラーは番号と止まった行を手がかりに原因を特定し、Debug.Print やブレークポイントで変数の状態を確認しながら対処します。エラーに慣れることが、VBAを書けるようになる最短ルートです。