【VBA入門】日付を扱う方法(取得、書式変換、比較、計算、チェック)

Date型って使っていますか?

日付データの足し算、引き算、比較など日付を扱いたい場合に使うと便利です。VBAではこれらを扱うための関数が用意されています。

この記事では、日付の扱い方について

  • Date(日付)型とは
  • 日付・時刻を取得する方法
  • Date型の扱い方
  • Format関数で書式を指定して変換する

など基本的な内容から、応用的な内容についても解説していきます。

今回は日付の扱い方について、使い方をわかりやすく解説します!

目次

Date(日付)型とは

VBAでは日付型というデータ型が用意されています。

日付型では日付と時刻の両方を扱います。日付型を使うと、日付の比較や加算、引き算などの計算ができて便利です。

日付型の値の範囲は、西暦100年1月1日 ~ 西暦9999年12月31日 の日付と時刻となっています。

日付型を記述する際には日付を「#」記号で囲みます。

書式は、

#月/日/年 時:分:秒#

です。

サンプルコードで確認しましょう。

Sub macro1()
    Dim d1 As Date, d2 As Date, d3 As Date
    d1 = #11/1/2017# ' #月/日/年#
    d2 = #9:10:30 AM# ' #時/分/秒#
    d3 = #11/1/2017 9:10:30 AM# ' #月/日/年 時/分/秒#
    
    MsgBox d1 & vbCrLf & _
            d2 & vbCrLf & _
            d3
End Sub

実行結果:
date02

文字列からDate型への自動変換

先ほどは日付型を記述する際に「#」記号で囲む、とお伝えしました。

でも、この書式は少々見づらいですので、文字列のように「”」記号で囲むこともできます。文字列を日付型に代入すると、自動で日付型に変換されることになります。

サンプルコードで確認しましょう。

Sub macro2()
    Dim d1 As Date, d2 As Date, d3 As Date
    d1 = "11/1/2017"
    d2 = "9:10:30"
    d3 = "11/1/2017 9:10:30"
    
    MsgBox d1 & vbCrLf & _
            d2 & vbCrLf & _
            d3
End Sub

実行結果:
date02

日付・時刻を取得する方法

VBAでは日付、時刻、日付と時刻の両方を取得する関数が用意されています。

現在の日付を取得するには、Date関数を使います。現在の時刻を取得するには、Time関数を使います。日付と時刻の両方を取得するには、Now関数を使います。

Date関数、Time関数、Now関数のいずれも戻り値はDate型です。引数はありません。

サンプルコードで確認しましょう。

Sub macro3()
    MsgBox Date & vbCrLf & _
            Time & vbCrLf & _
            Now
End Sub

実行結果:
date01

年、月、日、時、分、秒、曜日を取得する

年、月、日を取得するには、それぞれYear関数、Month関数、Day関数を使用します。

時、分、秒を取得するには、それぞれHour関数、Minute関数、Second関数を使用します。

曜日を取得するには、Weekday関数を使用します。

サンプルコードで確認しましょう。

Sub macro4()
    Dim d As Date
    d = "11/1/2017 9:10:30"
        
    MsgBox Year(d) & ", " & Month(d) & ", " & Day(d) & vbCrLf & _
            Hour(d) & ", " & Minute(d) & ", " & Second(d) & vbCrLf & _
            Weekday(d)
End Sub

実行結果:
date04

Date型の扱い方

Date型を使うと、日付の比較や加算、引き算などの計算ができて便利です。

詳しくみていきましょう。

日付を比較する方法

Date型を使うと、「>」や「<」などの比較演算子で比較することができます。

サンプルコードで確認しましょう。

Sub macro5()
    Dim d1 As Date, d2 As Date, d3 As Date
    d1 = Now
    d2 = "11/1/2017"
    d3 = "11/1/2017 23:59:59"
    
    If d1 >= d2 And d1 <= d3 Then
        MsgBox d1 & vbCrLf & _
                "期限範囲内です"
    Else
        MsgBox d1 & vbCrLf & _
                "期限範囲外です"
    End If
End Sub

実行結果:
date03

日付を計算する方法

Date型であれば、日付の加算、引き算の計算をすることもできます。

「+」、「-」などの算術演算子で計算することもできますが、VBAで用意されているDateAdd関数を使うと細かい設定ができて便利です。

算術演算子で計算する方法

算術演算子「+」、「-」を使って、数値の加算、引き算のように日付を計算することができます。

サンプルコードで確認しましょう。

Sub macro6()
    Dim d1 As Date, d2 As Date, d3 As Date
    d1 = "11/1/2017"
    d2 = d1 + 1
    d3 = d1 - 1
        
    MsgBox d1 & "の1日後は、" & d2 & vbCrLf & _
            d1 & "の1日前は、" & d3
End Sub

実行結果:
date05

DateAdd関数で計算する方法

指定した時間間隔を加算した日付を取得するには、DateAdd関数を使用します。

DateAdd関数は日付をバリアント型の値で返します。

以下のように記述します。

DateAdd (interval, number, date )

引数intervalは追加する時間間隔を書式で指定します。

引数numberは追加する時間間隔の値を指定します。正の値を指定すると先の日時が取得できますし、負の値を指定すると過去の日時を取得することができます。

