はじめに
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にできるよ
- VBAエディターを開く(Alt + F11)
- メニューバーから「ツール」→「オプション」を選択
- 「全般」タブで「変数の宣言を強制する」にチェックを入れる
- 新しいモジュールでは自動的に
Option Explicit
が挿入される
まとめ
VBAでエラーがの中でも宣言忘れやタイプミス、スペルミスよって起こるようなものをまとめてみました
意外と玄人でも忘れがちなので対処法は覚えてきましょう
コメント