【VBA】Valueプロパティは省略してよいか(Range.Value)
今回はRangeオブジェクトのValueプロパティを省略してよいかどうかを解説します。
Sub Sample1()
'Valueプロパティを省略しても結果は同じ
Range("A1").Value = 1
Range("A1") = 1
End Sub
上のサンプルコードのように、ほとんどの場合でValueプロパティは省略しても動作は変わりません。
ただ、可読性やミス防止の観点からValueプロパティを記載した方が良いケースがあります。
この記事では省略するとどうなるか、省略しない方が良いケースは何かの観点から解説したいと思います。
Valueプロパティを省略するとどうなるか
Sub Sample2()
'既定プロパティは[_Default]
Range("A1").[_Default] = 1
'Letも省略されている
Let Range("A1").[_Default] = 1
End Sub
実はRangeオブジェクトには[_Default]という既定プロパティがあり、Valueプロパティを省略するとこのプロパティがValueプロパティと同じ役割を果たします。
また、こちらが重要なのですがLetも省略されています。
普段気にすることは少ないのですが、「変数 = 1」といった簡単な代入も実は「Let 変数 = 1」でLetが省略されています。
VBAでは値を代入するときはLetを、オブジェクトを代入する場合はSetを使うといった仕組みになっています。
Valueプロパティを省略すると値を代入したいのか、Rangeオブジェクトを代入したいのか分かりにくいケースが出てきます。
この後説明しますが、こういった分かりにくいケースではValueプロパティの省略を避けましょう。
Valueプロパティを省略しない方が良いケース
Sub Sample3()
'値を渡しているのかオブジェクトを渡しているのか分からない
SampleFunction Range("A1")
End Sub
Private Sub SampleFunction(val As Long)
End Sub
Valueプロパティを省略しない方が良いのは、別のプロシージャに引数として渡すときです。
引数として渡す場合はLet, Setが記載できないため、値として渡しているのかオブジェクトとして渡しているのかぱっと見で判断することはできません。
こうしたケースではValueプロパティを省略しないようにしましょう。
自作のプロシージャだけでなく、VBAの組み込み関数やメソッドを使う際にも省略しないようにしましょう。