Excelにおける日付操作に役立つ5つの関数――IsDate、DateValue、DateSerial、DateAdd、DateDiffの使い方VBA/マクロ便利Tips

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、IsDate、DateValue、DateSerial、DateAdd、DateDiffという日付操作に関する5つ関数の使い方について。

» 2015年06月01日 05時00分 公開
[薬師寺国安PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 8.1 Enterprise(64ビット)+Excel 2013


 今回のTipsも関数の使い方について解説する。今回は、「IsDate」「DateValue」「DateSerial」「DateAdd」「DateDiff」という日付操作に関する5つ関数の使い方だ。なお、関数の基本的な使い方については、Tips「コンパイルエラーにならない関数の使い方――括弧の有無、複数の引数、Callステートメント、戻り値、名前付き引数と順番」を参照してほしい。


セルが日付かどうかを判定するIsDate関数

 IsDateは、引数が日付の時は「True」を返し、それ以外は「False」を返す関数だ。

IsDate関数の書式

IsDate(調べる変数や式)


 図1のような「日付入力」するセルと「判定」セル、「実行」ボタンを用意しておく。

図1 「日付入力」するセルと「判定」セル、「実行」ボタンを配置

 リスト1はIsDate関数を用いて、日付かどうかを判定するコードだ。VBE(Visual Basic Editor)を起動して、メニューの「挿入」から「標準モジュール」を選択し、プロジェクト内に追加されるModule1内にリスト1のコードを記述する。

Sub IsDate関数の使い方()
  If IsDate(Range("C4").Value) = True Then
    Range("C5").Value = "日付です。"
  Else
    Range("C5").Value = "日付ではありません。"
  End If
End Sub
リスト1 IsDate関数を用いて、日付かどうかを判定するコード

 「C4」のセルに入力された値が日付形式かどうかをIsDate関数で判別し(2行目)、日付形式なら「C5」のセルに「日付です。」と表示し(3行目)、そうでないなら、「日付ではありません。」と表示させる(5行目)。

 リスト1のコードを「実行」ボタンに関連付け、実行すると図2のようになる。

図2 日付の場合は「日付です。」と表示(上図)、そうでない場合は「日付ではありません」と表示した(下図)

文字列の日付情報を日付型の値に変換するDateValue関数

 DateValueは、文字列の日付情報を日付型(Date)の値に変換する関数だ。

DateValue関数の書式

DateValue(date)


 「date」は必須項目で、1年1月1日00:00:00から9999年12月31日23:59:59までの日時の値を表す文字列式を指定する。

 シートに、図3のような「日付を表す文字列式」を入力するセルと「実行」ボタンを用意しておく。「日付を表す文字列式」を入力するセル「C2」にはExcelのメニューから、「セルの書式設定」で「表示形式」を「文字列」に指定しておく。そして「文字の位置」を「右寄せ」としておく。

図3 「日時を表す文字列式」を入力できるセルと「実行」ボタンを配置

 リスト2は「日付を表す文字列式」を指定して「実行」ボタンをクリックした時に日付が表示されるコードだ。

Sub DateValue関数の使い方()
  If Range("C2").Value = "" Then
    MsgBox "日付を表す文字列式を入力。"
    Exit Sub
  Else
    Range("B4").Value = DateValue(Range("C2").Value)
  End If
End Sub
リスト2 「日付を表す文字列式」を指定して、その日付を表示するコード

 「日付を表す文字列式」を入力するセル「C2」が未入力の場合は警告メッセージを表示して処理を抜ける(2〜4行目)。それ以外の場合はDateValue関数に「日付を表す文字列式」の「C2」セルに入力された値を指定する(6行目)。

 このリスト2のマクロを「実行」ボタンに関連付け、実行した結果が図4だ。

図4 「日付を表す文字列式」を指定して日付が表示された

月末を求めるときなどに役立つDateSerial関数

 DateSerialは、時刻情報が午前0時に設定された、指定の年月日を表す日付型(Date)型の値を返す関数だ。

DateSerial関数の書式

DateSerial(year,month,day)


 「year」は必須項目で「年」を表す、100〜9999の範囲の数値または数式を指定する。「month」は必須項目で「月」を表す、1〜12の範囲の数値または任意の数式を指定する。「day」は必須項目で「日」を表す、1〜31の範囲の数値または任意の数式を指定する。

 シート内に、図5のような「日」を入力するセルと「実行」ボタンがあったとする。セル「B5」にはExcelメニューから「書式」をあらかじめ設定している。

図5 「日」を入力するセルと「実行」ボタンが配置されている

 リスト3は、現在の月を基準に、図5のセル「C2」に入力された日付の年月日を返すコードだ。

Sub DateSerial関数の使い方()
  If Range("C2").Value = "" Then
    MsgBox "日数を入力してください。"
    Exit Sub
  Else
    Range("B5").Value = DateSerial(Year(Now), Month(Now), Range("C2").Value)
  End If
End Sub
リスト3 図5のセル「C2」に入力された日付の年月日を返すコード

 セル「C2」に値が入力されていない場合は、警告メッセージを表示して処理を抜ける(2〜4行目)。それ以外は6行目の処理を行う。

 6行目では、DateSerial関数を使って「現在の年」を表す「Year(Now)」と、「現在の月」を表す「Month(Now)」と、セル「C2」に指定された値を指定し、対応する年月日を取得してセル「B5」に表示する。

 リスト3のマクロを「実行」ボタンに関連付け、実行した結果が図6だ。

図6 指定した値に応じた「年月日」が表示された

 例えば、これを実行した日付が2014年4月19日だとしよう。

 「0」を指定すると「2014/4」の前月末日を取得する。

 「19」を指定すると「2014/4/19」を表示する。

 「30」を指定すると「2014/4/30」を取得するので、「35」を指定すると「2014/4/30」から「5」後の「2014/5/5」を取得する。

 「-10」を指定すると、「前月末日」から「10日」さかのぼった日付を取得する。「2014/3/31」から「10日」さかのぼった「2014/3/21」を取得するというわけだ。

指定された時間間隔を加算した日付を返すDateAdd関数

 DateAddは、指定された時間間隔を加算した日付を返す関数だ。

DateAdd関数の書式

DateAdd(Interval,number,日付)


 「Interval」には、表1の値を指定する。

表1 Intervalに指定する値
設定値 説明
yyyy
m
d
ww
h
n
s
DateAdd Function (Visual Basic)

 「number」には追加する時間間隔を数値で指定する。将来の日付を取得するには、正の数、過去の日付を取得するには、負の数を指定する。「日付」には該当する日付を指定する。

 シートに、図7のような時間間隔を数値で指定するセルと「表示」ボタンがあるとする。「表示」ボタンをクリックすると、指定したセルに指定した数値の経過した日付が表示される。

図7 時間間隔を数値で指定するセルと「表示」ボタンが配置されている

 リスト4は「時間間隔」を指定して「表示」ボタンをクリックしたときに適用するコードだ。

Sub DateAdd関数の使い方()
  If Range("C2").Value = "" Then
    MsgBox "時間間隔を指定してください。"
    Exit Sub
  Else
    Range("B4").Value = Range("C2").Value & "日後は" & DateAdd("d", Range("C2").Value, Date) & "です。"
    Range("B5").Value = Range("C2").Value & "週間後は" & DateAdd("ww", Range("C2").Value, Date) & "です。"
    Range("B6").Value = Range("C2").Value & "カ月後は" & DateAdd("m", Range("C2").Value, Date) & "です。"
  End If
End Sub
リスト4 「時間間隔」を指定して、その日付を表示するコード

 「時間間隔」を入力するセル「C2」が未入力の場合は、警告メッセージを表示して処理を抜ける(2〜4行目)。それ以外は(6〜8行目)の処理を行う。

 それぞれのIntervalに「日」である「d」や「週」である「ww」や、「月」である「m」を指定して、セル「C2」に入力した「日数」「週」「月」が経過した日付を表示する。

 このリスト4のコードを「表示」ボタンに関連付け、実行した結果が図8だ。

図8 指定した「時間間隔」の経過した日付が表示された

2つの日付型の間隔を返すDateDiff関数

 DateDiff関数は、2つの日付型(Date)の間隔を返す関数だ。

DateDiff関数の書式(※ほとんど使用しない省略可能な引数は省略している)

DateDiff(Interval,Date1,Date2)


 「Interval」には、DateAdd関数に出てきた表1の値を指定する。「Date1」と「Date2」には、日付を指定する。

 シートに、図9のように何日〜何日までの日付を入力するセルと「実行」ボタンがあったとする。

図9 何日〜何日までの日付を入力するセルと「実行」ボタンが配置されている

 リスト5は、日付を指定して、経過する「日」「週」「月」が、「日」で何日あるか、「週」で何週あるか、「月」で何カ月あるかを、任意のセルに表示させるコードだ。

Option Explicit
Sub DateDiff関数の使い方()
  Dim myDate1 As String
  Dim myDate2 As String
  myDate1 = Range("C2").Value
  myDate2 = Range("C3").Value
  If myDate1 = "" Or myDate2 = "" Then
   MsgBox "日付が指定されておりません。"
   Exit Sub
  Else
   Range("B5").Value = myDate1 & "から" & myDate2 & "までは " & DateDiff("d", myDate1, myDate2) & "日あります。"
   Range("B6").Value = myDate1 & "から" & myDate2 & "までは " & DateDiff("ww", myDate1, myDate2) & "週あります。"
   Range("B7").Value = myDate1 & "から" & myDate2 & "までは " & DateDiff("m", myDate1, myDate2) & "カ月あります。"
  End If
End Sub
リスト5 DateDiff関数を使って、指定した日付から日付までが「何日」「何週」「何カ月」あるかを表示するコード

 文字列型の変数「myDate1」と「myDate2」を宣言する(3〜4行目)。「myDate1」にはセル「C2」の値を、「myDate2」にはセル「C3」の値を格納しておく(5〜6行目)。

 もし、セル「C2」やセル「C3」にデータが入力されていなかった場合は、警告メッセージを発して処理を抜ける(7〜9行目)。それ以外の場合は11〜13行目の処理を行う。

 セル「B5」「B6」「B7」にDateDiff関数を使って、指定した日付から日付までが何日(d)あり、また何週(ww)あり、また何カ月(m)あるかを表示させる。

 このリスト5のコードを「実行」ボタンに関連付け、実行した結果が図10だ。

図10 指定した「日付」から「日付」までの「日数」「週」「カ月」が表示された

まとめ

 今回は「IsDate」「DateValue」「DateSerial」「DateAdd」「DateDiff」の5つの関数についての使い方を解説した。日付を扱う業務は日常的に行われている作業だ。その作業の中でこれらの関数を使用すれば、業務が簡略化できるのではないかと思う。

 「IsDate」関数の使い道も多いと思う。データ入力時に日付を入力する際、間違った日付の入力チェックができて大変に便利だと思う。

 「DateSerial」関数は、入力した日付を「yyyy/m/d」の形式に変換表示してくれる。入力フォームなどで、日付が異なった形式で入力されていた場合、一つの形式にまとめるのに便利ではないだろうか。

 「DateDiff」関数は、経過した「日」「週」「月」を返してくれる。使い方によっては大変に便利な関数だ。「Excelを起動した日から10日間だけ使える」というように、マクロの試用期間を制限するために使うことも可能だ。

 次回も引き続き、関数について解説する予定だ。お楽しみに。

著者紹介

薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所

薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。

1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。

1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。

2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。

Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。

Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。

Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。

Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。