「オブジェクトが必要です」(エラー424)の原因を解説(VBA)
マクロを書いていると時々「オブジェクトが必要です」のエラーに出くわすことがあります。
なんとなくオブジェクト絡みのエラーなのだろうと予想が付くのですが、具体的な原因を突き止めるのは意外と難しかったりします。
そこで今回は、このエラーが発生する主な2つを原因を紹介します。
エラーが起こる理由を理解して、原因を解消してみてください。
原因①:変数にオブジェクトが代入されていない
原因の1つは、変数にオブジェクトが代入されていないことです。
この場合はエラーメッセージに「実行時エラー424」というエラー番号が表示されます。
このエラーが出た場合、オブジェクト変数にオブジェクトが代入されていません。(もしくはオブジェクト以外の値などが代入されています)
Sub ErrorCause1()
'''変数にオブジェクトが代入されていない
'''原因:Setの付け忘れ
Dim rng
rng = Range("A1") 'SetがないためA1セルの「値」が代入されている
'ここで実行時エラー424が発生する
'(rngは値のためValueプロパティが参照できない)
Debug.Print rng.Value
End Sub
ありがちなのはサンプルコードのようにSetを付け忘れているケースです。
Setを書かずにRangeオブジェクトを代入しようとした場合、Rangeオブジェクトではなく値が代入されてしまいます。
そのため、Rangeオブジェクトの変数と思い込んでrng.Valueなどと記載するとエラーが発生します。
原因②:値型の変数にオブジェクトを代入している
もう1つの原因は、値型の変数にオブジェクトを代入していることです。
こちらは実行時エラーではなく、コンパイルエラーです。
Sub ErrorCause2()
'''原因:値型の変数にオブジェクトを代入している
'''コンパイルエラーが発生する
'Long型の変数にオブジェクトを代入している
Dim ws As Long
Set ws = ActiveSheet
End Sub
サンプルコードのようにLong型の変数にオブジェクトを代入しようとしたりすると、このエラーが発生します。
エラー解消方法
Sub ErrorCause1-OK()
'''変数にオブジェクトが代入されていない
'''原因:Setの付け忘れ
Dim rng
Set rng = Range("A1") 'Setを追加!
'ここで実行時エラー424が発生する
'(rngは値のためValueプロパティが参照できない)
Debug.Print rng.Value
End Sub
Sub ErrorCause2-OK()
'''原因:値型の変数にオブジェクトを代入している
'''コンパイルエラーが発生する
'Long型の変数にオブジェクトを代入している
Dim ws As Sheet 'Sheet型に変更!
Set ws = ActiveSheet
End Sub
エラーを解消するには、Setの追加もしくは型の変更を行います。
↑にエラーとならない正しいコードを書きました。
エラーとなるコードと比較してみて、どのような違いがあるのか調べてみてください。