VBA 日付を変換する

はじめに

Excel VBA マクロの日付 (Date) を文字列へ変換する方法を紹介します。

日付を文字列型 (String) に代入して、既定の形式で文字列に変換できます

Format 関数」から、日付の書式や形式を指定して文字列に変換できます。

Year 関数Month 関数Day 関数」から、年月日を取得できます。

Hour 関数Minute 関数Second 関数」から、時分秒を取得できます。

文字列を日付に変換するには「文字列を変換する」をご覧ください。
数値を日付に変換するには「数値を変換する」をご覧ください。
  • 目次
    • 日付を文字列に変換する
    • 日付を数値に変換する

日付を文字列に変換する

日付を文字列型 (String) に代入すると、文字列に変換できます。

Dim s As String
s = #1/2/2013#
Debug.Print(s) ' 2013/01/02

s = CDate("2012/3/4")
Debug.Print(s) ' 2012/03/04

s = CDate("1:23:45")
Debug.Print(s) ' 1:23:45

文字列に変換したときの形式は、Windows の「日付の短い形式」と「時刻の長い形式」になります。

時刻だけを文字列にしたときの日付は 1899/12/30 です。この日は時刻を表すために日付が表示されません。この日を表示するには、次の「Format 関数」を使用します。

Format 関数

Format 関数」を使用して、指定した書式の文字列に変換できます。

引数には (値, 書式) を指定します。書式には次のものがあります。

書式 結果 説明
yyyyy2000年を表示します。書式一つが下一桁を表しています。
mmm01月を表示します。
mm のようにすると 2 桁で表示します。日時分秒でも同じです。
dd2日を表示します。
hhh03時を表示します。
nn4分を表示します。
ss56秒を表示します。
Dim d As Date
d = "2000/1/2 3:4:56"

Debug.Print(Format(d,"yyyy/m/d"))       ' 2000/1/2

Debug.Print(Format(d,"yyyy年mm月dd日")) ' 2000年01月02日

Debug.Print(Format(d,"h:n:s"))          ' 3:4:56

Debug.Print(Format(d,"hh:nn:ss"))       ' 03:04:56

紹介している書式は一部です。書式は Excel の表示形式とほぼ同じです。

詳しくは「エクセル 日付の表示形式の一覧」をご覧ください。

FormatDateTime 関数

FormatDateTime 関数」を使用して、Windows の日付と時刻の形式を指定して変換できます。

引数には (日付, 形式) を指定します。形式には次のものがあります。

書式 結果 説明
vbGeneralDate
(既定)
2000/01/02 3:04:05日付と時刻の一方または両方を表示します。日付部分がある場合は「短い形式」として表示します。時刻部分がある場合は「長い形式」として表示します。
vbLongDate2000年1月2日日付の「長い形式」を使用して日付を表示します。
vbShortDate2000/01/02日付の「短い形式」を使用して日付を表示します。
vbLongTime3:04:05時刻の「長い形式」を使用して時刻を表示します。
vbShortTime03:0424 時間形式 (hh:mm) を使用して時刻を表示します。
Dim d As Date
d = "2000/1/2 3:4:5"

Dim s As String
s = FormatDateTime(d)
Debug.Print(s) ' 2000/01/02 3:04:05

s = FormatDateTime(d, vbLongDate)
Debug.Print(s) ' 2000年1月2日

s = FormatDateTime(d, vbShortDate)
Debug.Print(s) ' 2000/01/02

s = FormatDateTime(d, vbLongTime)
Debug.Print(s) ' 3:04:05

s = FormatDateTime(d, vbShortTime)
Debug.Print(s) ' 03:04

vbGeneralDate を指定するか省略したときと、日付を文字列型に代入したときの結果が同じになります。

日付を数値に変換する

日付型の初期値 1899/12/30 が数値の 0 に変換されます。日付が 1 日増えるごとに数値も 1 増えます。

時刻は小数で表します。数値の 1 が 1 日になるので時間は次のように計算できます。

  • 1 時:1 / 24
  • 1 分:1 / 24 / 60
  • 1 秒:1 / 24 / 60 / 60
Dim d As Double
d = CDate("1899/12/30")
Debug.Print(d) ' 0

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

d = CDate("1899/12/29")
Debug.Print(d) ' -1

d = CDate("1:0:0")
Debug.Print(d) ' 4.16666666666667E-02

d = CDate("0:1:0")
Debug.Print(d) ' 6.94444444444444E-04

d = CDate("0:0:1")
Debug.Print(d) ' 1.15740740740741E-05

年月日、時分秒

Year 関数Month 関数Day 関数」を使用して、年月日を取得できます。

Hour 関数Minute 関数Second 関数」を使用して、時分秒を取得できます。

Dim d As Date
d = "2013/1/2 3:4:5"

Debug.Print(Year(d))    ' 2013
Debug.Print(Month(d))   ' 1
Debug.Print(Day(d))     ' 2

Debug.Print(Hour(d))    ' 3
Debug.Print(Minute(d))  ' 4
Debug.Print(Second(d))  ' 5  

曜日

Weekday 関数」を使用して、日付の曜日を取得できます。

Dim d As Date
d = "2013/1/6"
Debug.Print(Weekday(d))  ' 1、日曜日

d = "2013/1/12"
Debug.Print(Weekday(d))  ' 7、土曜日