エクセルマクロ・VBA達人養成塾 小川です。
今日は、よくある質問をひとつご紹介。
一昨日も、とある受講生から、フォローメールへのフィードバック中で、こういう質問を受けました。
セルの値を参照するときにRange(“A1”).Valueとしていますが、Valueは省略可能なのに敢えて記述しているのは理由があるのでしょうか?
以下、要点だけ解説すると…。
Range(“A1”) は、「セルA1」です。
その言葉が指すのは、「セルA1」というオブジェクトです。「セルA1の値」ではありません。
「セルA1を5にする」ことはできないですから、「セルA1を5にする」では、本来、意味が通らないことになります。
正しくニュアンスを伝えるには「セルA1の『値』を5にする」とか、そのように書くべきです。
(例えば…。小川慶一さんの苗字の文字列「小川」を「ムガペ」に変更することはできる。しかしそれは、小川慶一さんというオブジェクトそのものが「ムガペ」という文字列になったわけではない。変わったのは、あくまで、「苗字」というプロパティの値だけ)
ですから、本来、
Range(“A1”) = 5 のような構文は、意味をなさないわけです。
ただ、.Valueを初心者が抜かして書きかねない可能性を考慮して、
Range(“A1”) = 5 のような書き方をしたときには、
.Valueのことだろうと、「エクセルの中の小人ちゃん」が無理矢理解釈してくれているわけです。
また、一方。
「 Range(“A1”) 」という言葉だけでも、意味をなす場合があります。
それは、例えば、オブジェクトそのものを指し示したいとき。
Dim r As Range
Set r = Range(“A1”)
と書けば、オブジェクトそのものを指した、正しい用法になります。
(そして、変数 r によって、 Range(“A1”) への参照設定が可能になります )
つまり、
Range(“A1”)
と書いただけでは、「エクセルの中の小人」だけでなく、人間も、
その意図が、「値」なのか、「オブジェクトそのもの」なのかを判別できないわけです。
前後の文脈を読み解かないと、その言葉だけでは、
○ Range(“A1”) というオブジェクトを扱いたいのか
○ Range(“A1”).Value という値を扱いたいのか
の、どちらが本当にしたいことなのかが、分からないわけです。
プログラミングとは手順書作成ですから、少しでも分かりやすいほうが好ましいです。
明示しないことで混乱を生じてしまうのであれば、
明示したほうがよい、ということになります。