はじめに
VBAを使用していると、初心者から上級者まで誰もが一度はエラーに直面したことがあるでしょう。
VBAでよく発生するエラーを何回かに分けて一覧化し、それぞれの原因と具体的な対処法を解説します。
本記事は3回目。
実行時エラー ‘5’: 無効なプロシージャ呼び出しまたは引数
主な原因と例
1. 関数やメソッドへの不適切な引数
渡した引数が、その関数やメソッドで期待される型や範囲を満たしていない場合。
例: Left関数の使用ミス
Sub Example1()
Dim result As String
result = Left("Test", -1) ' 引数に負の値を指定 → エラー
End Sub
- 原因:
Left
関数は、文字列から指定した文字数だけ切り出す関数ですが、負の値を引数として渡すとエラーになります。 - 対処: 引数が有効範囲内か確認します。
Sub FixedExample1()
Dim result As String
Dim length As Integer
length = 2 ' 正の値を指定
result = Left("Test", length)
End Sub
2. オブジェクトが正しく初期化されていない
操作しようとしているオブジェクトがNothing
である場合に発生します。
例: 未初期化のオブジェクトを使用
Sub Example2()
Dim ws As Worksheet
ws.Name = "Sheet1" ' 初期化されていないオブジェクト → エラー
End Sub
- 原因:
ws
にシートオブジェクトがセットされていません。 - 対処:
Set
ステートメントでオブジェクトを初期化します。
Sub FixedExample2()
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
ws.Name = "NewSheetName"
End Sub
3. 無効な引数でプロシージャを呼び出し
引数が関数やメソッドで定義された要件を満たしていない場合。
例: Application.Run
で無効な引数
Sub Example3()
Application.Run "NonExistentMacro" ' 存在しないマクロ名 → エラー
End Sub
- 原因: 呼び出そうとしているマクロ名が無効。
- 対処: マクロ名が正しいか確認します。
Sub FixedExample3()
Application.Run "ExistingMacro" ' 正しいマクロ名を指定
End Sub
4. 型変換エラー
データ型の変換が失敗した場合にエラーが発生します。
例: 日付型への不正な変換
Sub Example4()
Dim d As Date
d = CDate("InvalidDate") ' 無効な日付形式 → エラー
End Sub
- 原因:
CDate
関数に無効な日付文字列を渡しています。 - 対処: 引数が正しい形式か確認します。
Sub FixedExample4()
Dim d As Date
If IsDate("2025/01/01") Then
d = CDate("2025/01/01")
Else
MsgBox "無効な日付形式です。"
End If
End Sub
5. 範囲外の値や設定の操作
配列やセル範囲などで無効な操作を行おうとした場合に発生します。
例: 配列の範囲外アクセス
Sub Example5()
Dim arr(1 To 5) As Integer
arr(6) = 10 ' 配列範囲外 → エラー
End Sub
- 原因: 配列の範囲を超えてアクセスしています。
- 対処: 配列の範囲を確認します。
Sub FixedExample5()
Dim arr(1 To 5) As Integer
Dim index As Integer
index = 5 ' 範囲内のインデックスを指定
arr(index) = 10
End Sub
エラーを防ぐ方法
- 引数やデータを事前確認
- 操作対象のデータ型や値が有効であることをチェックします。
Sub ValidateArguments()
Dim str As String
str = "Test"
If Len(str) > 0 Then
Debug.Print Left(str, 2)
Else
MsgBox "文字列が空です。"
End If
End Sub
- エラー処理を追加
On Error
を使ってエラー発生時の動作を制御します。
Sub HandleError()
On Error Resume Next
Dim result As String
result = Left("Test", -1) ' 無効な引数 → エラー
If Err.Number <> 0 Then
MsgBox "エラーが発生しました: " & Err.Description
Err.Clear
End If
On Error GoTo 0
End Sub
- オブジェクトの初期化を徹底
- オブジェクト変数を使用する際は必ず
Set
で初期化します。
- オブジェクト変数を使用する際は必ず
- 範囲チェック
- 配列やセル範囲の操作時に、範囲内かどうか確認します。
まとめ
エラー ‘5’ は、プロシージャの呼び出しや引数が適切でない場合に発生します。エラーを防ぐためには、引数やデータ型の確認、オブジェクトの初期化、範囲チェックなどを徹底することが重要です。また、エラー処理を適切に組み込むことで、エラーの原因を特定しやすくなります。
コメント