引数dateは時間間隔を追加する日付型の値を指定します。引数intervalを指定する書式は以下のとおりです。

書式説明
yyyy
q四半期
m
y年間通算日
d
w平日
ww
h
n
s

サンプルコードで確認しましょう。

Sub macro7()
    Dim d1 As Date, d2 As Date, d3 As Date, d4 As Date
    d1 = "11/1/2017"
    d2 = DateAdd("yyyy", 1, d1)
    d3 = DateAdd("m", -1, d1)
    d4 = DateAdd("d", -1, d1)
        
    MsgBox d2 & vbCrLf & _
            d3 & vbCrLf & _
            d4
End Sub

実行結果:
date06

日付の間隔を取得する方法

日付の間隔を取得する場合は、DateDiff関数を使います。

DateDiff関数は日付をバリアント型の値で返します。

DateDiff (interval, date1, date2 [, firstdayofweek] [, firstweekofyear] )

「[ ]」内は省略することができます。

引数intervalは計算する時間間隔を書式で指定します。引数intervalを指定する書式はDiffAdd関数と同じですので、そちらを参照してください。

引数date1、date2は計算の対象となる2つの日付の値を指定します。引数firstdayofweekは、週の始まりの曜日を定数で指定します。

省略可能で省略すると、日曜日を指定したことになります。引数firstweekofyearは、年の第1週を定数で指定します。

省略可能で省略すると、1月1日を含む週を第1週と指定したことになります。引数firstdayofweekの設定は次のとおりです。

定数説明
vbSunday1日曜日(デフォルト値)
vbMonday2月曜日
vbTuesday3火曜日
vbWednesday4水曜日
vbThursday5木曜日
vbFriday6金曜日
vbSaturday7土曜日

引数firstweekofyearの設定は次のとおりです。

定数説明
vbFirstJan111 月 1 日が含まれる週から開始(デフォルト値)
vbFirstFourDays24 日以上が含まれる最初の週が年の第 1 週目
vbFirstFullWeek31 週間全体が含まれる最初の週がその年の第 1 週目

使い方をサンプルコードで確認しましょう。

Sub macro8()
    Dim d1 As Date, d2 As Date
    d1 = "11/1/2017"
    d2 = "4/1/2018"
        
    MsgBox DateDiff("yyyy", d1, d2) & "年" & vbCrLf & _
            DateDiff("m", d1, d2) & "ヶ月" & vbCrLf & _
            DateDiff("d", d2, d1) & "日"
End Sub

実行結果:
date07

時間の初めからの経過時間を取得する方法

例えば、年の初めや月の初めからの経過日数や日の初めからの経過時間など、時間の初めからの経過時間を取得するには、DatePart関数を使用します。

DatePart ( interval, date [, firstdayofweek] [, firstweekofyear] )

「[ ]」内は省略することができます。

引数intervalは計算する時間間隔を書式で指定します。引数intervalを指定する書式はDiffAdd関数と同じですので、そちらを参照してください。

引数dateは評価する日付型の値を指定します。引数firstdayofweek、firstweekofyearは、DateDiff関数と同じですので、そちらを参照してください。

サンプルコードで確認しましょう。

Sub macro9()
    Dim d As Date
    d = "11/1/2017"
        
    MsgBox "今年も今週で" & DatePart("ww", d) & "週目です" & vbCrLf & _
            "今年も今日で" & DatePart("y", d) & "日目です"
End Sub

実行結果:
date08

日付の妥当性をチェック判定する方法

有効な日付かチェックしたい場合には、IsDate関数を使用します。

引数に評価する日付型か文字列を指定します。日付に変換できる場合はTrueを、変換できない場合はFalseを返します。

サンプルコードで確認しましょう。

Sub macro10()
    MsgBox IsDate("11/1/2017")
End Sub

実行結果:
date09

文字列を日付データに変換する方法

文字列を日付データに変換するにはDateValue関数を使用します。

また、時刻データに変換するにはTimeValue関数を使用します。

サンプルコードで確認しましょう。

Sub macro11()
    Dim str1 As String, str2 As String
    str1 = "11/1/2017"
    str2 = "9:10:30"
    
    Dim msg As String
    If IsDate(str1) Then
        msg = DateValue(str1)
    End If
    
    If IsDate(str2) Then
        msg = msg & " " & TimeValue(str2)
    End If
    
    MsgBox msg
End Sub

実行結果:
date10

シリアル値に変換する方法

年、月、日を指定して日付を意味するシリアル値を取得したい場合は、DateSerial関数を使用します。

また、時、分、秒を指定して時刻を意味するシリアル値を取得したい場合は、TimeSerial関数を使用します。

サンプルコードで確認しましょう。

Sub macro12()
    MsgBox DateSerial(2017, 11, 1) & " " & _
            TimeSerial(9, 10, 30)
End Sub

実行結果:
date10

Format関数で書式を指定して変換する

これまで日付の表示には「/」記号を、時刻の表示には「:」記号を使用してきました。

でも、年、月、日、時、分、秒などを使って表示したい場合もありますよね。そんな場合はFormat関数を使用します。

Format関数の使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。

まとめ

ここでは、日付の扱い方について説明しました。

Date型で扱えば、日付の比較、計算などが関数を使って簡単にできて便利です。

どれも使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次