Excel VBAで処理を自動化していると、「マクロを実行した時刻を取得したい」「処理を開始した時間をセルに記録したい」といった場面があります。
VBAでは、現在時刻を取得するだけであればTimeを使うことで簡単に実現できます。また、Nowを使えば現在の日付と時刻をまとめて取得することも可能です。
ただし、TimeとNowは似ているように見えて、取得する値の範囲が異なります。単純に「現在の時間が分かればよい」のか、「いつ実行されたのかを日付も含めて残したい」のかによって使い分けることが大切です。
この記事では、VBAで現在時刻を取得する基本から、TimeとNowの違い、セルへの記録方法まで順番に解説します。後半では、実務で処理時刻を記録するときの考え方や注意点についても取り上げます。
✅ VBAで現在時刻を取得する基本
VBAで現在時刻を取得する処理自体は難しくありません。しかし、実務では「時刻だけ必要なのに日付まで保持していた」「セルに記録した値が想定した表示にならない」といった小さな違いが後から問題になることがあります。
特にTimeとNowは、実行した瞬間の情報を取得するという点では似ていますが、返される値は同じではありません。コードだけを見るとどちらでも動いているように感じるため、違いを意識せず使ってしまうこともあります。
また、取得した時刻を変数に保持する場合とセルへ直接書き込む場合でも、後から利用しやすい設計は変わります。単に現在時刻を表示するだけでなく、その値を何に利用するのかまで考えておくことが重要です。
まずは、もっとも基本となるTimeの使い方から確認していきましょう。
・Timeで現在時刻だけを取得する
VBAで現在の時刻だけを取得したい場合は、Time関数を使用できます。
基本的な書き方は非常にシンプルです。
Sub GetCurrentTime()
Dim currentTime As Date
' 現在時刻を取得
currentTime = Time
MsgBox "現在時刻:" & currentTime
End Sub
このマクロを実行すると、その時点の現在時刻が取得され、メッセージボックスに表示されます。
ここで変数をStringではなくDateとしているのは、取得した時刻を単なる文字列として扱うのではなく、VBAの日付・時刻データとして保持するためです。
現在時刻を画面に表示するだけなら文字列として扱う方法も考えられます。しかし、後から時刻を比較したり、処理時間を求めたりする可能性がある場合は、Date型のまま保持しておく方が扱いやすくなります。
実務では「表示するとき」と「データとして保持するとき」を分けて考えることが重要です。
・セルに現在時刻を入力する
取得した現在時刻は、Excelのセルへ直接入力することもできます。
たとえば、マクロを実行した時刻をA2セルへ記録する場合は次のように記述できます。
Sub WriteCurrentTime()
Dim targetSheet As Worksheet
Set targetSheet = ThisWorkbook.Worksheets("Sheet1")
' マクロを実行した現在時刻を記録
targetSheet.Range("A2").Value = Time
End Sub
この書き方では、ActiveSheetに依存せず、ThisWorkbook.Worksheets("Sheet1")によって書き込み先を明示しています。
小さなマクロであれば、
Range("A2").Value = Time
だけでも動作する場合があります。
しかし、この書き方ではアクティブになっているシートによって書き込み先が変わる可能性があります。別のシートを開いた状態で実行すると、意図しない場所へ時刻を書き込んでしまう原因になります。
そのため、後から別の担当者が改修する可能性があるコードや、複数シートを扱う実務マクロでは、どのブック・どのシート・どのセルを操作するのかを明確にする方が安全です。
なお、セルへ入力した時刻の見え方はセルの表示形式によって変わります。値そのものとExcel上の表示は別の要素なので、「秒まで表示されない」からといって必ずしも取得に失敗しているわけではありません。
✅ VBAのTimeとNowで取得できる値の違い
TimeとNowを使い分ける際に誤解しやすいのが、「どちらも現在の時間を取得できるので同じではないか」という点です。
確かに、現在時刻を確認するだけなら似た結果に見えることがあります。しかし、Timeは現在の時刻、Nowは現在の日付と時刻を取得するため、保持している情報が異なります。
この違いを理解しないまま処理履歴などに利用すると、後日確認した際に「何日の実行記録なのか分からない」という状態になりかねません。一方、時刻だけを扱う処理で必要以上に日付を含めると、その後の比較や条件判定で意図しない結果になることもあります。
関数の短さではなく、取得した値を何に使うのかを基準に選ぶことが大切です。
・Timeは現在の時刻を取得する
Timeは、現在の時刻部分を取得したい処理に向いています。
たとえば次のような用途が考えられます。
- マクロを開始した時刻を取得する
- 作業開始時刻をセルへ記録する
- 現在の時間帯を確認する処理に利用する
- 時刻を基準とした条件判定の材料にする
コードでは次のように取得できます。
Sub CheckTime()
Dim currentTime As Date
' 時刻だけを取得
currentTime = Time
Debug.Print currentTime
End Sub
Timeは「今日は何月何日なのか」ではなく、今が何時何分何秒なのかを扱いたい場合に適しています。
ここで重要なのは、Timeを文字列を返すだけの関数だと考えないことです。
ExcelやVBAでは日付・時刻を内部的な数値として扱えるため、取得した値を後続処理に利用できます。この仕組みを理解すると、単なる画面表示だけでなく、時刻比較や処理時間の管理などにも発展させられます。
ただし、日付・時刻が内部でどのように管理されているのかについては、現在時刻を「取得する」という今回のテーマとは検索意図が異なります。シリアル値を使った計算まで行う場合は、時刻計算の仕組みを別途理解しておくと安全です。
Timeで取得した時刻は、表示されている「○時○分」という文字だけではなく、Excel・VBA内部では計算可能な値として扱われます。開始時刻と終了時刻の差を求めるなど、時刻を使った計算まで行いたい場合は「【VBA】時間の計算ができる仕組みとは?シリアル値を理解して日付・時刻を正しく扱う方法」で、シリアル値と日付・時刻の関係も確認しておくと理解しやすくなります。
・Nowは現在の日付と時刻をまとめて取得する
一方、Nowは現在の日付と時刻の両方を取得します。
Sub GetCurrentDateTime()
Dim currentDateTime As Date
' 現在の日付と時刻を取得
currentDateTime = Now
Debug.Print currentDateTime
End Sub
たとえば実行時点が2026年8月18日の19時30分であれば、Nowにはその日付と時刻を組み合わせた値が格納されます。
そのため、Nowは「何時に実行したか」だけでなく、いつ実行したのかを日時として残したい処理に向いています。
代表的なのが、処理履歴や更新履歴の記録です。
Sub WriteExecutionDateTime()
Dim logSheet As Worksheet
Set logSheet = ThisWorkbook.Worksheets("Log")
' 実行日時を履歴として記録
logSheet.Range("A2").Value = Now
End Sub
ログとして後日確認するのであれば、時刻だけでは「どの日の記録なのか」が分からなくなります。そのため、このような用途ではTimeよりNowの方が適しています。
反対に、現在時刻だけを基準に処理したいのであればTimeを選択できます。
つまり、基本的な判断基準は次のようになります。
| 目的 | 使用するもの |
|---|---|
| 現在の時刻だけ取得したい | Time |
| 現在の日付と時刻を取得したい | Now |
| 実行した時刻だけ記録したい | Time |
| 実行日時を履歴として残したい | Now |
単純な違いですが、実務ではこの使い分けが重要です。
✅ VBAで現在時刻を記録するときの実務的な使い分け
TimeとNowの基本が分かっても、実務では「結局どちらを使えばよいのか」で迷うことがあります。特に処理開始時刻や更新履歴を記録するマクロでは、最初はTimeだけで十分に見えても、後から日付が必要になるケースがあります。
反対に、時間帯によって処理を分岐させたいだけなのにNowをそのまま比較すると、日付部分まで含まれるため条件式が分かりにくくなることがあります。取得できる情報が多ければよいとは限りません。
また、セルへ日時を記録する処理では、単に値を書き込むだけでなく「誰が見ても何の日時なのか分かること」も重要です。数か月後に別の担当者がコードを改修する可能性まで考えると、変数名やコメントにも意味があります。
ここでは、実際の業務でTimeとNowをどう選択するかを具体的に見ていきます。
・処理開始時刻をTimeで記録する
マクロの開始時刻を取得しておくと、「処理が何時に開始されたのか」を確認できます。
たとえば次のように記述できます。
Sub RecordStartTime()
Dim targetSheet As Worksheet
Dim processStartTime As Date
Set targetSheet = ThisWorkbook.Worksheets("Sheet1")
' マクロを開始した時刻を取得
processStartTime = Time
' 開始時刻をセルへ記録
targetSheet.Range("B2").Value = processStartTime
End Sub
ここでは、Timeを直接セルへ代入せず、一度processStartTimeという変数へ格納しています。
もちろん、次のように1行で記述することもできます。
targetSheet.Range("B2").Value = Time
単純に現在時刻を書き込むだけなら、この方法でも問題ありません。
しかし、取得した時刻を後続処理でも利用するのであれば、変数へ保持しておく方が処理の意図を把握しやすくなります。
たとえば将来的に「開始時刻と終了時刻を比較したい」という仕様が追加された場合でも、processStartTimeという変数があれば処理を拡張しやすくなります。
実務のVBAでは、コードを短くすることだけではなく、取得した値が何を意味しているのかをコードから判断できることも重要です。
・更新履歴にはNowで実行日時を残す
データ更新や集計処理の履歴を残す場合は、TimeよりNowの方が適しています。
たとえば、集計処理が完了した日時を管理シートへ記録する場合は次のようにできます。
Sub RecordUpdateDateTime()
Dim managementSheet As Worksheet
Dim updatedAt As Date
Set managementSheet = ThisWorkbook.Worksheets("管理")
' 現在の日付と時刻を取得
updatedAt = Now
' 最終更新日時として記録
managementSheet.Range("B2").Value = updatedAt
End Sub
時刻だけを保存した場合、翌日以降にファイルを開くと、その記録がいつのものなのか判断できなくなります。
「15:30に更新された」と分かっても、それが今日なのか昨日なのかまではTimeだけでは判断できません。
更新履歴や実行ログのように後から確認する情報であれば、
時刻だけ必要 → Time
日付をまたいで履歴を確認する → Now
という考え方が分かりやすいでしょう。
また、変数名を単なるdtやtimeではなく、updatedAtやprocessStartTimeなど用途が分かる名前にしておけば、コードを読み返したときにも役割を判断しやすくなります。
✅ VBAでTime・Nowを使うときに注意したいポイント
TimeやNowは簡単に使えるため、取得方法そのものでは大きな問題が起きにくい機能です。しかし実務では、「取得した値」と「Excel上で見えている表示」を混同してしまうことがあります。
たとえば秒まで取得しているのに、セルには「19:30」としか表示されない場合があります。このとき、Timeが秒を取得できなかったと判断してコードを変更すると、問題の原因から離れてしまいます。
さらに、日時を文字列へ変換して保存すると、後から比較や計算をするときに扱いにくくなることがあります。見た目を整える処理と、データそのものを保持する処理は分けて考えることが大切です。
現在時刻を取得できた後に困らないためにも、代表的な注意点を押さえておきましょう。
・セルの表示形式と取得した時刻を混同しない
Timeで取得した時刻をセルへ書き込んだとき、表示結果はセルの書式設定によって変化します。
たとえば内部的には19時30分25秒の情報があっても、セルの表示形式が「h:mm」であれば、
19:30
と表示されます。
秒まで確認したい場合は、セルの表示形式を設定できます。
Sub WriteTimeWithSeconds()
Dim targetCell As Range
Set targetCell = ThisWorkbook.Worksheets("Sheet1").Range("A2")
' 現在時刻を値として入力
targetCell.Value = Time
' 秒まで確認できる表示形式にする
targetCell.NumberFormat = "hh:mm:ss"
End Sub
このコードでは、現在時刻の取得とセルの表示形式を別々に指定しています。
この分離は意外と重要です。
Timeは現在時刻を取得する役割、NumberFormatはセル上でどのように見せるかを決める役割だからです。
「値」と「表示」を分けて考えられるようになると、日付や時刻を扱うVBAでのトラブルを減らしやすくなります。
VBAでは、時刻そのものを変更しなくても、NumberFormatを使ってセル上の見え方を変更できます。時刻だけでなく、数値形式やフォント、背景色などセルの書式設定をVBAでまとめて操作したい場合は「【VBA】セルの書式設定を変更する方法|数値形式・フォント・背景色を一括設定する実務テクニック」も参考になります。
・日時をすぐ文字列に変換しない
現在時刻を取得した直後に文字列へ変換したくなる場合もありますが、その後に計算や比較を行うのであれば注意が必要です。
たとえば、
Dim currentTimeText As String
currentTimeText = Format(Time, "hh:mm:ss")
とすれば、「19:30:25」のような文字列を作成できます。
ただし、この時点で扱っているものは表示用の文字列です。
後から時刻として比較・計算する可能性があるなら、まずDate型で保持しておき、必要になった段階で表示用に整える方が設計しやすくなります。
Dim currentTime As Date
currentTime = Time
なお、Format関数は時刻だけでなく、日付や数値など幅広い値を文字列へ変換できます。Formatそのものの使い方をここで広げすぎると「現在時刻を取得する」という目的から外れるため、表示形式や文字列変換を詳しく扱いたい場合はFormat関数の使い方を別途確認すると理解しやすくなります。
一方、取得した時刻を帳票やメッセージなどへ表示する目的であれば、Format関数を使って「hh:mm:ss」などの形式に整える方法があります。時刻・日付を文字列へ変換する方法や、Date型のまま保持する場合との違いについては「【VBA】Format関数で文字列に変換する方法|日付・数値・表示形式を完全整理」で詳しく解説しています。
✅ VBAで現在時刻を取得する処理を保守しやすくする考え方
TimeやNowは1行で利用できるため、わざわざ設計を意識する必要がないようにも見えます。しかし、実務マクロでは小さな処理ほどさまざまな場所へ追加され、後から用途が分からなくなることがあります。
特にRange("A1") = Nowのようなコードが複数のプロシージャに散らばっていると、「何のための日時なのか」「どの処理の実行記録なのか」を調査するだけでも時間がかかります。
一方で、単純な処理を必要以上に関数化・共通化すると、かえってコードを追いにくくなることもあります。重要なのは、短さや高度な書き方ではなく、処理の目的が読み取れることです。
最後に、現在時刻を取得する処理を長く使うための考え方を整理します。
・用途が分かる変数名とコメントを使う
次のようなコードでも現在時刻は取得できます。
Dim t As Date
t = Time
しかし、コードが長くなるとtが何を表しているのか分かりにくくなります。
開始時刻なら、
Dim processStartTime As Date
' 集計処理を開始した時刻を保持
processStartTime = Time
更新日時なら、
Dim lastUpdatedAt As Date
' データを更新した日時を保持
lastUpdatedAt = Now
のように、用途が分かる名前にしておくと保守しやすくなります。
TimeやNowの使い方自体をコメントで説明する必要はありません。
' Timeで現在時刻を取得する
というコメントより、
' 集計処理の開始時刻を保持する
のように、なぜ時刻を取得しているのかを残した方が、改修する担当者にとって有益です。
processStartTimeのように役割が分かる変数名を付けておくと、後からコードを読み返したときにも処理の目的を判断しやすくなります。変数名の決め方や、複数人で改修するときにも読みやすい命名を整理したい場合は「【VBA】変数名の付け方|キャメルケース・スネークケースなど命名規則を徹底解説」も参考にしてください。
・Excel関数のNOWとVBAのNowを混同しない
ExcelにはNOW()関数があり、VBAにもNowがあります。
どちらも現在の日付と時刻を扱えますが、使われる場所が異なります。
ExcelのNOW関数はワークシート上で利用する関数です。
=NOW()
一方、VBAのNowはマクロの処理内で現在日時を取得するときに利用します。
Dim currentDateTime As Date
currentDateTime = Now
セル上で現在日時を自動表示したいのか、マクロを実行した瞬間の日時を取得して処理に利用したいのかによって使い分けます。
特に「マクロ実行時の日時を履歴として値に残したい」という場合は、VBA側でNowを取得してセルへ書き込む方法が分かりやすいでしょう。
マクロを使わず、ワークシート上で現在日時を自動更新したい場合はExcelのNOW関数を利用できます。VBAのNowとの違いを踏まえたうえで、セル上で現在日時を管理したい場合は「【Excel】NOW関数の使い方|現在日時を自動表示する方法と実務活用」もあわせて確認してみてください。
✅ まとめ:VBAで現在時刻を取得するならTimeとNowを目的別に使い分けよう
VBAでは、TimeやNowを利用することで現在の時刻・日時を簡単に取得できます。
重要なのは、どちらが優れているかではなく、取得した情報を何に使うのかによって選択することです。
- 現在の時刻だけを取得するなら
Timeを使用する - 現在の日付と時刻をまとめて取得するなら
Nowを使用する - 処理開始時刻など、時刻だけ必要な場面ではTimeが分かりやすい
- 更新履歴や実行ログでは、日付も残せるNowが適している
- 取得した日時はDate型で保持しておくと後から利用しやすい
- セルに表示される形式と、実際に保持している値は分けて考える
- 表示用の文字列が必要な場合だけFormatなどによる変換を検討する
- 実務コードでは、何のために取得した日時なのか分かる変数名やコメントを使う
TimeやNowは非常にシンプルですが、実行履歴の記録、更新日時の管理、処理時間の計測など、業務自動化のさまざまな場面につながる基本機能です。
まずは「時刻だけならTime」「日付も必要ならNow」という違いを押さえ、取得した値を目的に合わせて扱えるようにしておくと、日付・時刻を利用したVBA処理をさらに発展させやすくなります。