セルのValue2プロパティ


セルに入力されているデータを取得するのは簡単です。

Sub Sample1()
    MsgBox Range("D1")
End Sub

上記の「Range("D1")」はプロパティが省略されています。Rangeオブジェクト(セル)では、プロパティを省略するとValueプロパティとみなされます。したがって、上記のマクロは

Sub Sample1()
    MsgBox Range("D1").Value
End Sub

と同じ意味になります。

このように、セルに入力されているデータを取得するにはValueプロパティを使います。では、次のケースではどうでしょう。

セルに「\」記号と3桁区切りの表示形式を設定しました。セルには「\1,000」と表示されています。この状態でもValueプロパティは、あくまでセルに入力されているデータを返します。

そうではなく、セルに表示されている状態を取得したいときは、ValueプロパティではなくTextプロパティを使います。

Sub Sample2()
    With Range("D1")
        MsgBox "Value--> " & .Value & vbCrLf & _
               "Text--> " & .Text
    End With
End Sub

これは、セルに日付が入力されているときも同じです。

だけど、あれ?ちょっと待ってください。日付って、Excelはシリアル値という連続した数値で管理しているんですよね。セルに日付を入力すると、実際には数値が入力されているはずです。セルの表示形式を「標準」にしてみると、確かに数値が入力されているのがわかります。

Valueプロパティは、セルに入力されているデータを返すはずです。日付を入力したセルには、シリアル値という数値が入力されているのですが、Valueプロパティは、その数値を返してくれません。あまり機会はないと思いますが、こんなときシリアル値を取得するにはどうしたらいいでしょう。次のように、Valueプロパティの結果に1をかけて求めることもできますが、美しくないですね。

Sub Sample3()
    MsgBox Range("D1").Value * 1
End Sub

実は、Rangeオブジェクトには、こうしたケースで役立つ専用のプロパティがあります。それがValue2プロパティです。

Sub Sample4()
    MsgBox Range("D1").Value2
End Sub

蛇足ですが、セルに入力されている数式を取得するには、Formulaプロパティを使います。

Sub Sample5()
    With Range("D1")
        MsgBox "Value--> " & .Value & vbCrLf & _
               "Formula--> " & .Formula
    End With
End Sub