日付型変数 (Date) について解説します。他のデータ型に比べて、この日付型変数というのは書き方が色々あるので、注意しなくてはいけない点がたくさんあります。色々な書き方に惑わされずに「とにかく正式な書き方以外はしない!」と決めておいたほうが無用なトラブルを防ぐことができます。
変数のデータ型⑦ 日付型変数 (Date)
日付型変数 (Date) は "" で囲んだ文字列や # で囲んだ日付リテラル値を 日付シリアル値 に変換して格納します。日付リテラル値というのは VBA が内部的に日付だと解釈できる文字のことです。VBA の日付リテラル値はアメリカ式に #Month/Day/Year# で記述することが正式となっています。
日付リテラル値で記述する方法
まずは日付リテラル値をそのまま日付型変数に入れるマクロを書いてみます。
Sub DateTest1()
Dim mydate As Date
mydate = #11/27/2017 10:45:20 PM#
Debug.Print mydate
End Sub
マクロを実行すると次のように表示されます。
冒頭でも言いましたけど、日付リテラル値で記述する場合は、この形式以外の書き方をしないほうがいいです。
文字列で記述する方法
日付を文字列で記述して格納することもできます。
Sub DateTest2()
Dim mydate As Date
mydate = "2017/11/27 22:45:20"
Debug.Print mydate
End Sub
マクロを実行すると次のように表示されます。
ただし、文字列で日付を記述してしまうと思わぬトラブルが発生する可能性があります。それについては以下の説明をお読みくださいな。
リテラル値と文字列どちらを使うべき?
リテラル値で記述されたマクロは、どのような環境にあっても正確に日付シリアル値に変換してくれるので動作がおかしくなることはありません。しかし文字列で日付を記述してしまうと、たとえば OS が Month/Day/Year の表記を強制するような設定になっていた場合、"2017/11/27 22:45:20" のような記述が正しいシリアル値に変換されない可能性があります。なので、できる限り日付リテラル値で記述することをおすすめします。
シリアル値とは?
ここまで何度も登場した「シリアル値」とはいかなるものかについて簡単に説明しておきます。シリアル値とは「1899 年 12 月 30 日を 0 として、以降 1 日経過するごとに 1 ずつ増えていく数のことです(時刻は小数部分になります)。ですから日付型変数には「数値」を入れてもかまわないのです。実際にちょっと試してみましょう。
Sub DateTest3()
Dim mydate1 As Date
Dim mydate2 As Date
mydate1 = 0
mydate2 = 1
Debug.Print mydate1
Debug.Print mydate2
End Sub
このマクロを実行すると、シリアル値 0 と 1 に対応する日付が
1899/12/31
と表示されます。逆に日付型変数に格納された値を Double などに入れるとシリアル値が返ってきます。
Sub DateTest4()
Dim mydate As Date
Dim x As Double
mydate1 = #11/27/2017#
x = mydate1
Debug.Print x
End Sub
マクロを実行すると 43066 という値が表示されます。
Date 型で指定できる日付の範囲
日付型変数には「西暦 100 年 1 月 1 日 ~ 西暦 9999 年 12 月 31 日 の日付」および「0:00:00 ~ 23:59:59 の時刻」を入れることができます。この範囲を超える日付、あるいは存在しない日付のリテラル値は記述した瞬間にコンパイルエラーが発生します。
現在の日付や時刻を日付型データに格納するときは Date 関数や Now 関数などを用います。それらの関数ついては 現在の日付と時刻の取得 の記事を参照してください。