『たった1秒で仕事が片づくExcel自動化の教科書』(技術評論社)にて、
紙面の都合で書けなかった詳細をこちらで解説します。
■Valueプロパティについて~省略してもいいのかどうか
RangeやCellsの.Valueは省略したほうが良いか、書いた方が良いか。
結論から言えば、書きたければ書けば良いし、書きたくなければ書かなくて良い。
ただし、
.Valueを省略出来ない場合、.Valueは書けない場合、.Valueを書かない方が良い場合があります。
順に解説していきます。
.Valueを省略出来ない場合
Sheets(2).Range("A1:B5").Value = Sheets(1).Range("A1:B5").Value |
これは値のコピーと同様になります、Value値のみ左辺から右辺に代入されます。
この場合は、右辺の太字.Valueが省略できません。
左辺の.Valueは省略可能です。
Sheets(Range("A1").Value).Select |
A1セルにシート名が入っているとして、そのシートに対して何らかの処理をする場合です。
この場合も省略できません。
引数の型がObjectになっているため、省略してしまうとRangeオブジェクトを渡すことになってしまうからです。
Activesheet.Hyperlinks.Add Anchor:=Range("D20"), Address:=Range("F20").Value, TextToDisplay:=Range("D20").Value |
このTextToDisplayでは.Valueは省略できません。
.Valueは書けない場合
Activesheet.Hyperlinks.Add Anchor:=Range("D20").Value, Address:=Range("F20").Value, TextToDisplay:=Range("D20").Value |
このAnchorでは.Valueを書くことはできません。
Range("A1:B10").Sort Key1:=Range("A1").Value, Order1:=xlAscending, Key2:=Range("B1").Value, Order2:=xlDescending, Header:=xlNo |
並べ替えでHeader:=xlNoの場合は、Keyに値つまりValueを指定できません。
.Valueを書かない方が良い場合
Range("A1:B10").Sort Key1:=Range("A1").Value, Order1:=xlAscending, Key2:=Range("B1").Value, Order2:=xlDescending, Header:=xlYes |
並べ替えでHeader:=xlYesの場合は、Valueを付けても省略してもどちらでも動作します。
しかし、ここでの本質は、ソート範囲内における列位置を指定すべきものです。
Valueを指定するのは見出しの文字を引き渡すことになります。
xlYesの場合は良いのですが先のxlNoの例からも指定すべきではないです。
また、Valueを指定しなければ、見出し行のセル以外でも良く、
ソート範囲内のキーにしたい列のセルならどこでも良いのです。
(もっとも、中途半端な行を指定するのは、別の意味で良くありませんが)
変数 = WorksheetFunction.Match(Range("A1").Value, Range("B:B"), 0) |
この場合は、通常はValueをつけても動作します。
しかし、検索値が日付の場合は、うまく動作してくれません。
そもそも、WorksheetFunctionはシート関数です。
そしてその引数はセル(つまりRangeオブジェクト)を指定するものです。
可読性を考えて書き分ける
SubやFunctionの引数の場合、以下のように書き分けます。
Sub aaa(a1 As String) と Sub bbb(b1 As Range) |
のようなSubが複数存在している場合です。
ある程度規模のプログラムを作れば大抵は存在します。
この時、Call側では
Call aaa(セル.Value) Call bbb(セル) |
このように、引き渡す型を明示します。
説明は不要だと思いますが、
aaaでは、.Valueは書いても書かなくても良い。
bbbでは、.Valueは書けない。
つまり、両方とも書く必要はないのですが、このような場合は、
あえてaaaでは.Valueで渡してあげます。
これが可読性を上げるということです。
最後に、Valueの省略において、このような記事を見かけました。
Sub 文字列追加 Dim c For Each c in Selection c = "id" & c Next End Sub |
この場合、.Valueを付けないと動かないというもの。
いやいや、そもそも
Dim c |
って・・・
そんな話をするくらいなら、
Dim c As Range |
と指定しましょう。
Rangeオブジェクトから話がずれてしまっているし、無理やりサンプルを持ち出している感満載です。
というか、そもそもSelectionに対して、For Each処理を初心者に教えるべきではないですね。
ということで、最初に書いたように、省略出来ない場合もあれば、
オブジェクトとして扱うために.Valueは書けない場合もる。
なので、
書きたければ書けば良いし、書きたくなければ書かなくて良い。
ちょっと無責任な結論になってますが、
できれば、Rangeオブジェクトの本質を知ったうえで、書く書かないを決めていただきたいと思います。
『たった1秒で仕事が片づく Excel自動化の教科書』執筆陣が自ら直接指導。
実務直結・一日集中・受講後無期限サポート付きのマクロVBAセミナー