Excel VBAで日付を取得する方法をお探しですね。
広告
Excel VBAで日付・時刻を扱うなら知っておきたい基本関数
Excel VBAで日付や時刻を扱う場面って、実はすごく多いんです。
請求書に今日の日付を入れたり、契約の更新日を自動で計算したり、マクロを実行した時刻を記録したり、月次レポートを作ったり……。
こういうとき、「今日の日付だけあればいいのか」「時刻まで必要なのか」「○日後や○か月後を計算したいのか」によって、使う関数が変わってきます。
この記事では、**Date**、**Now**、**DateAdd**という3つの関数を中心に、初心者の方でも迷わず使い分けられるよう、基本から実務での注意点まで丁寧に解説していきます。
1. DateとNowの違いって?
まず押さえておきたいのが、**Date関数**と**Now関数**の違いです。
**Date関数**は、今日の日付だけを返してくれます。
時刻の部分は「0:00:00」として扱われるので、「処理した日付」だけをセルに記録したいときに便利です。
一方、**Now関数**は、今日の日付と現在の時刻の両方を返します。
「マクロを実行した正確な日時」をログとして残したいときは、こちらを使います。
どちらも戻り値は**Date型**です。
VBAでは日付も時刻も同じDate型で扱えるので、この点を理解しておくと混乱しにくくなりますよ。
“`vb
Sub GetTodayAndNow()
Dim today As Date
Dim currentDateTime As Date
today = Date
currentDateTime = Now
Debug.Print today ‘ 例: 2026/05/12
Debug.Print currentDateTime ‘ 例: 2026/05/12 14:30:15
End Sub
“`
ちなみに、Date型は内部的には数値として管理されています。
1日が数値の「1」に相当して、時刻は1未満の小数で表現されます。
だから、`Date + 1`とすると翌日になるし、`Date + 0.5`とすると12時間後になるんです。
ただ、コードを読みやすくするためには、単純な「翌日」「前日」くらいなら演算子でもいいですが、「3か月後」「45分後」みたいな計算は**DateAdd関数**を使った方が分かりやすくなります。
2. 日付や時刻をセルに入力してみよう
実務では、取得した日付や時刻を変数に入れるだけじゃなくて、ワークシートのセルに書き込むことが多いですよね。
たとえば、A1セルに今日の日付、A2セルに現在の日時、A3セルに現在の時刻を入力したいときは、こんな感じで書けます。
“`vb
Sub InputDateTimeToCells()
With Worksheets(“Sheet1”)
.Range(“A1”).Value = Date
.Range(“A2”).Value = Now
.Range(“A3”).Value = Time
.Range(“A1”).NumberFormat = “yyyy/mm/dd”
.Range(“A2”).NumberFormat = “yyyy/mm/dd hh:mm:ss”
.Range(“A3”).NumberFormat = “hh:mm:ss”
End With
End Sub
“`
時刻だけを取得する**Time関数**もありますが、DateとNowの使い分けで考えるなら、「日付のみ→Date」「日付と時刻→Now」と覚えておくとシンプルです。
ここで注意したいのは、**「値」と「表示形式」は別物**だということ。
セルにDateやNowを入れると、実際には日付データとして保存されます。
でも、画面上でどう見えるかはセルの表示形式次第です。
「2026年05月12日」みたいに文字列として固定したいなら**Format関数**を使えばOKですが、あとから日付計算や並べ替えをしたいなら、文字列じゃなくてDate型の値としてセルに入れておく方が安全です。
計算に使う列はDate型のまま保持して、帳票として見せる部分だけ表示形式を整える——これが実務では一番扱いやすい方法です。
3. DateAddで「○日後」「○か月後」を計算する
**DateAdd関数**は、指定した日付や時刻に対して、年・月・日・時・分・秒などの単位で加算・減算できる便利な関数です。
書き方は`DateAdd(interval, number, date)`で、
– **interval**:加算する単位(年、月、日など)
– **number**:加算する数(マイナスにすると過去になる)
– **date**:基準となる日時
を指定します。
たとえば、「今日から7日後」「現在時刻から30分後」「3か月前の日付」なんかを、意味が分かりやすい形で書けるのがDateAddの良いところです。
“`vb
Sub DateAddExamples()
Dim baseDate As Date
baseDate = Now
Debug.Print DateAdd(“d”, 7, Date) ‘ 今日から7日後
Debug.Print DateAdd(“m”, 1, Date) ‘ 今日から1か月後
Debug.Print DateAdd(“yyyy”, 1, Date) ‘ 今日から1年後
Debug.Print DateAdd(“h”, 3, baseDate) ‘ 現在日時から3時間後
Debug.Print DateAdd(“n”, 30, baseDate) ‘ 現在日時から30分後
Debug.Print DateAdd(“s”, -10, baseDate) ‘ 現在日時の10秒前
End Sub
“`
よく使うintervalはこんな感じです。
– 年:`”yyyy”`
– 月:`”m”`
– 日:`”d”`
– 週:`”ww”`
– 時:`”h”`
– 分:`”n”`(minuteの頭文字じゃないので注意!)
– 秒:`”s”`
ちなみに、月を加算するときに注意が必要なのが、「1月31日の1か月後」みたいな存在しない日付になるケースです。
このとき、VBAは自動的に月末日に調整してくれます。
たとえば、平年の1月31日に1か月を足すと2月28日、閏年なら2月29日になります。
便利な機能ですが、締日や契約更新日の計算では、この動きが意図と合っているか確認しておくと安心です。
4. 実務での使い分けと気をつけたいポイント
日付の計算は、DateAddを使わなくても`Date + 1`みたいな演算子で書けます。
翌日や昨日を求めるだけなら、この書き方は短くて分かりやすいですよね。
でも、「1か月後」「45分後」「2週間前」みたいに単位をハッキリさせたい処理では、**DateAddを使う方がコードの意味が伝わりやすく**なります。
特に複数人でメンテナンスするVBAでは、「何をどの単位で加算しているか」がコード上で読めることが大事です。
“`vb
Sub CompareCalculation()
Dim tomorrow1 As Date
Dim tomorrow2 As Date
Dim nextMonth As Date
tomorrow1 = Date + 1
tomorrow2 = DateAdd(“d”, 1, Date)
nextMonth = DateAdd(“m”, 1, Date)
Debug.Print tomorrow1
Debug.Print tomorrow2
Debug.Print nextMonth
End Sub
“`
もう一つ重要なのが、**DateやNowはパソコンのシステム日時を基準にしている**ということ。
端末の時計がずれていれば、VBAで取得する日付や時刻もずれます。
また、Date型で扱える範囲はだいたい西暦100年1月1日から9999年12月31日までなので、範囲外の計算をするとエラーになります。
ユーザーが入力した文字列を日付として扱うときは、いきなり**CDate**や**DateValue**で変換するんじゃなくて、**IsDate**で判定してから処理すると安全です。
“`vb
Sub SafeDateInput()
Dim inputValue As String
inputValue = “2026/05/12”
If IsDate(inputValue) Then
Debug.Print DateAdd(“d”, 10, CDate(inputValue))
Else
MsgBox “日付として認識できません。
”
End If
End Sub
“`
最後に一つ補足。
DateAddの`”w”`は「平日」と説明されることがありますが、土日を除いた営業日を自動で加算してくれる関数ではありません。
営業日計算をしたいときは、**Weekday関数**で土日を判定したり、祝日リストを別途用意したりする必要があります。
つまり、単純な日付・時刻の加減算はDateAddで十分ですが、会社独自の休日ルールを含む納期計算では、追加のロジックが必要になるわけです。
まとめ
まずは、
– **Date**で今日の日付
– **Now**で現在日時
– **DateAdd**で指定単位の加算・減算
という基本をしっかり押さえましょう。
そのうえで、**Format**、**Weekday**、**DateSerial**などの関連関数へ広げていくと、VBAの日付処理を実務で安定して使えるようになりますよ!
広告
