【VBA】コンパイルエラー/実行時エラー 9/実行時エラー13 原因と対処法

VBA

はじめに

VBAを使用していると、初心者から上級者まで誰もが一度はエラーに直面したことがあるでしょう。

VBAでよく発生するエラーを何回かに分けて一覧化し、それぞれの原因と具体的な対処法を解説します。

本記事は1回目。

コンパイルエラー: 変数が定義されていません

原因

変数を宣言していないときに発生

対処法

モジュールの先頭に『Option Explicit』を記述すると

変数宣言していない所がわかりやすくなる

Option Explicit

Sub Example()
    Dim counter As Integer
    counter = 10
    countre = 20 ' タイプミス、未宣言エラー
End Sub

実行時エラー ‘9’: インデックスが有効範囲にありません

原因

配列やワークシート名、セル範囲を指定するときに存在しないものを参照すると起こる

特に何かの名前のスペルミスで、コードないに存在しない名前になっていると発生しやすい

'「Sheet1」というシート名は存在するが「Sheeet1」はない
Worksheets("Sheet1").Range("A1").Value = "Hello"
Worksheets("Sheeet1").Range("A1").Value = "Bye" 

対処法

コンパイルエラーの時と同じく

モジュールの先頭に『Option Explicit』を記述する

Option Explicit

Sub Example()
  Worksheets("Sheet1").Range("A1").Value = "Hello"
  Worksheets("Sheeet1").Range("A1").Value = "Bye" ' スペルミス
End Sub

実行時エラー ‘13’: 型が一致しません

主な原因と例

1. 異なる型の値を代入しようとした場合

変数に設定されたデータ型と、代入しようとした値の型が一致しない場合に発生する

vbaコードをコピーするSub TypeMismatchExample1()
    Dim x As Integer
    x = "abc" ' 数値型に文字列を代入 → 型が一致しませんエラー
End Sub

2. 異なる型の変数を操作した場合

比較や計算で異なる型を扱うとエラーになることがある

vbaコードをコピーするSub TypeMismatchExample2()
    Dim x As Integer
    Dim y As String
    x = 10
    y = "abc"
    Debug.Print x + y ' 数値と文字列を計算 → 型が一致しませんエラー
End Sub

3. セルの値が期待する型と異なる場合

セルの値を読み込む際に、数値を期待していたのに文字列が含まれている場合に発生する

vbaコードをコピーするSub TypeMismatchExample3()
    Dim x As Integer
    x = Range("A1").Value ' A1が文字列ならエラー
End Sub

4. 関数の戻り値や型キャストの不一致

関数の戻り値や型変換の際に予期しない型が返される場合

vbaコードをコピーするSub TypeMismatchExample4()
    Dim x As Date
    x = "Not a Date" ' 不正な日付文字列 → エラー
End Sub

エラーを防ぐ方法

1. データ型を明確に定義する

Option Explicitを使用して、すべての変数を宣言する

vbaコードをコピーするOption Explicit

Sub AvoidTypeMismatch()
    Dim x As Integer
    x = 10
End Sub

2. 型変換関数を利用する

型が一致しない場合は、明示的に型変換関数を使用する

  • CInt:整数に変換
  • CLng:長整数に変換
  • CDbl:倍精度実数に変換
  • CStr:文字列に変換
  • CDate:日付に変換
vbaコードをコピーするSub UseTypeConversion()
    Dim x As Integer
    Dim y As String
    y = "123"
    x = CInt(y) ' 明示的に文字列を数値に変換
    Debug.Print x + 10
End Sub

3. 値を事前に確認する

値が期待する型であるかをチェックする

vbaコードをコピーするSub CheckValueType()
    Dim x As Variant
    x = Range("A1").Value
    If IsNumeric(x) Then
        Debug.Print x * 2 ' 数値なら計算
    Else
        MsgBox "A1は数値ではありません。"
    End If
End Sub

4. エラー処理を追加する

On Errorステートメントを使用してエラーを適切に処理する

vbaコードをコピーするSub HandleError()
On Error Resume Next
Dim x As Integer
x = Range("A1").Value ' A1が文字列ならエラー
If Err.Number <> 0 Then
MsgBox "型が一致しません。"
Err.Clear
End If
On Error GoTo 0
End Sub

おまけ:強制的にOption Explicitを有効にする方法

いちいちOption Explicitを宣言するのが面倒なときは、以下の手順で常時ONにできるよ

  1. VBAエディターを開く(Alt + F11)
  2. メニューバーから「ツール」→「オプション」を選択
  3. 「全般」タブで「変数の宣言を強制する」にチェックを入れる
  4. 新しいモジュールでは自動的にOption Explicitが挿入される

まとめ

VBAでエラーがの中でも宣言忘れやタイプミス、スペルミスよって起こるようなものをまとめてみました

意外と玄人でも忘れがちなので対処法は覚えてきましょう

コメント

タイトルとURLをコピーしました