セルに入力されているデータを取得するのは簡単です。
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