セルのValue2プロパティとは|Excel VBA |
セルに入力されているデータを取得するのは簡単です。
Sub Sample1()
MsgBox Range("A1")
End Sub
上記の「Range("A1")」はプロパティが省略されています。
このとき、Rangeオブジェクト(セル)のプロパティを省略するとValueプロパティとみなされます。したがって、上記のマクロは
Sub Sample1()
MsgBox Range("A1").Value
End Sub
と同じ意味になります。
このように、セルに入力されているデータを取得するにはValueプロパティを使います。
では、セルに表示形式が設定されている場合はどうでしょう。
たとえば、セルA1には「1000」のような数値が入力されていて、このセルに「\」記号と3桁区切りの通貨書式を設定してみます。
セルの表示は「\1,000」となります。
この状態でもValueプロパティは、あくまでセルに入力されているデータを返します。
そうではなく、セルに表示されている状態を取得したいときは、ValueプロパティではなくTextプロパティを使います。
Sub Sample2()
With Range("A1")
MsgBox "Value --> " & .Value & vbCrLf & _
"Text --> " & .Text
End With
End Sub

セルに入力された値が日付のときはどうでしょう。
セルA1に書式が何も設定されていないとき、セルに「2013/5/1」と入力すると、実際にはシリアル値がセルに格納され、同時に「yyyy/m/d」の表示形式が自動的に設定されます。
この状態で上記のSample2を実行すると、Valueプロパティは「2013/05/01」を返し、Textプロパティは「2013/5/1」を返します。

Valueプロパティはセルの値を返しますが、そのデータがシリアル値だった場合は、"短い日付の形式"で整形された結果を返します。
それに対し、Textプロパティはあくまでセルに表示されている状態を返すため、"セルの表示形式"で整形された結果が返るのです。
Valueプロパティは、セルに入力されているデータを返すはずです。
日付を入力したセルには、シリアル値という数値が入力されているのですが、Valueプロパティは、その数値を返してくれません。
こんなとき、シリアル値を取得するにはどうしたらいいでしょう。
次のように、Valueプロパティの結果に1をかけて求めることもできますが、美しくないですね。
Sub Sample3()
MsgBox Range("A1").Value * 1
End Sub
Rangeオブジェクトには、こうしたケースで役立つ専用のプロパティがあります。
それがValue2プロパティです。
Sub Sample4()
With Range("A1")
MsgBox "Value --> " & .Value & vbCrLf & _
"Text --> " & .Text & vbCrLf & _
"Value2 --> " & .Value2
End With
End Sub
Value2プロパティは、セルに日付データが入力されているとき、日付の表示形式による整形を行わず、シリアル値を返します。

セルの値がシリアル値だった場合、Valueプロパティは日付の表示形式で整形した結果を返しますが、その形式は、コントロールパネルの[地域](または[地域と言語のオプション])の[日付(短い形式)]に設定された形式に従います。
