このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。
消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。
問題のある表現が見つかりましたらお問い合わせよりご一報いただけますと幸いです。

【VBA】Valueプロパティは省略してよいか(Range.Value)

2024年3月12日

今回はRangeオブジェクトのValueプロパティを省略してよいかどうかを解説します。

Sub Sample1()
    
    'Valueプロパティを省略しても結果は同じ
    Range("A1").Value = 1
    Range("A1") = 1
End Sub

上のサンプルコードのように、ほとんどの場合でValueプロパティは省略しても動作は変わりません。

ただ、可読性やミス防止の観点からValueプロパティを記載した方が良いケースがあります。

この記事では省略するとどうなるか、省略しない方が良いケースは何かの観点から解説したいと思います。

VBAが難しいと感じたら
プロにお任せして代わりに作ってもらうのはいかがでしょうか?
マクロの作成請負をしていますので、こちらからご相談ください。

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の組み込み関数やメソッドを使う際にも省略しないようにしましょう。

VBAが難しいと感じたら
プロにお任せして代わりに作ってもらうのはいかがでしょうか?
マクロの作成請負をしていますので、こちらからご相談ください。

VBA

Posted by やろまい