Valueってつけなくてもいいの?


セルに値を代入するとき、次のようにします。

Sub Sample1()
    Range("A1").Value = 100
End Sub

ただし、このValueをつけない書き方も、よく見ます。

Sub Sample2()
    Range("A1") = 100
End Sub

Valueって、つけなくてもいいのでしょうか?

何も指定しないとValueとみなされる

VBAでExcelを操作するときにはオブジェクト式を使います。オブジェクト式の構文は、次の2種類です。

  • 対象.様子 = 値
  • 対象.命令 オプション:=値

「対象.様子」は、操作対象の様子や状態を設定する構文です。たとえば、ワークシートの名前を設定するには「Worksheets("Sheet1").Name = "tanaka"」のようにします。一方の「対象.命令」は、何らかのアクションを伴う命令です。セルを削除するには「Range("A1").Delete Shift:=xlToLeft」とします。この「対象」をVBA用語でオブジェクトと呼び、「様子」をプロパティ、「命令」をメソッドと呼びます。

さて、セルはRangeオブジェクトで表されます。セルA1なら「Range("A1")」です。このセル(Rangeオブジェクト)の中に何が入っているか―という状態を表す「様子(プロパティ)」がValueプロパティです。したがって、セルに値を代入するときは

Sub Sample1()
    Range("A1").Value = 100
End Sub

と書きます。まず、これが原則です。

ところがVBAでは、Rangeオブジェクトのプロパティを省略することが許されています。そして、プロパティを省略するとValueプロパティが指定されたものとみなされます

と、VBAが気を利かせてくれているのです。

このように省略すると○○とみなすというプロパティを標準のプロパティと呼びます。Rangeオブジェクトの標準プロパティは、Valueプロパティです。

しかし、どんなオブジェクトにも標準プロパティがあるとは限りません。たとえば、ワークシートを表すWorksheetオブジェクトに標準プロパティはありません。というか、プロパティを省略して標準プロパティを利用するような使い方は、ほどんどがRangeオブジェクトだけです。ほかのオブジェクトのことは気にせず、RangeオブジェクトのValueプロパティだけ意識していればいいでしょう。実務的には、それで問題はありません。

省略したと認識することが大事

Valueプロパティを省略すべきか、すべきでないかは、意見が分かれるところです。また、明確な正解もありません。Valueプロパティをつけたときと、省略したときで、若干マクロの実行速度が変わるのですが、そんなもの、現在のパソコンでは誤差の範囲です。値はValueプロパティなのだから明記すべきだという意見はもっともですし、いや、省略した方が簡単なのだから省略すべきだという意見にも一理あります。

私は、どちらでもいいと思います。それよりも、大事なことはValueプロパティを省略しているんだと認識することです。プログラマは、すべての行や命令について「なぜそうしたか」を説明できなければいけません。ただ何となく、コピペ(笑)したら動いたから・・・なんてのは最低です。自分は今、Valueプロパティを省略したんだと。これはVBAのルールでValueプロパティを指定したことになるんだと。そう認識しているのなら、省略するのはかまわないと思います。