【実行時エラー424】オブジェクトが必要です。
エラー表示
このエラーが発生すると、マクロ起動時(コンパイル時)に次のエラーが表示されます。
実行時エラー '424'
オブジェクトが必要です。
エラーの発生理由について
Microsoft公式の解答
Microsoft公式によると次のようにあります。
多くの場合、プロパティやメソッドを参照するときは、明示的なオブジェクト修飾子が必要です。 このエラーの原因と解決策を次に示します。
- オブジェクトのプロパティまたはメソッドを参照しましたが、有効なオブジェクト修飾子を指定していません。 オブジェクト修飾子を指定していない場合は、オブジェクト修飾子を指定します。 たとえば、フォーム自体のモジュール内からフォームのプロパティを参照する場合はオブジェクト修飾子を省略できますが、標準モジュールからフォームのプロパティを参照する場合は、修飾子を明示的に指定する必要があります。
(以下、続く…)
【原因1】Variant型変数へオブジェクトを代入時、Setを忘れた
Variant型の変数に対して、Setを付け忘れると発生することがあります。
ケアレスミスをしていないか、見直してみましょう。
Sub ErrSample424_1()
Dim obj As Variant
'Set obj = Range("A1") が正しい
obj = Range("A1")
Debug.Print obj.Text '← ここでエラー
End Sub
変数を作成する際は、Variant型を使用しないようにしましょう。
なお、Object型 や Range型 の変数へオブジェクトを代入する時に「Set」を忘れると、「実行時エラー91」が発生します。
リンク
実行時エラー91:オブジェクト変数または With ブロック変数が設定されていません。
【原因2】Object型変数にプリミティブ値のVariant変数を代入
(数値や文字列など)を、Variant型の変数に代入したとします。
その変数とは別にオブジェクト型の変数に先ほどの変数を代入すると、エラーが発生します。
Sub ErrSample424_2()
Dim num As Variant
Dim ws As Worksheet
num = 123
Set ws = num '← Variant値をObject変数に代入しようとしてエラー
Debug.Print ws.Name
End Sub
重ねてになりますが、変数を作成する際は、Variant型を使用しないで下さい。
なお、オブジェクト型 の変数にプリミティブ値を代入しようとすると、『コンパイルエラー:型が一致しません』となります。文字通り、代入する値の型と変数の型が異なるということです。
詳しく知りたい方は、下のリンクからご確認ください。リンクは実行時エラーの「型が一致しません」ですが、原因は同じです。
リンク
【実行時エラー13】型が一致しません / 特定のオブジェクト型に異なる型を代入
【原因3】プリミティブ値のVariant型変数にドットを付けた
プリミティブ値(数値や文字列など)が代入された、Variant型の変数にドット(修飾子)「.」を付けるとエラーが発生します。
Sub ErrSample424_3()
Dim i As Variant
'i に "ABC" が代入されたことで、実質的にStringになる
i = "ABC"
MsgBox i.Value '← ここでエラー
End Sub
再三になりますが、変数を作成する際、For Eachなどの一部を除いて、Variant型を使用しないで下さい。
なお、Long型やString型にドット(.)を付けると『コンパイルエラー:修飾子が不正です』となります。
【原因4】特定の読み取り専用のプロパティを代入した
特定の読み取り専用のプロパティに値を代入しようとすると、エラーが発生します。
Sub ErrSample424_4()
'Range("A1").Textは読み取り専用
Range("A1").Text = "abc" '← ここでエラー
End Sub
このエラーの予防策
まず、Variant型を使用しなければならない状況を除き、適切な型で変数を宣言してください。
適切な型で宣言すれば、明確なエラーメッセージが表示されて早い解決につながります。
また、Variant型はわずかにですが処理速度が遅くなりますので、気を付けましょう。