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