Sub Sample1()
Dim Target As Variant
Target = Range("A1")
Target.Value = 100
End Sub
上のコードでは、バリアント型で宣言した変数Targetに、セルA1を格納しています。いや、しているつもりです。その後、オブジェクト(ここではセルA1)が格納されたオブジェクト変数としてValueプロパティを操作していますが、そこでエラーになります。オブジェクトを格納するときにSetステートメントを付けてないので、変数Targetには、Rangeオブジェクトの既定プロパティであるValueプロパティの値が格納されます。変数Targetはオブジェクト変数ではなく、内部形式が文字列型の変数となります。文字列型変数に対してValueプロパティを操作しようとしたので「(そのプロパティを使うには)オブジェクトが必要です」と怒られたわけです。
正しくは次のようにします。
Sub Sample2() Dim Target As Variant Set Target = Range("A1") Target.Value = 100 End Sub
と、これがヘルプでも紹介されている原因のひとつです。しかし、このエラーは次のように、読み取り専用プロパティに値を設定しようとしたときにも発生します。
Sub Sample3()
Range("A1").Text = 100
End Sub
Sub Sample4()
Range("A1").HasFormula = False
End Sub
エラー番号387の「プロパティは値を設定できません」あたりのエラーが表示されたらわかりやすいのですが、このミスで「オブジェクトがない」と怒られても、もうちょっと違う言い方があるだろ?…みたいな。
もちろんこの場合は、読み取り専用プロパティに値を設定しようとしているのが原因です。