【2026年7月最新】VBA日付の取得・書式変換・比較・計算を完全解説!業務自動化との組み合わせ方も紹介
この記事の内容
「VBAで今日の日付を取得したい」「日付を特定の書式に変換したい」「2つの日付の差(経過日数)を計算したい」——ExcelのVBAマクロで日付処理を実装しようとすると、Date型の扱い方・Format関数の書き方・DateAdd/DateDiff関数の引数など、覚えることが多くて戸惑うことがあります。本記事ではVBAで日付を扱う際の全知識を、豊富なサンプルコード付きで完全解説します。
後半では、Claude CodeにVBAマクロの日付処理スクリプトを自動生成してもらう方法も紹介します。「VBAの書き方がわからない」「毎回ネット検索して時間をとられる」という方は、AI活用で業務効率を大幅改善できます。
01 BASICS VBAのDate型とは?基礎知識 シリアル値・Date型変数の宣言と代入方法
VBAのDate型は日付と時刻を格納するデータ型です。内部的には「シリアル値」と呼ばれる倍精度浮動小数点数(Double)として格納されています。整数部が日付(1900年1月0日からの経過日数)を、小数部が時刻(1日を1.0として)を表します。Date型の取れる範囲は西暦100年1月1日〜西暦9999年12月31日までです。
📚 用語解説
シリアル値(Serial Value):Excelおよびそれを土台とするVBAが日付・時刻を内部で管理する数値形式。1900年1月1日を「1」として、それ以降の日付は1日ごとに1加算した整数で表す。例えば2024年1月1日はシリアル値「45292」。時刻は1日を1.0として、12:00(正午)は0.5、18:00は0.75として小数で表現する。この仕組みを理解すると、日付の加減算が単純な足し算・引き算で実装できる理由が分かる。
' Date型変数の宣言と代入
Dim d1 As Date
Dim d2 As Date
' 日付リテラルは # で囲む
d1 = #2024/01/15#
' 文字列から自動変換(日本語環境では "yyyy/mm/dd" 形式)
d2 = "2024/03/31"
' シリアル値を確認する
Debug.Print CDbl(d1) ' 45306 のような整数値
Debug.Print CDbl(d2) ' 45381 のような整数値
' シリアル値から日付を取得
Dim serialVal As Long
serialVal = 45292
Dim dateFromSerial As Date
dateFromSerial = CDate(serialVal)
Debug.Print dateFromSerial ' 2024/01/01
Date型変数に値を代入する方法は3つあります。①日付リテラル(`#2024/01/15#`のように`#`で囲む)、②文字列からの自動変換(`"2024/01/15"`という文字列を代入すると自動的にDate型に変換される)、③Date関数・Now関数からの代入(後述)。日付リテラルはVBAが解釈する際に月/日の順(米国形式)で処理されることがあるため、実務では文字列変換または日付関数を使う方が安全です。
入力
検証
型変換
格納
して出力
02 GET DATE 今日の日付・現在時刻を取得する方法 Date・Time・Now・Year・Month・Day関数
VBAで現在の日付・時刻を取得する主な関数として`Date`(今日の日付)、`Time`(現在の時刻)、`Now`(日付と時刻の両方)があります。
' 現在の日付・時刻を取得
Dim today As Date
Dim currentTime As Date
Dim currentDateTime As Date
today = Date ' 例: 2024/07/10
currentTime = Time ' 例: 14:30:25
currentDateTime = Now ' 例: 2024/07/10 14:30:25
Debug.Print today
Debug.Print currentTime
Debug.Print currentDateTime
' 年・月・日・時・分・秒を個別に取得
Debug.Print Year(today) ' 2024
Debug.Print Month(today) ' 7
Debug.Print Day(today) ' 10
Debug.Print Hour(Now) ' 14
Debug.Print Minute(Now) ' 30
Debug.Print Second(Now) ' 25
' 曜日を取得(1=日曜, 2=月曜 ... 7=土曜)
Dim weekdayNum As Integer
weekdayNum = Weekday(today)
Debug.Print weekdayNum
' 曜日の名前を取得
Dim weekdayName As String
weekdayName = WeekdayName(Weekday(today))
Debug.Print weekdayName ' 例: 水曜日
📚 用語解説
WeekDay関数:VBAの組み込み関数で、指定した日付の曜日を1〜7の整数で返す。デフォルトは1=日曜日・7=土曜日だが、第2引数で週の開始曜日を変更できる(vbMonday=2で月曜始まりにする等)。実務では「土日を判定して処理を分岐する」勤怠・スケジュール系マクロでよく使用する。
' 月末日を取得する実用例
Function GetMonthEnd(targetYear As Integer, targetMonth As Integer) As Date
' 翌月1日から1日引くと月末日になる
Dim nextMonth As Date
If targetMonth = 12 Then
nextMonth = DateSerial(targetYear + 1, 1, 1)
Else
nextMonth = DateSerial(targetYear, targetMonth + 1, 1)
End If
GetMonthEnd = nextMonth - 1
End Function
' 使用例
Dim lastDay As Date
lastDay = GetMonthEnd(2024, 2) ' 2024/02/29 (うるう年)
Debug.Print lastDay
03 FORMAT Format関数で日付を書式変換する 書式コード一覧と実務でよく使うパターン
日付を「2024年7月10日(水)」「20240710」「R6.7.10」など特定の書式の文字列に変換するには`Format`関数を使います。
| 書式コード | 出力例 | 説明 |
|---|---|---|
| yyyy/mm/dd | 2024/07/10 | 西暦年4桁/月2桁/日2桁(最もよく使う) |
| yyyy年mm月dd日 | 2024年07月10日 | 日本語表記 |
| yyyymmdd | 20240710 | ファイル名用の区切り無し8桁 |
| yy/mm/dd | 24/07/10 | 西暦年下2桁 |
| mm/dd | 07/10 | 月日のみ |
| m月d日(aaa) | 7月10日(水) | 月日+曜日省略形 |
| dddd | 水曜日 | 曜日フルネーム |
| hh:mm:ss | 14:30:25 | 時分秒 |
| yyyy/mm/dd hh:mm | 2024/07/10 14:30 | 日付+時刻 |
| ggge年mm月dd日 | R6年07月10日 | 元号表記(和暦) |
' Format関数の使い方
Dim d As Date
d = #2024/7/10#
Debug.Print Format(d, "yyyy/mm/dd") ' 2024/07/10
Debug.Print Format(d, "yyyy年mm月dd日") ' 2024年07月10日
Debug.Print Format(d, "yyyymmdd") ' 20240710
Debug.Print Format(d, "m月d日(aaa)") ' 7月10日(水)
Debug.Print Format(d, "ggge年mm月dd日") ' R6年07月10日(和暦)
' Excelセルへの日付入力(書式付き)
Sub FormatDateToCell()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(1)
Dim targetDate As Date
targetDate = Date
' A1セルに値として入れる
ws.Range("A1").Value = targetDate
' 書式を設定
ws.Range("A1").NumberFormat = "yyyy/mm/dd"
' B1セルに文字列として入れる
ws.Range("B1").Value = Format(targetDate, "yyyy年mm月dd日")
End Sub
04 COMPARE 日付の比較・大小判定 比較演算子と期限チェックの実装パターン
VBAの日付比較は通常の比較演算子(`<`・`>`・`=`・`<=`・`>=`)でそのまま使えます。これはDate型が内部的に数値(シリアル値)であるためです。
' 日付の比較パターン
Dim d1 As Date
Dim d2 As Date
d1 = #2024/01/15#
d2 = #2024/03/31#
' 大小比較
If d1 < d2 Then
Debug.Print "d1はd2より前の日付"
End If
' 同日チェック
If d1 = Date Then
Debug.Print "d1は今日"
End If
' 期限チェックの実用例
Sub CheckDeadline()
Dim deadline As Date
deadline = #2024/07/31#
Dim daysLeft As Long
daysLeft = deadline - Date ' 日数差をシリアル値の引き算で取得
If daysLeft < 0 Then
MsgBox "期限を " & Abs(daysLeft) & " 日超過しています!", vbCritical
ElseIf daysLeft <= 7 Then
MsgBox "期限まであと " & daysLeft & " 日です。", vbExclamation
Else
MsgBox "期限まであと " & daysLeft & " 日あります。", vbInformation
End If
End Sub
📚 用語解説
DateSerial関数:年・月・日を個別の整数値から日付型を生成する関数。DateSerial(2024, 7, 10)は2024年7月10日を返す。月末日の計算(翌月1日の前日)や「n年後の同月同日」の計算に特に便利。また月に12を超える数や日に0以下の数を渡しても正しく繰り上がり・繰り下がりが処理されるため、「先月の末日」をDateSerial(Year(Date), Month(Date), 0)と書くことができる。
「"2024/12/01" > "2024/09/30"」のような文字列比較は辞書順比較になり、日付の大小とは一致しません。必ずDate型またはシリアル値(Long/Double)に変換してから比較してください。また、CDateへの変換前にIsDateによる検証を忘れずに行ってください。
05 CALCULATE DateAdd・DateDiff関数で日付計算 期間加算・経過日数・月数の差の求め方
日付の加減算には`DateAdd`関数、2つの日付の差を求めるには`DateDiff`関数を使います。これらは「月末の日数差」や「年単位の加算」など、単純な足し算では正確に計算できない処理で特に役立ちます。
' DateAdd関数: 日付に期間を加算する
' DateAdd(interval, number, date)
' interval: 加算単位 ("yyyy"=年, "m"=月, "d"=日, "ww"=週, "h"=時, "n"=分, "s"=秒)
' number: 加算する数値(負数で減算)
' date: 基準となる日付
Dim baseDate As Date
baseDate = #2024/01/31#
' 1年後 → 2025/01/31
Debug.Print DateAdd("yyyy", 1, baseDate)
' 3ヶ月後 → 2024/04/30 (月末を超えない)
Debug.Print DateAdd("m", 3, baseDate)
' 10日後 → 2024/02/10
Debug.Print DateAdd("d", 10, baseDate)
' 2週間後 → 2024/02/14
Debug.Print DateAdd("ww", 2, baseDate)
' ===========================
' DateDiff関数: 2つの日付の差を求める
' DateDiff(interval, date1, date2)
' interval: 差の単位 (DateAddと同じ)
' date1, date2: 比較する2つの日付(date2 - date1の差)
' ===========================
Dim startDate As Date
Dim endDate As Date
startDate = #2024/04/01#
endDate = #2024/07/10#
' 経過日数
Debug.Print DateDiff("d", startDate, endDate) ' 100
' 経過ヶ月数(切り捨て)
Debug.Print DateDiff("m", startDate, endDate) ' 3
' 経過年数
Debug.Print DateDiff("yyyy", #2000/05/15#, Date) ' 例: 24
DateDiff関数の注意点:月数差の「切り捨て」動作
DateDiff("m", d1, d2)は「完全な1ヶ月」の数を返します。例えば2024年4月1日〜2024年6月30日のDateDiff("m")は「2」です(4月→5月→6月で3ヶ月に見えますが、6月30日は「7月1日の前日」なので6月が完結していない)。この動作は直感と異なることがあるため、「○月経過しているか」を厳密に判定する場合は結果に+1するか、終了日を「翌月1日」に設定して計算するなどの工夫が必要です。
また、「今日から何営業日後か」という計算はDateAddやDateDiffだけでは対応できません。土日・祝日を除外した「実稼働日ベースの日数計算」が必要な場合は、ExcelワークシートのNetworkDays関数をVBAから呼び出す`Application.WorksheetFunction.NetworkDays(startDate, endDate)`を使うか、カレンダーデータ(祝日一覧)を別シートに持ちループ処理で計算するアプローチが一般的です。
(Date型)
で翌月加算
取得
月末日に丸め
出力
' 実務例:請求書の支払期日(翌月末)を自動計算
Function GetPaymentDueDate(invoiceDate As Date) As Date
' 翌月の1日を取得
Dim nextMonthFirst As Date
nextMonthFirst = DateSerial(Year(invoiceDate), Month(invoiceDate) + 1, 1)
' 翌月末日(翌々月1日 - 1日)
GetPaymentDueDate = DateSerial(Year(invoiceDate), Month(invoiceDate) + 2, 0)
End Function
' 使用例
Dim invoice As Date
invoice = #2024/06/25#
Debug.Print GetPaymentDueDate(invoice) ' 2024/07/31
📚 用語解説
DatePart関数:日付から指定した部分(年・月・日・時・分・秒・曜日・週番号・四半期)を整数として抽出する汎用関数。DatePart("q", Date)で現在の四半期(1〜4)を取得できる。Year()・Month()・Day()などの個別関数でも同じ処理ができるが、DatePartは動的に抽出部分を変えたい場合(interval引数に変数を渡す)に便利。
06 VALIDATE IsDate・CDate関数で安全に変換する ユーザー入力の日付バリデーションと型変換
ユーザーが入力した文字列や、セルから読み取った値が「有効な日付かどうか」を確認してからDate型に変換するには、`IsDate`関数と`CDate`関数の組み合わせを使います。
' IsDate: 日付として有効かチェック (True/False)
Debug.Print IsDate("2024/07/10") ' True
Debug.Print IsDate("2024/13/01") ' False (13月は存在しない)
Debug.Print IsDate("abc") ' False
' CDate: 文字列・数値をDate型に変換
Dim str1 As String
str1 = "2024年7月10日"
If IsDate(str1) Then
Dim d As Date
d = CDate(str1)
Debug.Print d ' 2024/07/10
End If
' セルから日付を安全に読み取るパターン
Sub ReadDateFromCell()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(1)
Dim cellValue As Variant
cellValue = ws.Range("A1").Value
If IsDate(cellValue) Then
Dim readDate As Date
readDate = CDate(cellValue)
Debug.Print "有効な日付: " & Format(readDate, "yyyy/mm/dd")
Else
MsgBox "A1セルに有効な日付が入力されていません。", vbCritical
End If
End Sub
セルの値をString型変数に代入するとエラーが発生することがあります。セルから値を読み取る際は`Dim cellValue As Variant`でVariant型を使い、IsDateで検証してからCDateで変換するパターンが最も安全です。
VBAのDate型とExcelの日付セルには「見た目と内部値の乖離」という落とし穴があります。Excelで「2024/07/10」と表示されていても、セルの実体はシリアル値(45483など)の数値です。`Range("A1").Value`を取得するとDouble型の数値が返ることがあります。これをIsDateで検証するとTrueになり、CDateで正しくDate型に変換できます。一方、`Range("A1").Text`を使うと画面表示の文字列(「2024/07/10」)が取得できますが、セルの書式によって「7月10日」や「2024.07.10」など異なる文字列になる場合があります。日付の読み取りは`.Value`を使い、シリアル値をCDateで変換する方が書式の影響を受けにくく安定した動作になります。
' 年齢計算の実用例(誕生日から今日までの年数)
Function CalcAge(birthDate As Date) As Integer
Dim age As Integer
age = DateDiff("yyyy", birthDate, Date)
' 今年の誕生日がまだ来ていない場合は1引く
If Month(birthDate) > Month(Date) Then
age = age - 1
ElseIf Month(birthDate) = Month(Date) And Day(birthDate) > Day(Date) Then
age = age - 1
End If
CalcAge = age
End Function
' 使用例
Dim birth As Date
birth = CDate("1990/05/25")
Debug.Print CalcAge(birth) ' 今日現在の年齢
📚 用語解説
CDate関数:様々なデータ型(String・Integer・Double等)をDate型に強制変換するVBAの組み込み関数。CDate("2024/7/10")・CDate(45292)どちらも2024/07/10を返す。注意点として、変換できない値が渡されると「型が一致しません」エラー(実行時エラー13)が発生するため、必ずIsDateで事前検証するか、On Error GoToでエラーハンドリングを実装すること。
07 AI AUTOMATION Claude CodeでVBAマクロを自動生成する 日付処理マクロをAIに書かせる具体的な指示方法
VBAの日付処理コードを毎回手書きするより、Claude Codeに「どんなマクロが必要か」を自然言語で伝えて自動生成させる方が圧倒的に効率的です。コードの書き方を覚えていなくても、「何をしたいか」を伝えるだけで動作するVBAスクリプトが得られます。
Claude Codeへの指示のコツは「何のデータが」「どのセルにあって」「どんな処理をして」「どこに出力したいか」を具体的に伝えることです。「VBAで日付を処理して」という抽象的な指示より「Sheet1のA列(2行目から100行目)に入力された日付(yyyy/mm/dd形式)をIsDateで検証し、有効なものはB列に翌月末日を計算して出力。無効なものはC列に"無効な日付"と表示するマクロを書いて」という具体的な指示の方が、一発で使えるコードが生成されます。
さらに「エラーハンドリングを入れて」「コメントを日本語で書いて」「シートが存在しない場合の分岐も入れて」という追加指示を加えると、実務投入できる品質のVBAコードが完成します。これはVBAの文法を学習するよりも先に「業務の自動化」を達成する最速の方法です。
Claude CodeにVBAマクロを依頼する際のプロンプト例
VBAの日付処理マクロをClaude Codeに依頼する際の具体的なプロンプト例を紹介します。以下のように「シート構成・列の意味・処理内容・出力先」を明確に伝えると、一発で使えるコードが返ってきます。
「ExcelのSheet1を使います。A列(2行目から)に顧客名、B列に契約開始日(yyyy/mm/dd)、C列に契約月数が入っています。D列に契約終了日(DateAddで契約月数後の日付)を計算して入力し、E列に今日から終了日までの残り日数を入れてください。残り30日以内はE列を赤色、31〜60日は黄色にしてください。IsDateでB列を検証し、無効な場合はF列に「日付エラー」と表示してください。エラーハンドリングとコメントを日本語で入れてください。」
ExcelVBAを使った業務自動化・日付処理マクロの構築について、弊社AI鬼管理では個別相談を承っています。「毎月の集計作業を自動化したい」「VBAの書き方がわからない」という方は、公式LINEまたはお問い合わせフォームからご連絡ください。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
AI活用を自社で回せるようになりたい方へ
AI鬼管理
Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。
よくある質問
Q. VBAで今日の日付を取得するには?
A. `Date`関数を使います。`Dim today As Date: today = Date`で今日の日付(時刻なし)が取得できます。現在の日時(時刻含む)は`Now`関数を使います。年月日を個別に取得する場合は`Year(Date)`・`Month(Date)`・`Day(Date)`関数が便利です。
Q. VBAで日付をyyyy/mm/dd形式に変換するには?
A. `Format`関数を使います。`Format(Date, "yyyy/mm/dd")`で今日の日付が「2024/07/10」のような文字列になります。和暦にする場合は`Format(Date, "ggge年mm月dd日")`で「R6年07月10日」形式になります。
Q. 2つの日付の差(日数)を計算するには?
A. `DateDiff`関数を使います。`DateDiff("d", startDate, endDate)`で日数差が取得できます。月数差は`"m"`、年数差は`"yyyy"`を引数に使います。また、Date型同士の引き算(`endDate - startDate`)でも日数差が数値として取得できます。
Q. VBAで月末日を取得するには?
A. `DateSerial(Year, Month + 1, 0)`を使います。例えば今月の月末日は`DateSerial(Year(Date), Month(Date) + 1, 0)`で取得できます。「月に0を渡すと前月末日」というDateSerialの仕様を利用したテクニックです。
Q. セルに入力された値が有効な日付かチェックするには?
A. `IsDate`関数を使います。`If IsDate(cellValue) Then`でTrueの場合のみ`CDate(cellValue)`でDate型に変換します。IsDateチェックなしにCDateを呼ぶと、無効な値が入っていた場合に実行時エラー13(型が一致しません)が発生します。
Q. VBAでDateAdd関数を使って1ヶ月後を取得すると何月になりますか?
A. `DateAdd("m", 1, baseDate)`で1ヶ月後が取得できます。月末処理も自動的に行われます(1月31日の1ヶ月後は2月29日または28日に丸められる)。年・週・日・時間の加算も同様にintervalパラメータを変えるだけで対応できます。
Q. VBAマクロを自分で書けないがAIで作れますか?
A. はい、Claude Codeに「何をしたいか」を自然言語で具体的に伝えることで、日付処理を含む実用的なVBAマクロが生成できます。「Sheet1のA列の日付を読んで、今日から30日以内の行を黄色でハイライトするマクロ」のように具体的に伝えることがポイントです。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。




