Excelにおける日付操作に役立つ5つの関数――IsDate、DateValue、DateSerial、DateAdd、DateDiffの使い方:VBA/マクロ便利Tips
業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、IsDate、DateValue、DateSerial、DateAdd、DateDiffという日付操作に関する5つ関数の使い方について。
今回のTipsも関数の使い方について解説する。今回は、「IsDate」「DateValue」「DateSerial」「DateAdd」「DateDiff」という日付操作に関する5つ関数の使い方だ。なお、関数の基本的な使い方については、Tips「コンパイルエラーにならない関数の使い方――括弧の有無、複数の引数、Callステートメント、戻り値、名前付き引数と順番」を参照してほしい。
- セルが日付かどうかを判定するIsDate
- 文字列の日付情報を日付型の値に変換するDateValue
- 月末を求めるときなどに役立つDateSerial
- 指定された時間間隔を加算した日付を返すDateAdd
- 2つの日付型の間隔を返すDateDiff
セルが日付かどうかを判定するIsDate関数
IsDateは、引数が日付の時は「True」を返し、それ以外は「False」を返す関数だ。
IsDate関数の書式
IsDate(調べる変数や式)
図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
「C4」のセルに入力された値が日付形式かどうかをIsDate関数で判別し(2行目)、日付形式なら「C5」のセルに「日付です。」と表示し(3行目)、そうでないなら、「日付ではありません。」と表示させる(5行目)。
リスト1のコードを「実行」ボタンに関連付け、実行すると図2のようになる。
文字列の日付情報を日付型の値に変換するDateValue関数
DateValueは、文字列の日付情報を日付型(Date)の値に変換する関数だ。
DateValue関数の書式
DateValue(date)
「date」は必須項目で、1年1月1日00:00:00から9999年12月31日23:59:59までの日時の値を表す文字列式を指定する。
シートに、図3のような「日付を表す文字列式」を入力するセルと「実行」ボタンを用意しておく。「日付を表す文字列式」を入力するセル「C2」にはExcelのメニューから、「セルの書式設定」で「表示形式」を「文字列」に指定しておく。そして「文字の位置」を「右寄せ」としておく。
リスト2は「日付を表す文字列式」を指定して「実行」ボタンをクリックした時に日付が表示されるコードだ。
Sub DateValue関数の使い方() If Range("C2").Value = "" Then MsgBox "日付を表す文字列式を入力。" Exit Sub Else Range("B4").Value = DateValue(Range("C2").Value) End If End Sub
「日付を表す文字列式」を入力するセル「C2」が未入力の場合は警告メッセージを表示して処理を抜ける(2〜4行目)。それ以外の場合はDateValue関数に「日付を表す文字列式」の「C2」セルに入力された値を指定する(6行目)。
このリスト2のマクロを「実行」ボタンに関連付け、実行した結果が図4だ。
月末を求めるときなどに役立つDateSerial関数
DateSerialは、時刻情報が午前0時に設定された、指定の年月日を表す日付型(Date)型の値を返す関数だ。
DateSerial関数の書式
DateSerial(year,month,day)
「year」は必須項目で「年」を表す、100〜9999の範囲の数値または数式を指定する。「month」は必須項目で「月」を表す、1〜12の範囲の数値または任意の数式を指定する。「day」は必須項目で「日」を表す、1〜31の範囲の数値または任意の数式を指定する。
シート内に、図5のような「日」を入力するセルと「実行」ボタンがあったとする。セル「B5」にはExcelメニューから「書式」をあらかじめ設定している。
リスト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
セル「C2」に値が入力されていない場合は、警告メッセージを表示して処理を抜ける(2〜4行目)。それ以外は6行目の処理を行う。
6行目では、DateSerial関数を使って「現在の年」を表す「Year(Now)」と、「現在の月」を表す「Month(Now)」と、セル「C2」に指定された値を指定し、対応する年月日を取得してセル「B5」に表示する。
リスト3のマクロを「実行」ボタンに関連付け、実行した結果が図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の値を指定する。
設定値 | 説明 |
---|---|
yyyy | 年 |
m | 月 |
d | 日 |
ww | 週 |
h | 時 |
n | 分 |
s | 秒 |
DateAdd Function (Visual Basic) |
「number」には追加する時間間隔を数値で指定する。将来の日付を取得するには、正の数、過去の日付を取得するには、負の数を指定する。「日付」には該当する日付を指定する。
シートに、図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
「時間間隔」を入力するセル「C2」が未入力の場合は、警告メッセージを表示して処理を抜ける(2〜4行目)。それ以外は(6〜8行目)の処理を行う。
それぞれのIntervalに「日」である「d」や「週」である「ww」や、「月」である「m」を指定して、セル「C2」に入力した「日数」「週」「月」が経過した日付を表示する。
このリスト4のコードを「表示」ボタンに関連付け、実行した結果が図8だ。
2つの日付型の間隔を返すDateDiff関数
DateDiff関数は、2つの日付型(Date)の間隔を返す関数だ。
DateDiff関数の書式(※ほとんど使用しない省略可能な引数は省略している)
DateDiff(Interval,Date1,Date2)
「Interval」には、DateAdd関数に出てきた表1の値を指定する。「Date1」と「Date2」には、日付を指定する。
シートに、図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
文字列型の変数「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だ。
まとめ
今回は「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.
関連記事
- スクショをExcelに張り付けるのに役立つ4つのテクニック
システム開発におけるソフトウェアテスト(結合テスト〜システムテスト)において重要視されるエビデンス(作業記録)。前後編の2回にわたって、エビデンスとしてスクリーンショットをキャプチャし、テスト仕様書や納品書に張り付けていく作業を自動化するためのVBA/マクロのテクニックを紹介する。後編は、画像ファイルをシートに張り付け、Excel 2013のメニューからスクショを直に張り付け、画像を縮小し、指定した時間にマクロを実行する方法を解説。 - [Esc]キーによるExcel VBAの実行中断を防止する
ExcelではVBA(Visual Basic for Applications)によってさまざまな処理を自動的に実行できる。しかし、VBAの実行中にユーザーが[Esc]キーあるいは[Ctrl]+[Break]キーを押すと、自動処理が止まってしまう。止めたくない場合は、Application.EnableCancelKeyプロパティの設定を変更する。 - Windows TIPSディレクトリ > プラットフォーム別 > Office > Excel