ExcelマクロVBA技術解説 | Rangeオブジェクト.Valueの省略について | Excelマクロの問題点と解決策、エクセルVBAの技術的解説



最終更新日:2014-11-17

Rangeオブジェクト.Valueの省略について


エクセルVBAを教えていて、これほど多く聞かれる質問はないでしょう、
RangeやCellsの.Valueは省略したほうが良いか、書いた方が良いか、
当然、省略出来ない場合もあれば、オブジェクトとして扱うために.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オブジェクトの本質を知ったうえで、書く書かないを決めていただきたいと思います。




同じテーマ「ExcelマクロVBA技術解説」の記事

ユーザー操作を制限する(Locked,Protect,ScrollArea)
プログラミングの基本〜ロジックの組み立て
シートに数式を設定する時のセル参照の指定方法
標準モジュールとシートモジュールの違い
クリップボードを使わないセルのCopy
Rangeの使い方:最終行まで選択を例に
オブジェクト式について

新着記事 ・・・新着記事一覧を見る

データクレンジングと名寄せ|ExcelマクロVBA技術解説(10月20日)
SUMIFの間違いによるパフォーマンスの低下について|エクセル関数超技(6月17日)
条件式のいろいろな書き方:TrueとFalseの判定とは|ExcelマクロVBA技術解説(6月15日)
空白セルを正しく判定する方法2|ExcelマクロVBA技術解説(5月6日)
フルパスをディレクトリ、ファイル名、拡張子に分ける|ExcelマクロVBA技術解説(4月15日)
テキストボックスの各種イベント|Excelユーザーフォーム入門(4月9日)
フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除|ExcelマクロVBAサンプル集(4月4日)
最後の空白(や指定文字)以降の文字を取り出す|エクセル関数超技(3月26日)
先頭の数値、最後の数値を取り出す|エクセル関数超技(3月26日)
Excelファイルを開かずにシート名をチェック|ExcelマクロVBAサンプル集(3月23日)

アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|ExcelマクロVBA入門
2.RangeとCellsの使い方|ExcelマクロVBA入門
3.Range以外の指定方法(Cells,Rows,Columns)|ExcelマクロVBA入門
4.変数とデータ型(Dim)|ExcelマクロVBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|ExcelマクロVBA入門
6.定数と型宣言文字(Const)|ExcelマクロVBA入門
7.徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)|エクセル関数超技
8.マクロって何?VBAって何?|ExcelマクロVBA入門
9.CSVの読み込み方法|ExcelマクロVBAサンプル集
10.ひらがな⇔カタカナの変換|エクセル基本操作



  • >
  • >
  • >
  • Rangeオブジェクト.Valueの省略について

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。

    ↑ PAGE TOP