VBA の Date は 日付 を表現するためのデータ型です。VBA では日付は整数として扱われます。具体的には、1900年1月1日を 0 とし、その後の日付はそれに対する日数で表現されます。例えば、1900年1月2日は 1、1900年1月3日は 2、といったように日付が 1 日過ぎるごとに値が 1 増えます。日付だけでなく、時刻を表現することもできます。時刻は小数として表現され、1 日を 24 時間として、1 時間あたり 1/24、1 分あたり 1/1440、1 秒あたり 1/86400 といった形で表現されます。他のデータ型に比べて、この日付型変数というのは書き方が色々あるので、注意しなくてはいけない点がたくさんあります。色々な書き方に惑わされずに「とにかく正式な書き方以外はしない」と決めておいたほうが無用なトラブルを防ぐことができます。
【VBA】Date(日付型変数)
VBA の 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: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 関数などを用います。それらの関数ついては 現在の日付と時刻の取得 の記事を参照してください。
コメント
ChatGPTにVBAのDateを扱う際に注意すべき点を教えてもらいました。
[Q] VBAのDateを使うにあたって、注意すべき点は何ですか?
[ChatGPT] VBAのDateを使うにあたって、以下の点に注意する必要があります。
1. 日付の範囲に注意すること
VBAのDateで表現できる日付の範囲は、1900年1月1日から9999年12月31日までです。この範囲を超える場合は、日付を正しく表現できなくなるため注意が必要です。
2. 丸め誤差に注意すること
VBAのDateでは、時刻を小数で表現しますが、この小数部分は実際には有限の精度しか持ちません。そのため、時刻を計算する際に、丸め誤差が生じる可能性があります。このため、時刻を厳密に扱いたい場合には、Date型ではなく、Double型などを使う必要がある場合があります。
3. 地域設定に注意すること
VBAのDateでは、日付を表現する際に、地域設定に応じたフォーマットが使われます。そのため、プログラムを実行する環境の地域設定によって、日付の表現方法が異なることがあります。このため、プログラムを作成する際には、地域設定に依存しない形で日付を扱うようにする必要があります。
4. 日付の計算に注意すること
VBAのDateでは、日付を整数で表現していますが、日付の計算を行う際には、そのまま整数の計算を行うと誤った結果が得られる場合があります。例えば、1日を1として計算を行う場合、2月には28日または29日しかないため、1を加算することで3月1日になる場合があります。そのため、日付の計算を行う際には、DateAdd関数などを使って正しい計算を行うようにする必要があります。