日付は、Excelの中でも"やっかい"なデータのひとつです。Excelは、日付をシリアル値という連続した数値で管理しています。Windows版Excelのシリアル値は、1900年1月1日を「1」として、以降1日ごとに「1」ずつ増えていきます。1900年1月2日は「2」で、2010年1月6日は「40184」となります。
とはいえ、こんな訳の分からない数字を日付と認識できるほどヒトは頭がよくありません。会議の席で「じゃ、締切は40268でお願いします。あと、次回の打ち合わせを40229にしたいのですが、田中さんご都合は?」とか聞かれたところで、(Excelを起動していなければ)返答に困ってしまいます。まぁ、これはこれで、おもしろそうですけどね(笑)。
日付をシリアル値で管理すると、日付の計算で便利です。Excelは日付をシリアル値で管理したいのですが、ユーザーにはシリアル値をそのまま見せるわけにいきません。そこでExcelは、セルに日付が入力されたとき、次のような処理を内部で行います。
セルに入力されているシリアル値を確認するには、セルの表示形式を"標準"にします。
逆に、単なる数値を入力したセルでも、日付の表示形式を設定すると、その数値をシリアル値とみなして、日付のように表示されます。
VBAでも、日付は特別扱いです。セルに「2010/1/6」と入力したとします。セルの値として、本当は「40184」という数値が入力されているのですが、入力と同時に設定された表示形式で「2010/1/6」と表示されています。このセルの値をValueプロパティで調べてみましょう。
Sub Sample1() MsgBox Range("B2").Value End Sub
Valueプロパティは、シリアル値ではなく日付形式の値を返しました。セルの表示形式が反映されたのではありません。別の表示形式を設定していたとしても同じ日付形式を返します。ちなみに、表示形式を反映した「セルに表示されているデータ」を取得するには、Textプロパティを使います。
Sub Sample2() MsgBox Range("B2").Value & vbCrLf & Range("B2").Text End Sub
セルに入力されているシリアル値を取得するには、Value2プロパティを使います。
Sub Sample3() MsgBox Range("B2").Value2 & vbCrLf & Range("B2").Text End Sub
さて、このように"やっかい"な日付データを検索しようとすると、さらに"やっかい"な問題が次々と現れます。次ページから、VBAで日付を検索するときの注意やポイントなどを解説しましょう。