エラー内容
VBAの実行時に「実行時エラー ‘424’: オブジェクトが必要です。」というエラーになることがあります。
対象のオブジェクトのプロパティやメソッドを使おうとした際に、そのオブジェクトがEmptyだった場合に発生します。
構文エラーのためコードの修正が必要です。
エラーの原因
クラスのプロパティやメソッドは、その親となるオブジェクトが認識できないと動作できません。
Variant型の変数に対してクラス変数が設定されていないことが原因で、多くの場合は変数へのコピー時のSetステートメントの付け忘れが原因です。
オブジェクトを変数にコピーするにはSetステートメントを使う必要があるのですが、Setを書かずにただの代入になっている場合にこのエラーが発生します。
なお、Variant型の場合はエラー424になりますが、Object型変数でSetを付け忘れた場合はエラー91になります。
以下はエラー424が発生するコードです。
1 2 3 4 5 6 7 |
Sub Err424Test() Dim obj '// Variant型 '// A1セルを変数にコピー(したつもり) obj = ActiveSheet.Range("A1") obj.Value = "abc" '// ここでエラー424が発生する End Sub |
5行目でA1セルを変数にコピーしているように見えますが、実際はそうなっていません。
Setがないため変数への代入とみなされ、Rangeオブジェクトでプロパティが指定されていない場合はValueプロパティであるString型の文字列が代入されます。
そのため、5行目は以下のコードと同じ意味になります。
1 |
obj = ActiveSheet.Range("A1").Value |
エラーの対応方法
上記のコードのようにセルを代入したい場合や、そのほかにもワークシートやブックなどのオブジェクトを変数にコピーする場合はSetステートメントを使わなければなりません。
以下のコードの7行目が正しく修正したコードになります。
1 2 3 4 5 6 7 8 9 10 |
Sub Err424Test() Dim obj '// Variant型 '// A1セルを変数にコピー(したつもり) ' obj = ActiveSheet.Range("A1") '// 正しくはこのようにSetを付ける Set obj = ActiveSheet.Range("A1") obj.Value = "abc" End Sub |