どうも、くまおやぢです。
「TODAY関数とNOW関数、どっちを使えばいいんだろう?」
――Excelで日付や時刻を扱うとき、誰もが一度はぶつかる疑問です。
わたしも初めてNOW関数を使ったとき、セルに「2025/4/1 10:42」と表示されて「え、日付だけでいいのに時刻がついてるんですけど……」と焦った経験があります。逆にTODAY関数で入力日時を記録しようとして、翌日ファイルを開いたら日付が変わっていて「昨日の記録が消えた!」と青ざめたこともあります。
この2つの関数は、見た目は似ていますが役割がまったく違います。正しく使い分けるだけで、日報の日付が自動で入る、提出時刻を記録できる、入力ログが残せる――日々の事務作業がグッと楽になります。
この記事では、TODAY・NOWの基本から、「時刻だけを抽出する方法」「タイムスタンプを固定する方法」「VBAで自動記録する方法」まで、この1記事で完全網羅します!
この記事でできること
対象者:Excel初心者〜中級者(日付・時刻関数をきちんと理解したい方)
読み方ガイド:
| あなたの状態 | 読むべき章 |
|---|---|
| TODAY / NOW の違いが分からない | → 03章・04章から |
| 時刻だけを表示したい | → 05章へ直行 |
| 入力した日時を固定して記録に残したい | → 06章へ直行 |
| VBAで自動タイムスタンプを作りたい | → 07章へ直行 |
| 「翌日開いたら日付が変わっていた」で困った | → 08章へ直行 |
急いでいる人へ|使い分けの結論
やりたいこと 使う関数 今日の日付を表示したい =TODAY()今の日付+時刻を表示したい =NOW()時刻だけを表示したい =NOW()-TODAY()入力した日時を固定したい Ctrl+; (日付)/ Ctrl+: (時刻)
03. TODAY関数とは|「今日の日付」を自動取得する
基本構文
=TODAY()
引数は不要です。カッコの中には何も入れません。入力するだけで、今日の日付が表示されます。
表示例:
| セルの表示形式 | 表示される値 |
|---|---|
| 短い日付形式 | 2025/7/22 |
| 長い日付形式 | 2025年7月22日 |
こんな場面で使う
- 日報や申請書に「本日の日付」を自動表示したい
- 締切日まであと何日かを計算したい(
=B2-TODAY()) - 年齢を自動計算したい(
=DATEDIF(A2,TODAY(),"Y"))
最大の注意点:値が毎日変わる
TODAY関数の日付は、ファイルを開くたびに「今日」に更新されます。「2025年7月22日に入力した」という記録を残す目的には使えません。
「入力した日を固定して残したい」場合は、06章のタイムスタンプ固定テクニックを使ってください。
04. NOW関数とは|「今の日付+時刻」を取得する
基本構文
=NOW()
こちらも引数は不要。TODAY関数との違いは時刻情報も含まれるという点です。
表示例:
| セルの表示形式 | 表示される値 |
|---|---|
| 日付+時刻 | 2025/7/22 10:42 |
カスタム yyyy/mm/dd hh:mm:ss | 2025/07/22 10:42:15 |
こんな場面で使う
- 作業開始時刻・提出時刻を記録したい
- 更新日時のログを残したい
- 経過時間を計算したい(
=NOW()-B2→ 開始時刻からの経過時間)
最大の注意点:こちらも値が変わる
NOW関数もTODAY関数と同様に、再計算のたびに値が更新されます。
再計算が起きるタイミング:
| タイミング | 説明 |
|---|---|
| ファイルを開いたとき | 自動的に全セルが再計算される |
| どこかのセルを編集したとき | 関連するセルが再計算される |
| F9キーを押したとき | シート全体を手動再計算 |
つまり、NOW関数をそのまま使うと「さっき記録した時刻が、セルを編集するたびに変わる」という問題が起きます。これを回避する方法は06章で解説します。
05. 違いを一覧で比較する|TODAY vs NOW
| 比較項目 | TODAY() | NOW() |
|---|---|---|
| 取得できる情報 | 日付のみ | 日付+時刻 |
| 時刻の取得 | できない | できる |
| 主な用途 | 日報・申請書・日付管理 | タイムスタンプ・時刻記録・ログ |
| 再計算での変化 | 日付が「今日」に変わる | 日時が「その瞬間」に変わる |
| Excelの内部値 | 整数(例:45860) | 小数付き(例:45860.448) |
Excelの内部値の話:Excelは日付を「1900年1月1日からの通算日数」として数値で管理しています。TODAY()は整数(日付だけ)、NOW()は小数付き(小数部分が時刻)。この仕組みを知っていると、次の章の「時刻だけ抽出」が理解しやすくなります。
06. 時刻だけを表示したい|NOW()-TODAY()テクニック
「現在時刻だけを表示したい。日付は要らない」――そんなときに使えるのが NOW()-TODAY() です。
数式
=NOW()-TODAY()
NOW()は「日付+時刻」、TODAY()は「日付」。引き算すると日付部分が相殺されて、時刻部分だけが残ります。
表示形式の設定
計算結果はExcelの内部では小数(例:0.448…)として保持されるため、そのままだと「0.448」のような数値が表示されます。時刻として表示するには、セルの表示形式を変更します。
- セルを右クリック →「セルの書式設定」
- 「表示形式」タブ →「ユーザー定義」を選択
- 「種類」に
h:mmまたはh:mm:ssと入力 - 「OK」をクリック
表示結果の例:
| 書式 | 表示例 |
|---|---|
h:mm | 10:42 |
h:mm:ss | 10:42:15 |
hh:mm | 10:42(ゼロ埋め) |
AM/PM h:mm | AM 10:42 |
活用例
- タイムカード的な使い方:出勤列と退勤列にそれぞれ
=NOW()-TODAY()を入れ、値を固定(06章参照)すれば、その日の出退勤時刻を記録できる - 経過時間の計算:退勤時刻 − 出勤時刻 = 勤務時間
注意:
NOW()-TODAY()もNOW関数を含んでいるため、再計算のたびに時刻が更新されます。記録として残したい場合は、必ず06章の方法で値を固定してください。
07. タイムスタンプを固定する3つの方法
TODAY関数もNOW関数も、再計算のたびに値が変わります。「入力した瞬間の日時を、そのまま記録として残したい」場合は、以下の3つの方法があります。
方法①:ショートカットキーで固定値を入力する(最も簡単)
| 操作 | 入力される値 |
|---|---|
| Ctrl + ;(セミコロン) | 今日の日付(固定値) |
| Ctrl + :(コロン) | 現在の時刻(固定値) |
| Ctrl + ; → スペース → Ctrl + : | 日付+時刻(固定値) |
これらのショートカットで入力された値は関数ではなく固定値なので、ファイルを再度開いても変わりません。
最もおすすめの方法です。関数もVBAも不要で、確実に固定されます。
方法②:値の貼り付けで関数を固定値に変換する
すでにNOW関数が入っているセルを固定値に変換する方法です。
- 固定したいセルを選択
- Ctrl + C(コピー)
- 同じセルの上で Ctrl + Shift + V →「値」を選択して貼り付け
これでセルの中身が関数から固定値に変わります。
注意:この操作は元に戻せません(Ctrl+Zで戻せる回数を超えると復元不可)。念のためコピーしてから実行してください。
方法③:IF関数で「入力したら日時を記録」する仕組み
隣のセルにデータが入力されたタイミングで、自動的に日時を記録する数式です。
例:B列にデータを入力したら、C列に入力日時を自動記録したい
C2セルに以下の数式を入力:
=IF(B2<>"", NOW(), "")
「B2が空白でなければ現在日時を表示、空白なら何も表示しない」という意味です。
ただし、重大な欠点があります:
この方法では、他のセルを編集するたびにNOW()が再計算され、記録した日時が毎回変わってしまいます。つまり、IF+NOW()の組み合わせだけではタイムスタンプとして機能しません。
IF+NOWで入力日時を記録し、その後すぐに方法②(値の貼り付け)で固定する、という二段階の運用が必要です。手間がかかるので、方法①のショートカットキーのほうが実用的です。
「完全自動でタイムスタンプを固定したい」場合は、次の章のVBAを使いましょう。
08. VBAで完全自動タイムスタンプを実現する(上級編)
「B列にデータを入力した瞬間、C列に日時が自動記録され、その後は変わらない」――この理想的なタイムスタンプを実現するにはVBAが必要です。
動作確認環境:Microsoft 365(Windows)
保存形式:マクロを使うため、ファイルは必ず.xlsm(マクロ有効ブック)で保存してください。
マクロが無効の環境:社内ポリシーでマクロが無効化されている場合は、07章の方法①(ショートカットキー)で対応してください。
コードの貼り付け場所
通常のマクロとは違い、このコードは標準モジュールではなくシートモジュールに貼り付けてください。
Alt + F11でVBE(Visual Basic Editor)を開く- 左側のプロジェクトエクスプローラーで、タイムスタンプを設定したいシート名をダブルクリック
- 以下のコードを貼り付ける
コード
Private Sub Worksheet_Change(ByVal Target As Range)
'B列(2列目)にデータが入力されたら、C列に日時を記録する
Dim rng As Range
'対象列の設定(B列 = 2)
Const INPUT_COL As Long = 2 'データ入力列
Const STAMP_COL As Long = 3 'タイムスタンプ列
Const START_ROW As Long = 2 '開始行(1行目はヘッダー)
'対象外のセルは無視
If Target.Column <> INPUT_COL Then Exit Sub
If Target.Row < START_ROW Then Exit Sub
'複数セル同時変更に対応
For Each rng In Target
If rng.Column = INPUT_COL And rng.Row >= START_ROW Then
Application.EnableEvents = False 'イベントの無限ループ防止
If rng.Value <> "" Then
'入力あり → タイムスタンプを記録(値として書き込むので変わらない)
Cells(rng.Row, STAMP_COL).Value = Now
Cells(rng.Row, STAMP_COL).NumberFormat = "yyyy/mm/dd hh:mm:ss"
Else
'入力が消された → タイムスタンプも消す
Cells(rng.Row, STAMP_COL).Value = ""
End If
Application.EnableEvents = True
End If
Next rng
End Sub
コードのポイント
Worksheet_Changeイベントを使っているため、セルの値が変わった瞬間に自動実行されますApplication.EnableEvents = False:VBAからセルに値を書き込むと再びChangeイベントが発火する(無限ループ)ため、一時的にイベントを無効化しています- タイムスタンプは
Nowの戻り値を直接セルに書き込むため、関数ではなく固定値として記録されます。再計算で変わることはありません - B列のデータを削除すると、C列のタイムスタンプも自動で消えます
カスタマイズ
| 変更したい内容 | 変更する箇所 |
|---|---|
| 入力列をD列にしたい | INPUT_COL を 4 に変更 |
| タイムスタンプ列をE列にしたい | STAMP_COL を 5 に変更 |
| 日付だけ記録したい | Now を Date に変更 |
| 上書き時にタイムスタンプを更新したくない | If Cells(rng.Row, STAMP_COL).Value = "" の条件を追加 |
共有ファイルでの注意:このVBAはシート単位で動作します。他のユーザーがマクロを無効にしている場合はタイムスタンプが記録されません。チーム全体で使う場合は、全員のマクロ設定を確認してください。
09. よくあるトラブルと対処法
トラブル①:翌日開いたら日付が変わっていた
原因:TODAY関数・NOW関数は再計算のたびに更新されるため、ファイルを開いた時点の日時に変わります。
対処:記録として残したい場合は、07章の方法(ショートカットキー or 値の貼り付け or VBA)で固定値にする。
トラブル②:日付だけ表示したかったのに時刻まで出る
原因:NOW関数を使っている。または、セルの表示形式が「日付+時刻」になっている。
対処:
- 日付だけでよいなら
=TODAY()に変更する - NOW関数のまま日付だけ表示したいなら、セルの書式を
yyyy/mm/ddに変更する(ただし内部的には時刻データが残る)
トラブル③:IF×NOW関数の組み合わせで日時が毎回変わる
原因:=IF(B2<>"",NOW(),"") は、再計算のたびにNOW()が実行されて値が更新される。
対処:IF+NOWの組み合わせだけではタイムスタンプとして機能しない。08章のVBAを使うか、07章の方法①(ショートカットキー)で手動固定する。
トラブル④:関数があるのに日付が更新されない
原因:Excelの計算モードが「手動」になっている可能性がある。
対処:
- 「数式」タブ →「計算方法の設定」を開く
- 「自動」を選択する
これで、セルの編集やファイルの再読み込み時にTODAY/NOWが正しく更新されるようになります。
10. まとめ|振り返りチェックリスト+今日の一歩
おつかれさまでした!この記事で解説した内容を振り返ります。
振り返りチェックリスト
- [ ] TODAY関数は「日付のみ」、NOW関数は「日付+時刻」を取得すると理解した
- [ ] 両方とも再計算のたびに値が変わることを把握している
- [ ]
=NOW()-TODAY()で時刻だけを抽出できる - [ ] タイムスタンプを固定する3つの方法(ショートカット/値の貼り付け/VBA)を知った
- [ ] IF+NOWだけではタイムスタンプとして機能しないことを理解した
今日やるべき最小アクション
今日使っているファイルに =TODAY() を1つ入れてみてください。
日報の日付欄や、「最終更新日」の表示に最適です。毎日手入力していた日付が自動で変わるだけで、小さな快適さを実感できるはずです。
関連記事
- 「DATEDIF・NOW・TIME関数をまとめて理解する」— 日付・時刻関数をもっと深く学びたい方に
- 「エクセル条件付き書式の完全ガイド」— 締切日を過ぎたら赤くする、など日付×条件付き書式の組み合わせ
- 「エクセルのSUMIF・COUNTIF完全ガイド」— 日付条件での集計テクニック
あせらず、くさらず、あきらめず。TODAY関数ひとつから始めて、慣れてきたらNOW、タイムスタンプ固定、VBA……と段階を踏んでいけば大丈夫です。
あなたのフィードバックが次の記事のヒントになります。「こんな場面で使いたいけど、どうすればいい?」があれば、ぜひコメントで教えてください。


コメント