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

VBA

はじめに

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

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

本記事は2回目。

実行時エラー ‘1004’: アプリケーション定義またはオブジェクト定義のエラー

主な原因と例

1. セル範囲の指定ミス

範囲指定が不正確な場合にエラーが発生します。

Sub Example1()
    Worksheets("Sheet1").Range("A1:B1000").Copy ' シート名が間違っている場合
End Sub
  • 原因: 「Sheet1」が存在しない場合、エラーが発生します。
  • 対処: シート名が正しいか確認し、変数を使用してシート名を動的に指定することも検討します。
Sub FixedExample1()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    ws.Range("A1:B100").Copy
End Sub

2. 範囲外のセルを操作

操作しようとしているセル範囲が実際のシート範囲を超えている場合にエラーが発生します。

Sub Example2()
    Worksheets("Sheet1").Range("XFD1048577").Value = "Test" ' 無効なセル範囲
End Sub
  • 原因: 範囲がExcelの最大セル数を超えています。
  • 対処: 範囲が正しいか確認します。

3. オブジェクトの設定ミス

変数にオブジェクトが正しく設定されていない場合に発生します。

Sub Example3()
    Dim ws As Worksheet
    ws.Range("A1").Value = "Test" ' wsが設定されていない
End Sub
  • 原因: wsが未設定のまま使用されている。
  • 対処: Setを使用してオブジェクトを設定します。
Sub FixedExample3()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet1")
    ws.Range("A1").Value = "Test"
End Sub

4. 保護されたシートを操作

保護されたシートで、許可されていない操作を行おうとした場合にエラーが発生します。

Sub Example4()
    Worksheets("Sheet1").Range("A1").Value = "Test" ' シートが保護されている
End Sub
  • 原因: シートが保護されており、セルの変更が許可されていない。
  • 対処: シートの保護を解除するか、コードで保護を一時解除します。
Sub FixedExample4()
    Worksheets("Sheet1").Unprotect "password"
    Worksheets("Sheet1").Range("A1").Value = "Test"
    Worksheets("Sheet1").Protect "password"
End Sub

5. データの不整合

フィルタやソート、名前付き範囲が無効な場合にエラーが発生します。

Sub Example5()
    ActiveSheet.ListObjects("Table1").Sort.SortFields.Clear ' Table1が存在しない
End Sub
  • 原因: 指定されたオブジェクトが存在しない。
  • 対処: オブジェクトが存在するか確認します。

エラーを防ぐ方法

  1. デバッグモードを利用
    • エラーが発生した行を確認し、変数やオブジェクトの状態をチェックします。
  2. エラー処理を追加
    • On Errorステートメントを使って、エラー発生時に処理を制御します。
Sub HandleError()
    On Error Resume Next
    Worksheets("Sheet1").Range("A1").Value = "Test"
    If Err.Number <> 0 Then
        MsgBox "エラーが発生しました: " & Err.Description
        Err.Clear
    End If
    On Error GoTo 0
End Sub
  1. 事前確認を徹底
    • 範囲やオブジェクトが有効かどうか事前に確認するコードを追加します。
Sub CheckRange()
    Dim ws As Worksheet
    If WorksheetExists("Sheet1") Then
        Set ws = Worksheets("Sheet1")
        If Not ws.Range("A1").IsEmpty Then
            ws.Range("A1").Value = "Test"
        End If
    Else
        MsgBox "シートが存在しません。"
    End If
End Sub

Function WorksheetExists(sheetName As String) As Boolean
    On Error Resume Next
    WorksheetExists = Not Worksheets(sheetName) Is Nothing
    On Error GoTo 0
End Function

まとめ

エラー ‘1004’ は、範囲指定やオブジェクト設定の不備が原因である場合が多いです。事前にデータやオブジェクトを確認し、適切なエラーハンドリングを実装することでエラーの発生を防ぐことができます。

コメント

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