【VBA】実行時エラー 5 原因と対処法

VBA

はじめに

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

エラーを防ぐ方法

  1. 引数やデータを事前確認
    • 操作対象のデータ型や値が有効であることをチェックします。
Sub ValidateArguments()
    Dim str As String
    str = "Test"
    If Len(str) > 0 Then
        Debug.Print Left(str, 2)
    Else
        MsgBox "文字列が空です。"
    End If
End Sub
  1. エラー処理を追加
    • 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
  1. オブジェクトの初期化を徹底
    • オブジェクト変数を使用する際は必ずSetで初期化します。
  2. 範囲チェック
    • 配列やセル範囲の操作時に、範囲内かどうか確認します。

まとめ

エラー ‘5’ は、プロシージャの呼び出しや引数が適切でない場合に発生します。エラーを防ぐためには、引数やデータ型の確認、オブジェクトの初期化、範囲チェックなどを徹底することが重要です。また、エラー処理を適切に組み込むことで、エラーの原因を特定しやすくなります。

コメント

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