Excel VBAで処理を自動化していると、「今日の日付をセルへ入力したい」「処理を実行した日時を記録したい」といった場面がよくあります。
VBAでは、現在の日付を取得するなら「Date」、現在の日付と時刻を取得するなら「Now」を利用できます。
どちらも簡単に使えるため似たものとして扱われがちですが、実務では「日付だけ必要なのか」「実行時刻まで記録する必要があるのか」を考えて使い分けることが重要です。
たとえば、作成日を記録する処理にNowを使用すると、見た目では日付だけ表示されていても値には時刻が含まれている場合があります。後から日付を条件に検索・比較したとき、想定どおり一致しない原因になることがあります。
この記事では、VBAで今日の日付を取得する基本から、DateとNowの違い、セルへの入力方法、実務でどちらを使うべきかまで順番に解説します。
✅ VBAで今日の日付を取得する基本方法
VBAで現在の日付を取得するだけなら、複雑なコードを書く必要はありません。しかし、簡単だからこそ「DateとNowはほとんど同じ」と考えて使ってしまうケースがあります。画面上ではどちらも「2026/8/17」のように見えることがありますが、内部で保持している値は同じとは限りません。特に日付を条件判定や検索に利用するときは、時刻が含まれているかどうかが処理結果に影響します。
また、日付を文字列として扱うのか、日付型の値として扱うのかも重要です。まずは余計な変換を加えず、VBAで今日の日付を取得する基本から確認しましょう。
・Dateで今日の日付を取得する
VBAで現在の日付を取得するときは、Dateを使用できます。
基本的な書き方は非常にシンプルです。
Sub GetTodayDate()
Dim currentDate As Date
' 現在の日付を取得する
currentDate = Date
MsgBox currentDate
End Sub
このコードを実行すると、パソコンに設定されている現在の日付を取得できます。
ここで変数をStringではなくDate型として宣言しているのは、取得した値を最初から文字列として扱わないためです。
実務では取得後に、
- 日付を比較する
- 日数を計算する
- セルへ入力する
- ファイル名用に整形する
といった処理へ発展することがあります。
日付として取得した値はまずDate型で保持し、文字列が必要になった段階で用途に合わせて変換した方が、処理の役割を分けやすくなります。
・今日の日付をセルへ入力する
取得した日付をワークシートへ入力する場合も、Dateをそのままセルへ代入できます。
Sub WriteTodayDate()
Dim targetSheet As Worksheet
Dim currentDate As Date
Set targetSheet = ThisWorkbook.Worksheets("作業記録")
' 現在の日付を取得する
currentDate = Date
' A2セルへ日付型の値として入力する
targetSheet.Range("A2").Value = currentDate
End Sub
このコードでは、対象シートをtargetSheetとして明示しています。
単純に、
Range("A2").Value = Date
と書くこともできますが、実務ではどのブック・シートを操作しているのかが分かりにくくなる場合があります。
特に複数シートや複数ブックを扱う処理では、アクティブなシートが途中で変わるだけで意図しない場所へ日付を書き込む原因になります。
そのため、後から処理を追加・変更する可能性があるコードでは、対象となるWorksheetを変数へ設定し、操作先を明確にしておく方が安全です。
✅ VBAのDateとNowの違いを理解する
DateとNowは、どちらも現在の日付に関係する値を取得できるため、同じように使えると思われがちです。しかし、Dateが取得するのは現在の日付であるのに対して、Nowは現在の日付と時刻を取得します。この違いは、セルの表示だけを見ていると気付かないことがあります。
Excel側の表示形式が日付だけになっていれば、Nowで入力しても時刻部分が画面に表示されない場合があるからです。ところが内部の値には時刻が含まれているため、日付同士を比較すると結果が合わなくなることがあります。DateとNowを選ぶときは、見た目ではなく「処理に時刻が必要か」で判断しましょう。
・Dateは現在の日付だけを取得する
Dateを使用すると、現在の日付を取得できます。
たとえば、
Dim currentDate As Date
currentDate = Date
のように記述します。
今日が2026年8月17日であれば、日付として「2026/8/17」に相当する値を取得できます。
そのため、次のような用途ではDateが適しています。
- 処理日を記録する
- 今日の日付とデータの日付を比較する
- 当日分のデータを抽出する
- 今日を基準に期限を判定する
- 日付単位で集計する
「何時に処理したか」は必要なく、何日に処理したかだけ分かればよい場合はDateを選ぶと処理の意図も明確になります。
・Nowは現在の日付と時刻を取得する
Nowは、現在の日付だけでなく時刻も取得します。
Sub GetCurrentDateTime()
Dim currentDateTime As Date
' 現在の日付と時刻を取得する
currentDateTime = Now
MsgBox currentDateTime
End Sub
たとえば2026年8月17日の19時30分に実行した場合、日付だけでなく実行時点の時刻を含む値が取得されます。
Nowが向いているのは、
- マクロの実行日時を記録する
- データ更新日時を残す
- 処理開始時刻を記録する
- 操作履歴を残す
- 前回処理した日時と比較する
といったケースです。
「今日処理した」という情報だけでは不足し、いつ処理したのかを時刻まで残したい場合にNowを使用します。
・DateとNowは目的で使い分ける
DateとNowの違いを整理すると、次のようになります。
| 取得方法 | 取得する内容 | 向いている用途 |
|---|---|---|
| Date | 現在の日付 | 処理日、期限判定、日付比較 |
| Now | 現在の日付+時刻 | 実行履歴、更新日時、処理時刻 |
コードを書くときに重要なのは、「とりあえずNowを使っておけば時刻も取れるから便利」と考えないことです。
時刻が不要な処理にNowを使用すると、後から日付だけで比較したいときに時刻部分を取り除く処理が必要になることがあります。
反対に、処理履歴として実行した時刻まで必要なのにDateを使用すると、同じ日に複数回実行した処理を時系列で区別できません。
必要な情報が日付だけならDate、時刻まで必要ならNowという基準で選ぶと、コードを見たときにも処理の目的が伝わりやすくなります。
✅ VBAでDateとNowをセルへ正しく記録する方法
DateやNowをセルへ代入する処理自体は簡単ですが、実務では「値」と「見た目」を混同しないことが重要です。たとえばNowをセルへ入力した後、セルの表示形式を日付だけにすると、画面上ではDateを入力した場合とほとんど同じに見えます。
しかし、表示されていないだけで時刻部分が保持されていることがあります。この状態で別の日付セルと完全一致を判定すると、「同じ日なのに一致しない」という問題につながります。また、日付を最初から文字列へ変換して入力すると、その後の計算や比較が扱いにくくなる場合もあります。まず値を正しく保存し、表示方法は必要に応じて別に設定する考え方が安全です。
・日付と表示形式を分けて設定する
日付をセルへ記録するときは、Date型の値をセルへ代入し、必要なら表示形式を別に設定します。
Sub WriteFormattedDate()
Dim targetSheet As Worksheet
Dim currentDate As Date
Set targetSheet = ThisWorkbook.Worksheets("作業記録")
' 日付型として現在日を取得する
currentDate = Date
With targetSheet.Range("A2")
.Value = currentDate
' 表示方法だけを年月日の形式に整える
.NumberFormatLocal = "yyyy/m/d"
End With
End Sub
この書き方では、日付そのものを文字列へ変換せず、セルには日付として扱える値を入力しています。
表示形式だけを別に指定しているため、後から日付計算や条件判定へ利用しやすいのがメリットです。
たとえば「2026年8月17日」のような見た目が必要だからといって、取得直後にすべて文字列へ変換する必要はありません。
計算や比較に使う値と、人が見るための表示を分けて考えることで、後から処理内容を変更するときにも対応しやすくなります。
✅ VBAでDateとNowを比較するときの注意点
DateとNowの違いを理解していても、実務で特にミスが起こりやすいのが日付の比較です。セル上ではどちらも「2026/8/17」と表示されているのに、VBAで比較すると一致しないことがあります。この原因として考えられるのが、Nowに含まれている時刻部分です。Excelの日付と時刻は内部的に連続した数値として扱われるため、表示されていない時刻も比較結果に影響します。
この仕組みを知らないまま条件分岐を書くと、「今日のデータだけ処理するはずなのに対象にならない」といった問題につながります。日付単位で判定するのか、日時まで含めて判定するのかをコードを書く段階で明確にしておくことが重要です。
DateとNowの比較で時刻部分が影響する理由を理解するには、Excelが日付と時刻をどのような値として管理しているかを知っておくと分かりやすくなります。「【VBA】時間の計算ができる仕組みとは?シリアル値を理解して日付・時刻を正しく扱う方法」もあわせて参考にしてください。
・NowをDateとそのまま比較しない
たとえば、次のような比較には注意が必要です。
Sub CompareDateAndNow()
If Now = Date Then
MsgBox "今日の日付です"
End If
End Sub
Dateは現在の日付を表しますが、Nowには現在時刻も含まれています。
そのため、日中にこのコードを実行した場合、通常は同じ値として一致しません。
「どちらも今日を取得しているから同じ」と考えてしまうと、意図した条件判定にならない可能性があります。
日付単位の処理であれば、最初からDateを利用した方がコードの目的も分かりやすくなります。
一方、時刻まで含めた処理履歴を比較するのであればNowを使用します。
取得できる情報が多い方を選ぶのではなく、判定に必要な粒度に合わせることが重要です。
・セルの日付を今日かどうか判定する
実務では、「セルに入力されている日付が今日なら処理する」といった条件判定もよく使用します。
たとえばA2セルに日付が入力されている場合は、次のように判定できます。
Sub CheckTodayDate()
Dim targetSheet As Worksheet
Dim targetValue As Variant
Set targetSheet = ThisWorkbook.Worksheets("作業記録")
' 判定対象の値を取得する
targetValue = targetSheet.Range("A2").Value
' 日付として扱える値か確認してから比較する
If IsDate(targetValue) Then
If DateValue(targetValue) = Date Then
MsgBox "A2セルは今日の日付です"
End If
End If
End Sub
ここでは、いきなりDateと比較せず、最初にIsDateで日付として扱える値か確認しています。
業務ファイルでは、対象セルが空白だったり、文字列が入力されていたりすることがあります。
また、対象セルに時刻が含まれる可能性を考え、DateValueによって日付部分を基準に比較しています。
単純なコードより少し長くなりますが、入力内容が常に正しいとは限らない実務ファイルでは、こうした確認を加えておく方が安全です。
セルの値が日付として扱えるか確認するIsDateや、CDate・DateValueとの使い分けについては、「【VBA】日付かどうか判定する方法|IsDate・CDate・DateValue・VarTypeの使い分け」で詳しく解説しています。
✅ VBAで今日の日付を条件判定に活用する方法
今日の日付を取得できるようになると、単にセルへ入力するだけでなく、データ抽出や期限判定などさまざまな処理へ応用できます。ただし、Dateを何度もコードの各所へ直接記述すると、後から基準日を変更したいときに修正箇所が増えることがあります。また、テスト時に「今日ではなく昨日を基準に動作確認したい」と思っても、Dateが各所に散らばっていると確認しにくくなります。実務では現在日を一度変数へ取得し、その値を処理全体で利用する設計も有効です。コードの目的が分かりやすくなり、将来的な仕様変更にも対応しやすくなります。
・今日の日付を変数に保持して判定する
たとえば、A列の日付を確認し、今日のデータに該当する行を判定する処理を考えてみましょう。
Sub FindTodayData()
Dim targetSheet As Worksheet
Dim currentDate As Date
Dim lastRow As Long
Dim rowIndex As Long
Dim targetValue As Variant
Set targetSheet = ThisWorkbook.Worksheets("売上データ")
' 処理開始時点の日付を基準日として保持する
currentDate = Date
' A列を基準に最終行を取得する
lastRow = targetSheet.Cells(targetSheet.Rows.Count, "A").End(xlUp).Row
For rowIndex = 2 To lastRow
targetValue = targetSheet.Cells(rowIndex, "A").Value
' 日付として扱えるセルだけを判定する
If IsDate(targetValue) Then
If DateValue(targetValue) = currentDate Then
targetSheet.Cells(rowIndex, "B").Value = "本日"
End If
End If
Next rowIndex
End Sub
このコードでは、処理開始時にcurrentDate = Dateとして今日の日付を取得しています。
ループの中で毎回Dateを取得する書き方でも動作しますが、基準となる日付を変数へまとめておくことで、この処理がどの日付を基準としているのかが分かりやすくなります。
また、テストするときに、
currentDate = Date - 1
と一時的に変更すれば、昨日を基準とした動作確認もできます。
実務コードでは「短く書けるか」だけでなく、後からテストや仕様変更をしやすいかも意識すると保守しやすくなります。
✅ VBAのNowは処理日時の記録に活用できる
Nowは時刻を含むため日付だけの判定では扱いに注意が必要ですが、その特徴を活かせる場面も多くあります。代表的なのが、マクロを実行した日時の記録です。Dateだけでは「8月17日に実行した」ことまでは分かっても、その日に何時ごろ処理したのかは分かりません。同じ日に複数回データ更新を行う業務では、時刻まで残した方が履歴を追いやすくなります。ただし、記録した日時を後から日付単位で検索する場合は、時刻が含まれていることを意識する必要があります。DateとNowはどちらか一方に統一するのではなく、記録する情報の目的によって使い分けましょう。
・マクロを実行した日時を記録する
たとえば、処理が完了した日時をセルへ記録する場合は、次のようにNowを利用できます。
Sub RecordProcessDateTime()
Dim targetSheet As Worksheet
Dim processedDateTime As Date
Set targetSheet = ThisWorkbook.Worksheets("管理")
' 処理完了時点の日時を取得する
processedDateTime = Now
With targetSheet.Range("B2")
.Value = processedDateTime
' 日付と時刻の両方が分かるように表示する
.NumberFormatLocal = "yyyy/m/d h:mm:ss"
End With
End Sub
この方法なら、単に「処理済み」と記録するより、
いつ処理されたのか
まで確認できます。
たとえばデータ更新マクロなら、管理シートに最終更新日時を残しておくことで、「このファイルのデータはいつ更新されたものなのか」を利用者が判断しやすくなります。
Dateを使用する場合と同様に、Nowで取得した値そのものはDate型として保持し、セルの見た目は表示形式で調整しています。
✅ VBAのDate・NowとFormatは役割を分けて使う
日付を扱う処理では、DateやNowと一緒にFormat関数を使用することがあります。そのため、「今日の日付を取得するならFormatを使えばよい」と考えてしまうことがありますが、それぞれの役割は異なります。DateとNowは現在の日付や日時を取得するために使い、Formatは取得した値を目的に応じた文字列表現へ整えるために使用します。特にファイル名へ日付を含める場合など、日付型の値をそのまま利用できない場面でFormatが役立ちます。反対に、日付計算や比較を行う値まで最初から文字列化すると、後の処理が複雑になることがあります。取得・計算・表示を分けて考えることが、日付処理を分かりやすくするポイントです。
・日付を取得してから必要な場面で整形する
たとえば、今日の日付を「20260817」のような文字列にしたい場合は、次のようにできます。
Sub CreateDateText()
Dim currentDate As Date
Dim dateText As String
' 日付として取得する
currentDate = Date
' 文字列が必要な段階で表示形式を変換する
dateText = Format(currentDate, "yyyymmdd")
MsgBox dateText
End Sub
ここでは、
- Dateで現在日を取得する
- Date型として変数に保持する
- 必要になった段階でFormatを使う
という流れにしています。
たとえばファイル名を、
売上データ_20260817.xlsx
のようにしたい場合には、このような文字列化が便利です。
取得した今日の日付をファイル名へ付けて自動保存したい場合は、「【VBA】日付を含むファイル名で自動保存する方法|上書き防止と実務設計まで解説」で、保存処理まで含めた実装方法を紹介しています。
一方、セルに日付として保存して後から日数計算をするのであれば、無理にFormatで文字列へ変換せず、Date型のまま扱う方が適しています。
Format関数では日付だけでなく、数値なども用途に合わせた文字列へ変換できます。書式指定の使い分けについては、「【VBA】Format関数で文字列に変換する方法|日付・数値・表示形式を完全整理」で詳しく解説しています。
✅ Excel関数とVBAで今日の日付を取得する違い
ExcelにはTODAY関数やNOW関数もあるため、「VBAのDateやNowを使う必要があるのか」と迷うことがあります。どちらも現在の日付や日時を扱えますが、利用する目的が異なります。ワークシート上で今日の日付を自動表示したいだけなら、Excel関数の方が簡単なケースもあります。
一方、マクロの条件判定や処理日時の記録、自動保存などプログラムの処理に現在日時を利用したい場合はVBAが適しています。どちらが優れているという話ではなく、セルの計算として必要なのか、VBA処理の値として必要なのかで選びましょう。
・セル表示ならExcel関数、マクロ処理ならVBAを使い分ける
使い分けの一例は次のとおりです。
| やりたいこと | 選択肢 |
|---|---|
| セルに今日の日付を自動表示する | TODAY関数 |
| セルに現在日時を自動表示する | NOW関数 |
| VBAで今日を条件判定する | Date |
| VBAで実行日時を記録する | Now |
| VBAで日付入りファイル名を作る | Date+Format |
たとえば、単純にシート上へ常に今日の日付を表示したいだけなら、VBAを作成する必要性は高くありません。
一方、
「今日の日付に該当するデータだけ処理する」
「処理完了日時を自動的に記録する」
「実行日をファイル名に付けて保存する」
といった自動化では、DateやNowをVBAコードの中で利用できます。
処理の目的を基準に選ぶことで、不必要にVBAへ置き換えたり、反対に複雑な処理をワークシート関数だけで実現しようとしたりすることを避けられます。
VBAではなくワークシート上で現在の日付を自動表示したい場合は、「【Excel】TODAY関数で日付を自動更新する方法|今日の日付を表示する便利テクニック」を参考にしてください。日付だけでなく現在時刻まで表示したい場合は、「【Excel】NOW関数の使い方|現在日時を自動表示する方法と実務活用」で詳しく解説しています。
✅ まとめ:VBAで今日の日付はDate・現在日時はNowで取得する
VBAで現在の日付を取得するときはDate、日付と時刻の両方が必要な場合はNowを使用できます。どちらも簡単に記述できますが、Nowには時刻が含まれるため、日付だけを比較する処理では注意が必要です。実務では取得した値をDate型として保持し、表示やファイル名など文字列が必要な場面でFormatを使用すると、処理の役割を整理しやすくなります。また、対象セルにどのような値が入るか分からない場合は、IsDateなどによる確認を加えることで予期しないエラーや判定ミスを防ぎやすくなります。
- 今日の日付だけを取得する場合はDateを使用する
- 現在の日付と時刻を取得する場合はNowを使用する
- DateとNowは時刻部分の有無が異なる
- 日付だけを比較したい場合はNowの時刻部分に注意する
- セルの値が日付か不明な場合はIsDateで確認してから処理する
- 基準日を変数へ保持するとコードの意図や変更箇所が分かりやすくなる
- 実行日時や更新日時を残す処理にはNowが向いている
- Formatは日付の取得ではなく、必要な文字列表現へ整える場面で使用する
- セル上の自動表示ならTODAY・NOW関数、VBA処理ならDate・Nowと目的に応じて使い分ける
まずは「日付だけ必要なのか、それとも時刻まで必要なのか」を決めてからDateとNowを選びましょう。この基準を明確にしておくだけでも、日付比較や履歴管理で起こりやすい思わぬ判定ミスを防ぎやすくなります。