たった1日で即戦力になるExcelの教科書

■Valueプロパティについて(第2章 66P参照)

担当:山岡誠一(すごい改善)

 

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オブジェクトの本質を知ったうえで、書く書かないを決めていただきたいと思います。