オブジェクトが必要です。


上図は、文字列型(String)の変数に、Setステートメントを使って、オブジェクト(ここではWorksheetオブジェクト)を格納しようとしています。だからエラーです。

ヘルプを見ると、このエラーの原因があれこれと書かれていますし、よく見かけるような気がしたのですが、いざ再現しようとすると、なかなか発生しません。もしかすると、あまり起こらないエラーなのかもしれません。いずれにしても「オブジェクトが必要です」というのですから、必要なオブジェクトを正しく指定していないということでしょう。

オブジェクトを指定し忘れているケースとして、いくつかの誤りを試してみましたが、次のようなエラーになりました。

Sub Sample()
    Dim myRange As Variant
    myRange = Range("A1")
    myRange.Font.ColorIndex = 3
End Sub

最後のケースは注意が必要です。変数myRangeはバリアント型で宣言しました。myRangeなんて名前からして、おそらくは、この変数をオブジェクト変数として何かのセルを格納し、以降は変数を操作したいのではないかと想像できます。しかし、うっかりSetステートメントを忘れてしまいました。正しくは「Set myRange = Range("A1")」としなければなりません。でも、ここでエラーにはなりません。なぜなら、変数myRangeをバリアント型で宣言してしまったからです。バリアント型は何でも格納できる万能の型です。今回のようにオブジェクトを格納することもできますし、数値も文字列も格納できます。そして、セルを格納しようとした「myRange = Range("A1")」は、「Range("A1")」のプロパティが省略されているとみなされます。Rangeオブジェクトはプロパティを省略するとValueプロパティが指定されたものとみなされます。したがって、変数myRangeには「Range("A1").Value」が格納されます。いたって正常な処理です。しかし、次の行の「myRange.Font.ColorIndex」は「数値.Font.ColorIndex」または「文字列.Font.ColorIndex」ということになりますので「オブジェクトが必要です」というエラーになるわけです。

では、同じコードで、変数myRangeをオブジェクト型で宣言したらどうでしょう。

Sub Sample()
    Dim myRange As Range
    myRange = Range("A1")
    myRange.Font.ColorIndex = 3
End Sub

エラーが発生する場所が異なりますし、エラーの種類も違います。

今度の変数myRangeはオブジェクト型(Range)です。同じようにRange("A1")のプロパティが省略されていますので「Range("A1").Value」とみなされます。オブジェクト型変数にはオブジェクトしか格納できません。文字列や数値は格納できないので、そこでエラーです。