この記事で解決できる悩み
- ✅ 「実行時エラー ‘424’: オブジェクトが必要です。」が出て処理が止まる
- ✅ Setを付けているはずなのにエラーが消えない
- ✅ 変数の型が合っているのにオブジェクトエラーになる
- ✅ CreateObjectやWithブロックでエラーが頻発する
- ✅ エラー91との違いが分からない
エラー424とは?エラー91との違いを3秒で理解
エラー424の正体
'❌ エラー424が発生
Dim rng As Range
rng.Select '← ここでエラー424
'❌ エラー91が発生
Dim rng As Range
Set rng = Nothing
rng.Select '← ここでエラー91
| 比較項目 | エラー424 | エラー91 |
|---|---|---|
| エラーメッセージ | オブジェクトが必要です | オブジェクト変数が設定されていません |
| 主な原因 | Setを付け忘れ、型の不一致 | Setしたが値がNothing |
| 発生タイミング | 変数宣言直後 | Set実行後のNothing参照 |
| デバッグ方法 | TypeName関数で型確認 | IsNothing/Is Nothing判定 |
簡単な見分け方
- エラー424 → 「オブジェクトを入れる箱(変数)が用意されていない」
- エラー91 → 「箱は用意したけど中身が空っぽ(Nothing)」
5つの実例パターンと解決コード
パターン1: Setステートメント忘れ(最頻出70%)
❌ エラーコード
Sub SetForgotError()
Dim rng As Range
rng = Range("A1") '← Setが無い!
Debug.Print rng.Address
End Sub
エラー発生箇所: rng = Range("A1")
エラーメッセージ: 実行時エラー ‘424’: オブジェクトが必要です。
✅ 正しいコード
Sub SetCorrect()
Dim rng As Range
Set rng = Range("A1") '← Setを追加
Debug.Print rng.Address '→ $A$1
End Sub
💡 対処ポイント
- オブジェクト型変数への代入には必ず
Setが必要 - String/Long/Doubleなどのプリミティブ型は
Set不要 - エラー箇所を特定したら、変数の型をF2キーで確認
パターン2: 変数宣言の型ミス
❌ エラーコード
Sub TypeMismatchError()
Dim target As Long '← Long型なのにオブジェクトを代入
Set target = Range("A1")
End Sub
エラー発生箇所: Set target = Range("A1")
エラーメッセージ: 実行時エラー ‘424’: オブジェクトが必要です。
✅ 正しいコード
Sub TypeCorrect()
'方法1: Range型に修正
Dim target As Range
Set target = Range("A1")
'方法2: Variant型を使う(型推論)
Dim target2 As Variant
Set target2 = Range("A1")
Debug.Print target2.Value
End Sub
💡 対処ポイント
- 変数宣言時に型を確認: オブジェクトを格納するならRange/Workbook/Worksheet型
- Option Explicitを必ず記述(変数宣言漏れを防ぐ)
- Variant型は便利だが、型安全性が下がるので注意
パターン3: Nothingオブジェクトへの参照
❌ エラーコード
Sub NothingError()
Dim ws As Worksheet
Set ws = Nothing '← 明示的にNothing代入
Debug.Print ws.Name '← Nothingに対してプロパティアクセス
End Sub
エラー発生箇所: Debug.Print ws.Name
エラーメッセージ: 実行時エラー ‘424’: オブジェクトが必要です。(環境によって91になる場合もある)
✅ 正しいコード
Sub NothingCheck()
Dim ws As Worksheet
Set ws = Nothing
'事前チェックを追加
If ws Is Nothing Then
Debug.Print "オブジェクトが未設定です"
Else
Debug.Print ws.Name
End If
End Sub
💡 対処ポイント
- Is Nothingで事前チェック必須
- 関数の戻り値がNothingの可能性がある場合も要注意
- エラーハンドリングで
On Error Resume Nextを使う方法もあるが、根本解決にならない
パターン4: CreateObject失敗
❌ エラーコード
Sub CreateObjectError()
Dim fso As Object
'参照設定が無い場合や、ProgIDが間違っている場合
fso.CreateTextFile "C:\test.txt" '← fsoがEmptyのまま
End Sub
エラー発生箇所: fso.CreateTextFile
エラーメッセージ: 実行時エラー ‘424’: オブジェクトが必要です。
✅ 正しいコード
Sub CreateObjectCorrect()
Dim fso As Object
On Error GoTo ErrorHandler
'CreateObjectでインスタンス化
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateTextFile "C:\test.txt"
Set fso = Nothing
Exit Sub
ErrorHandler:
MsgBox "FileSystemObjectの作成に失敗しました。" & vbCrLf & _
"エラー番号: " & Err.Number & vbCrLf & _
"エラー内容: " & Err.Description
End Sub
💡 対処ポイント
- CreateObjectの戻り値を必ずSetで受け取る
- ProgID(例: “Excel.Application”)のスペルミスに注意
- 参照設定が必要なライブラリは、事前バインディングも検討
パターン5: With/For Eachでのオブジェクト未初期化
❌ エラーコード
Sub WithBlockError()
Dim rng As Range
With rng '← rngが未設定のままWithブロックに入る
.Value = "test"
.Font.Bold = True
End With
End Sub
エラー発生箇所: With rng
エラーメッセージ: 実行時エラー ‘424’: オブジェクトが必要です。
✅ 正しいコード
Sub WithBlockCorrect()
Dim rng As Range
Set rng = Range("A1") '← Withの前に必ずSet
With rng
.Value = "test"
.Font.Bold = True
End With
End Sub
For Each版のエラーと対策
'❌ エラー例
Sub ForEachError()
Dim ws As Worksheet
For Each ws In Nothing '← Nothingをループ
Debug.Print ws.Name
Next ws
End Sub
'✅ 正しいコード
Sub ForEachCorrect()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets '← 正しいコレクション
Debug.Print ws.Name
Next ws
End Sub
💡 対処ポイント
- Withの前に必ずオブジェクトを初期化
- For Eachのコレクションが空の場合はカウント確認
- Withブロックのネストは2階層まで(可読性のため)
デバッグ必勝法3選
方法1: TypeName関数で型を確認
Sub DebugType()
Dim rng As Range
Debug.Print TypeName(rng) '→ "Nothing"(Setされていない)
Set rng = Range("A1")
Debug.Print TypeName(rng) '→ "Range"
End Sub
方法2: IsObject関数で判定
Sub DebugIsObject()
Dim rng As Range
Debug.Print IsObject(rng) '→ True(オブジェクト型変数)
Dim val As Long
Debug.Print IsObject(val) '→ False(プリミティブ型)
End Sub
方法3: イミディエイトウィンドウで即時確認
'VBE画面で Ctrl+G → イミディエイトウィンドウを開く
?TypeName(rng)
?rng Is Nothing
?IsObject(rng)
実務で使える汎用テンプレート
テンプレート1: エラー424完全対策版
Option Explicit '← 必須!変数宣言漏れを防ぐ
Sub SafeObjectHandling()
Dim ws As Worksheet
Dim rng As Range
On Error GoTo ErrorHandler
'手順1: オブジェクトの存在確認
Set ws = ThisWorkbook.Worksheets("データ")
'手順2: Setで代入
Set rng = ws.Range("A1")
'手順3: Nothing確認後に処理
If Not rng Is Nothing Then
rng.Value = "安全に処理完了"
Debug.Print "処理成功: " & rng.Address
End If
'手順4: クリーンアップ
Set rng = Nothing
Set ws = Nothing
Exit Sub
ErrorHandler:
MsgBox "エラー発生" & vbCrLf & _
"番号: " & Err.Number & vbCrLf & _
"内容: " & Err.Description
Resume Next
End Sub
テンプレート2: CreateObject安全版
Function GetFSO() As Object
'戻り値: FileSystemObjectまたはNothing
Dim fso As Object
On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
If Err.Number <> 0 Then
Debug.Print "CreateObject失敗: " & Err.Description
Set fso = Nothing
End If
Set GetFSO = fso
On Error GoTo 0
End Function
Sub UseFSO()
Dim fso As Object
Set fso = GetFSO()
If Not fso Is Nothing Then
'正常処理
fso.CreateTextFile "C:\test.txt"
Set fso = Nothing
Else
MsgBox "FileSystemObjectが利用できません"
End If
End Sub
よくある質問(FAQ)
Q1. エラー424とエラー91はどう違う?
A. エラー424は「オブジェクト変数を用意していない」、エラー91は「用意したけど中身がNothing」という違いです。
'エラー424の例
Dim rng As Range
rng.Select '← Setしていない
'エラー91の例
Dim rng As Range
Set rng = Nothing
rng.Select '← Nothingに対して操作
Q2. Option Explicitは必ず書くべき?
A. 必須です! Option Explicitを書かないと、変数宣言ミスに気づけず、エラー424が多発します。
'VBEメニュー → ツール → オプション → 「変数の宣言を強制する」にチェック
'これで新規モジュールに自動で Option Explicit が追加される
Q3. Setを付けるべき型はどう判断する?
A. オブジェクト型にはSet必須、プリミティブ型にはSet不要です。
| 型 | Set要否 | 例 |
|---|---|---|
| Range, Worksheet, Workbook | ✅必要 | Set rng = Range("A1") |
| Collection, Dictionary | ✅必要 | Set dic = New Dictionary |
| String, Long, Double | ❌不要 | str = "text" |
| Variant(オブジェクト格納) | ✅必要 | Set v = Range("A1") |
Q4. CreateObjectでエラー424が出る原因は?
A. 以下の3パターンが多いです。
- ProgIDのスペルミス:
CreateObject("Scrpting.FileSystemObject")→ 正しくはScripting - Setを付け忘れ:
fso = CreateObject(...)→Set fso = CreateObject(...) - 参照設定が必要なライブラリ: 早期バインディングを検討
Q5. Withブロックでエラーが出やすい理由は?
A. Withブロックに入る前に、対象オブジェクトが初期化されていないことが原因です。
'❌ 悪い例
Dim rng As Range
With rng '← rngがEmptyのまま
.Value = "test"
End With
'✅ 良い例
Dim rng As Range
Set rng = Range("A1") '← Withの前に必ず初期化
With rng
.Value = "test"
End With
まとめ
✅ エラー424を防ぐ5つの鉄則
- Option Explicit必須: モジュール先頭に必ず記述
- Setの徹底: オブジェクト型変数への代入は必ずSet
- Is Nothing確認: オブジェクト使用前に必ずチェック
- 型の正確性: 変数宣言時にRange/Worksheet等を明示
- CreateObjectはエラーハンドリング付き: On Error GoToで安全に


コメント