VBAで今日の日付を取得する方法|Date関数・Now関数・Format変換を完全解説
- Date関数で今日の日付を取得する基本的な使い方
- Now関数で日付+時刻を同時に取得する方法
- Format関数で日付の表示形式をカスタマイズする手順
- DateAdd・DateDiffで日付の加算・差分計算をする方法
- セルに今日の日付を自動入力するマクロの書き方
Excel VBAで今日の日付を取得したい場面は、業務マクロを作るうえで非常によく出てきます。ファイルを開いたときに自動で日付を記録したい、ボタンを押したら今日の日付をセルに入力したい、日付の計算をして期限を管理したい——こうした要求のすべてに対応できるのがDate関数です。
本記事では、VBAで日付を扱う基本中の基本であるDate関数の使い方から、Now関数との違い、Format関数による書式変換、DateAdd・DateDiffを使った日付計算、そして実務でそのまま使えるマクロの書き方まで、段階的にわかりやすく解説します。VBA初心者の方でも手を動かしながら学べる内容になっていますので、ぜひ最後まで読んでみてください。
Sub 今日の日付を入力()
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Range(“B2”).Value = Date
ws.Range(“B3”).Value = Format(Date, “yyyy年mm月dd日”)
ws.Range(“B4”).Value = Format(Date, “yyyy/mm/dd”)
ws.Range(“B5”).Value = Format(Date, “ggge年m月d日”)
MsgBox “日付の入力が完了しました”
End Sub
| A | B | |
|---|---|---|
| 1 | フォーマット | 結果 |
| 2 | Date関数 | 2026/02/21 |
| 3 | yyyy年mm月dd日 | 2026年02月21日 |
| 4 | yyyy/mm/dd | 2026/02/21 |
| 5 | 和暦(ggge年m月d日) | 令和8年2月21日 |
☝ Format関数で日付の表示形式を自由にカスタマイズできます
VBAで今日の日付を取得する基本(Date関数)
VBAで今日の日付を取得するには、Date関数を使います。引数不要で呼び出せるシンプルな関数で、現在のシステム日付をDate型で返します。まずはその基本的な使い方を確認しましょう。
Date関数の使い方
Date関数は引数なしで使います。戻り値はDate型(日付型)で、時刻情報は含まれません。最もシンプルな使用例は次のとおりです。
Sub 今日の日付を取得()
Dim today As Date
today = Date
MsgBox "今日の日付: " & today
End Sub
このコードを実行すると、メッセージボックスに「今日の日付: 2024/02/19」のように表示されます(実行した日付によって変わります)。
- Date関数は引数不要で呼び出せる
- 戻り値はDate型(日付のみ、時刻は含まない)
- Variant型の変数でも受け取れるが、Date型を明示するほうが安全
変数に格納せず、直接セルに代入することも可能です。
Sub 日付をセルに入力()
Range("A1").Value = Date
End Sub
セルA1にDate型の値が代入されるため、Excelが自動的に日付として認識してセルに表示します。ただし、セルの表示形式によって見た目が変わる点は覚えておいてください。
Now関数で日付+時刻を取得する
日付だけでなく現在の時刻も同時に取得したい場合は、Now関数を使います。Now関数はシステムの現在日時を「年/月/日 時:分:秒」の形式で返します。
Sub 現在日時を取得()
Dim nowTime As Date
nowTime = Now
MsgBox "現在日時: " & nowTime
End Sub
実行すると「現在日時: 2024/02/19 14:35:22」のような結果が返ります。作業ログの記録や、処理の開始・終了時刻を保存したい場合などに重宝します。
時刻部分だけを取得したい場合はTime関数が使えます。
Sub 現在時刻のみ取得()
MsgBox "現在時刻: " & Time
End Sub
DateとNowの違いをまとめると
Date関数とNow関数は似ていますが、返す値が異なります。どちらを使うべきかは用途によって使い分けましょう。
- Date関数:今日の日付のみ(時刻なし) 例)2024/02/19
- Now関数:現在の日付+時刻 例)2024/02/19 14:35:22
- Time関数:現在の時刻のみ(日付なし) 例)14:35:22
日付だけを記録・比較したい処理にはDate関数、タイムスタンプとして日時の両方が必要な場合はNow関数と覚えておくと迷いません。
VBAで日付の表示形式を変換する(Format関数)
Date関数やNow関数で取得した日付は、そのままではシステムの日付形式で表示されます。「yyyy年mm月dd日」や「mm/dd/yyyy」のように自由に書式を変えたい場合は、Format関数を組み合わせて使います。
Format関数の基本構文は次のとおりです。
Format(日付, "書式文字列")
よく使う日付フォーマット一覧
実務でよく使われる書式文字列と、対応する出力例をまとめます。
Sub 日付フォーマットの例()
Dim d As Date
d = Date
' スラッシュ区切り(標準形式)
Debug.Print Format(d, "yyyy/mm/dd") ' 例: 2024/02/19
' ハイフン区切り(ISO形式)
Debug.Print Format(d, "yyyy-mm-dd") ' 例: 2024-02-19
' 日本語表記
Debug.Print Format(d, "yyyy年mm月dd日") ' 例: 2024年02月19日
' 曜日を含む
Debug.Print Format(d, "yyyy/mm/dd(aaa)") ' 例: 2024/02/19(月)
' 月と日のみ
Debug.Print Format(d, "mm月dd日") ' 例: 02月19日
' 年月のみ
Debug.Print Format(d, "yyyy年mm月") ' 例: 2024年02月
End Sub
- yyyy:4桁の西暦年(例: 2024)
- yy:2桁の西暦年(例: 24)
- mm:2桁の月(例: 02)
- m:ゼロ埋めなしの月(例: 2)
- dd:2桁の日(例: 09)
- d:ゼロ埋めなしの日(例: 9)
- aaa:短い曜日名(例: 月)
- aaaa:長い曜日名(例: 月曜日)
Format関数が返す値は文字列(String型)であることに注意してください。日付計算に使う場合はCDate関数などで変換が必要です。セルへの表示や文字列の結合にはそのまま使えます。
和暦(元号)表示にする方法
日本の業務では和暦が必要な場面も多くあります。VBAのFormat関数で和暦を直接出力するのはやや複雑ですが、Application.Textメソッドを使うと比較的簡単に実現できます。
Sub 和暦に変換()
Dim d As Date
d = Date
' Application.Textでワークシート関数のTEXTを呼び出す
Dim wareki As String
wareki = Application.Text(d, "ggge年m月d日")
MsgBox wareki ' 例: 令和6年2月19日
End Sub
書式文字列のgggが元号(令和、平成など)を表し、eが元号内の年を表します。ggでは元号の略称(例: 令)、gではアルファベット略称(例: R)が出力されます。
- ggg:元号フルネーム(例: 令和)
- gg:元号略称(例: 令)
- g:ローマ字略称(例: R)
- e:元号内の年数(例: 6)
- ee:2桁の元号内年数(例: 06)
VBAで日付の計算をする
日付を取得できたら、次は日付の計算です。「30日後の日付を求める」「2つの日付の間が何日あるか調べる」「特定の月の末日を取得する」といった処理は、VBAに用意された日付関数を使うことで簡潔に書けます。
DateAdd関数(日付の加算・減算)
DateAdd関数は、指定した日付に一定の期間を加算・減算した日付を返します。
構文:DateAdd(単位, 数値, 日付)
Sub DateAddの例()
Dim d As Date
d = Date ' 今日の日付
' 7日後
Debug.Print DateAdd("d", 7, d)
' 1ヶ月後
Debug.Print DateAdd("m", 1, d)
' 3ヶ月前
Debug.Print DateAdd("m", -3, d)
' 1年後
Debug.Print DateAdd("yyyy", 1, d)
' 2週間後
Debug.Print DateAdd("ww", 2, d)
End Sub
- “yyyy”:年
- “q”:四半期
- “m”:月
- “y”:年間通算日
- “d”:日
- “w”:週日(曜日)
- “ww”:週
- “h”:時間
- “n”:分
- “s”:秒
負の数値を指定すると日付を遡ることができます。「3日前」を求めるにはDateAdd("d", -3, Date)と書くだけでOKです。また、日付の加算は単純にDate + 1(翌日)やDate - 1(前日)のように算術演算子でも可能です。
DateDiff関数(日付の差分を計算)
DateDiff関数は、2つの日付の間隔を指定した単位で返します。「期限まで何日あるか」「入社から何年経過しているか」といった計算に使います。
構文:DateDiff(単位, 開始日, 終了日)
Sub DateDiffの例()
Dim startDate As Date
Dim endDate As Date
startDate = Date ' 今日
endDate = #12/31/2024# ' 年末
' 今日から年末まで何日か
Dim days As Long
days = DateDiff("d", startDate, endDate)
MsgBox "年末まであと " & days & " 日"
' 今日から年末まで何週間か
Dim weeks As Long
weeks = DateDiff("ww", startDate, endDate)
MsgBox "年末まであと " & weeks & " 週間"
End Sub
DateDiff関数の単位文字列はDateAddと共通です。開始日と終了日を逆にすると負の値が返るため、大小関係に注意して使いましょう。
DateSerial関数(年月日から日付を作成する)
DateSerial関数は、年・月・日の数値を指定してDate型の値を作成します。変数に格納した年・月・日から日付を組み立てたいときに便利です。
構文:DateSerial(年, 月, 日)
Sub DateSerialの例()
' 2024年3月1日を作成
Dim d As Date
d = DateSerial(2024, 3, 1)
MsgBox d ' 2024/03/01
' 今月の末日を取得(翌月の0日目 = 今月末)
Dim lastDay As Date
lastDay = DateSerial(Year(Date), Month(Date) + 1, 0)
MsgBox "今月末: " & lastDay
' 今年の最終日
Dim yearEnd As Date
yearEnd = DateSerial(Year(Date), 12, 31)
MsgBox "今年末: " & yearEnd
End Sub
DateSerialは「0日目」を指定できます。たとえばDateSerial(2024, 3, 0)は「2024年3月の0日目」=「2024年2月29日(末日)」となります。これを利用してDateSerial(Year(Date), Month(Date) + 1, 0)と書くことで、常に当月末日を取得できます。月の日数計算が不要になる便利なテクニックです。
DateSerialは年・月・日を個別に変数で持っている場合や、ループで月を変えながら日付を生成する場合に特に威力を発揮します。Year関数・Month関数・Day関数と組み合わせて使うのが定番です。
VBAでセルに今日の日付を入力するマクロ
ここまで学んだ知識を活かして、実際に業務で使えるマクロを作りましょう。「ボタンを押したら今日の日付を特定のセルに入力する」というシンプルな要件から始めて、より実践的なコードへと発展させます。
基本的なマクロコード
最もシンプルなパターンは、アクティブセルや固定のセル番地に今日の日付を代入するものです。
Sub 今日の日付をA1に入力()
' セルA1に今日の日付を入力
Range("A1").Value = Date
End Sub
日付を文字列として入力したい場合は、Format関数で変換してから代入します。
Sub 今日の日付を文字列で入力()
' "yyyy/mm/dd"形式の文字列として入力
Range("A1").Value = Format(Date, "yyyy/mm/dd")
End Sub
文字列として代入するとExcelが日付として認識しない場合があります。セル書式が「文字列」に設定されているときは特に注意が必要です。日付として認識させたい場合はValue2プロパティやCDate関数を活用してください。
実務例:ボタンクリックで今日の日付を自動入力
実務でよくある「作業記録シートに今日の日付・担当者・内容を入力する」マクロを例として紹介します。
Sub 作業記録を追加()
Dim ws As Worksheet
Dim lastRow As Long
ws = ThisWorkbook.Worksheets("作業記録")
' 最終行の次の行を求める
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
' A列: 今日の日付
ws.Cells(lastRow, 1).Value = Date
ws.Cells(lastRow, 1).NumberFormatLocal = "yyyy/mm/dd"
' B列: 現在時刻
ws.Cells(lastRow, 2).Value = Format(Now, "hh:mm")
' C列: 担当者名(入力ダイアログ)
Dim userName As String
userName = InputBox("担当者名を入力してください", "担当者入力")
If userName = "" Then
MsgBox "キャンセルされました"
Exit Sub
End If
ws.Cells(lastRow, 3).Value = userName
MsgBox "作業記録を追加しました(" & Format(Date, "mm/dd") & ")"
End Sub
Cells(ws.Rows.Count, 1).End(xlUp).Row + 1でA列の最終行の次の行番号を取得し、常にデータの末尾に追記しますNumberFormatLocal = "yyyy/mm/dd"でセルの表示形式を同時に設定していますInputBoxで担当者名を動的に入力させています。キャンセル時は空文字が返るので、その場合は処理を中断しています
このマクロをシート上のボタンに割り当てることで、クリック一発で記録が追加される作業ログシートが完成します。ボタンの作成は「開発」タブ→「挿入」→「ボタン(フォームコントロール)」から行えます。
また、ファイルを開いたときに自動で今日の日付を記録したい場合は、Workbook_Openイベントを使います。
' ThisWorkbookモジュールに記述
Private Sub Workbook_Open()
' ファイルを開いた日時を記録
Worksheets("ログ").Range("A1").Value = Now
Worksheets("ログ").Range("A1").NumberFormatLocal = "yyyy/mm/dd hh:mm"
End Sub
日付取得マクロの動作をデモで確認
Date関数とFormat関数による日付取得の結果を、下のインタラクティブデモで確認できます。
VBAマクロの実行結果は記事冒頭のインタラクティブデモで確認できます。ボタンを押すとアニメーションで動作をシミュレーションします。
よくある質問(FAQ)
Q. VBAのDate関数とワークシートのTODAY関数の違いは何ですか?
VBAのDate関数はVBAコード内で使う関数で、実行時点の日付をDate型で返します。一方、ワークシートのTODAY関数はセルに入力する数式で、ファイルを開くたびに自動で再計算されて常に今日の日付を表示します。VBAからTODAY関数の結果をセルに反映させたい場合はRange("A1").Formula = "=TODAY()"と書けばOKです。ただし、値として固定させたい(再計算させたくない)場合はRange("A1").Value = Dateを使います。
Q. VBAで特定の日付形式(例: yyyy/mm/dd)で文字列として取得するには?
Format関数を使います。Format(Date, "yyyy/mm/dd")と書くと、今日の日付を「2024/02/19」のような文字列として取得できます。文字列が必要な場面(ファイル名への埋め込みや文字列連結など)で活用してください。なお、戻り値はString型になるため、日付計算に使う場合はCDate関数でDate型に変換してから使いましょう。
Q. VBAで明日・昨日の日付を取得するには?
Date関数に整数を加算・減算するだけで簡単に求められます。
Dim tomorrow As Date
Dim yesterday As Date
tomorrow = Date + 1 ' 明日
yesterday = Date - 1 ' 昨日
n日後・n日前を求める場合はDate + n・Date - nでOKです。月単位・年単位で計算したい場合はDateAdd関数を使いましょう。
Q. VBAで曜日を取得するには?
Weekday関数で曜日を数値で取得し、WeekdayName関数で文字列(「月曜日」など)に変換できます。
Sub 曜日を取得()
Dim d As Date
d = Date
' 曜日を数値で取得(1=日曜, 2=月曜, ..., 7=土曜)
Dim wdNum As Integer
wdNum = Weekday(d) ' 既定はvbSunday基準
Debug.Print wdNum
' 曜日名を取得(日本語)
Dim wdName As String
wdName = WeekdayName(Weekday(d), False, vbSunday)
Debug.Print wdName ' 例: 月曜日
' 短縮形(月、火、水...)
Dim wdShort As String
wdShort = WeekdayName(Weekday(d), True, vbSunday)
Debug.Print wdShort ' 例: 月
End Sub
Format関数を使う方法もあります。Format(Date, "aaa")で「月」、Format(Date, "aaaa")で「月曜日」が返ります。こちらのほうがシンプルで覚えやすいです。
Q. ワークシート関数のTODAY()をVBAから呼び出す方法は?
VBAからワークシート関数を呼び出すにはWorksheetFunctionオブジェクト、またはApplicationオブジェクトを使います。ただし、TODAY関数は引数なしで現在日付を返すため、VBAのDate関数で代替できます。
' セルの数式にTODAY関数を設定する場合
Range("A1").Formula = "=TODAY()"
' VBAコード内でDate関数を使う場合(同じ結果)
Dim d As Date
d = Date
VBAコード内では素直にDate関数を使うのが最もシンプルです。TODAY関数をセルに埋め込みたい場合のみ、Formula プロパティを使ってください。
実際の操作手順をクリックして体験できます。各ステップをクリックしてみましょう。
まとめ
本記事では、VBAで今日の日付を取得・操作するための主要な関数と実践的な使い方を解説しました。最後に要点を整理します。
- Date関数:引数なしで今日の日付(Date型)を返す。最もよく使う日付取得の基本
- Now関数:現在の日付+時刻を返す。タイムスタンプを記録したいときに使う
- Format関数:日付の表示形式を文字列に変換。”yyyy/mm/dd”などの書式文字列で自由にカスタマイズ可能
- DateAdd関数:指定した単位で日付を加算・減算する。月単位・年単位の計算はこれを使う
- DateDiff関数:2つの日付の差分を指定単位で返す。「あと何日」の計算に便利
- DateSerial関数:年・月・日の数値から日付を生成する。月末日の取得にも使えるテクニックあり
日付操作はVBAマクロの中でも非常に頻出のテーマです。今回紹介した関数を組み合わせることで、作業ログの自動記録、期限管理、月次レポートの自動化など、さまざまな業務効率化に応用できます。まずはDate関数から試してみて、慣れてきたらDateAddやDateSerialにも挑戦してみてください。
VBAをもっと活用したい方は、以下の関連記事もあわせてご覧ください。
関連記事



VBA開発・GAS連携・Webアプリ化まで、
業務に合わせた最適な自動化をご提案します。
