VBA CDate 関数:日付に変換する

はじめに

Excel VBA マクロの CDate 関数から日付に変換する方法を紹介します。

CDate 関数は、文字列や数値などを日付型 (Date) に変換します。

"2013年1月31日" なら 2013/01/31 を返します。

"3時4分5秒" なら 3:04:05 を返します。

文字列を日付型に変換したいときに使用します。

数値の年月日から日付に変換したいときは「DateSerial 関数」を使用します。
数値の時分秒から時刻に変換したいときは「TimeSerial 関数」を使用します。
文字列を日付に変換するには「文字列を変換する」をご覧ください。
  • 目次
    • CDate 関数
    • 解説
    • 使用例

CDate 関数

CDate()
を日付型 (Date) に変換します。

引数「値」文字列や数値を指定します。
戻り値の型日付型 (Date)

解説

文字列や数値を日付型 (Date) に代入すると、CDate 関数を使用したときと同じ結果になります。

引数「値」が "2013年1月2日 3時4分5秒" のような文字列なら、2013/01/02 3:04:05 の日時に変換します。

引数「値」が数値なら、日付型の初期値 1899/12/30 にその数値の日数を足した日付に変換します。小数は時刻になります。

変換できるのは日付型の範囲 西暦100年1月1日 ~ 西暦9999年12月31日 の間です。

年が 2 桁なら 0 ~ 492000 ~ 2049 年50 ~ 991950 ~ 1999 年 に変換します。Windows のバージョンによって変わります。

範囲外の値を指定すると「エラー 13 型が一致しません。」が発生します。

変換できない値を指定すると「エラー 13 型が一致しません。」が発生します。一月 のような漢数字は変換できません。

変換できるかどうかは「IsDate 関数」で判定できます。

24 時間以上

引数「値」が "24:00:00" のような、24 時間を超えるときは、変換できません。

24 時間以上の時刻を入力するには「TimeSerial 関数」を使用します。

使用例

日付に変換する。

Dim d As Date

d = CDate("2013/1/2")
Debug.Print(d) ' 2013/01/02

d = CDate("2013年1月2日")
Debug.Print(d) ' 2013/01/02

d = CDate("1:2:3")
Debug.Print(d) ' 1:02:03

d = CDate("1時2分3秒")
Debug.Print(d) ' 1:02:03

d = CDate("2013/1/2 3:4:5")
Debug.Print(d) ' 2013/01/02 3:04:05

d = CDate(0)
Debug.Print(d) ' 0:0:0、1899/12/30 は時刻を表す日付

d = CDate(1)
Debug.Print(d) ' 1899/12/31

d = CDate(2)
Debug.Print(d) ' 1900/01/01

d = CDate("2013/1/2") ' 全角は変換できる
Debug.Print(d) ' 2013/01/02

d = CDate("24:00:00")     ' エラー、24 時間を超える時刻は変換できない

d = CDate("一月三十一日") ' エラー、漢数字は変換できない

変換できるか判定

IsDate 関数」を使用して、変換できるか判定できます。

Dim s As String
s = "一月三十一日"

Dim d As Date

If IsDate(s) = True Then ' 変換できるときだけ日付にする
    d = CDate(s)
Else
    d = 0 ' 日付の初期値
End If

Debug.Print(d)

年月日、時分秒から変換

DateSerial 関数」を使用して、年月日から日付を入力できます。

Dim d As Date
d = DateSerial(2000, 12, 31)
Debug.Print(d) ' 2000/12/31

TimeSerial 関数」を使用して、時分秒から時刻を入力できます。

Dim d As Date
d = TimeSerial(1, 2, 3)
Debug.Print(d) ' 1:02:03

d = TimeSerial(24, 2, 3)
Debug.Print(d) ' 1899/12/31 0:02:03
Dim d As Date
d = DateSerial(2000, 12, 31) + TimeSerial(1, 2, 3)
Debug.Print(d) ' 2000/12/31 1:02:03