ExcelのTODAY関数・NOW関数 完全ガイド|使い分け・タイムスタンプ固定・時刻抽出まで

Excel

どうも、くまおやぢです。

「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:ss2025/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」のような数値が表示されます。時刻として表示するには、セルの表示形式を変更します。

  1. セルを右クリック →「セルの書式設定
  2. 表示形式」タブ →「ユーザー定義」を選択
  3. 「種類」に h:mm または h:mm:ss と入力
  4. 「OK」をクリック

表示結果の例

書式表示例
h:mm10:42
h:mm:ss10:42:15
hh:mm10:42(ゼロ埋め)
AM/PM h:mmAM 10:42

活用例

  • タイムカード的な使い方:出勤列と退勤列にそれぞれ =NOW()-TODAY() を入れ、値を固定(06章参照)すれば、その日の出退勤時刻を記録できる
  • 経過時間の計算:退勤時刻 − 出勤時刻 = 勤務時間

注意NOW()-TODAY() もNOW関数を含んでいるため、再計算のたびに時刻が更新されます。記録として残したい場合は、必ず06章の方法で値を固定してください。


07. タイムスタンプを固定する3つの方法

TODAY関数もNOW関数も、再計算のたびに値が変わります。「入力した瞬間の日時を、そのまま記録として残したい」場合は、以下の3つの方法があります。

方法①:ショートカットキーで固定値を入力する(最も簡単)

操作入力される値
Ctrl + ;(セミコロン)今日の日付(固定値)
Ctrl + :(コロン)現在の時刻(固定値)
Ctrl + ; → スペース → Ctrl + :日付+時刻(固定値)

これらのショートカットで入力された値は関数ではなく固定値なので、ファイルを再度開いても変わりません。

最もおすすめの方法です。関数もVBAも不要で、確実に固定されます。

方法②:値の貼り付けで関数を固定値に変換する

すでにNOW関数が入っているセルを固定値に変換する方法です。

  1. 固定したいセルを選択
  2. Ctrl + C(コピー)
  3. 同じセルの上で 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章の方法①(ショートカットキー)で対応してください。

コードの貼り付け場所

通常のマクロとは違い、このコードは標準モジュールではなくシートモジュールに貼り付けてください。

  1. Alt + F11 でVBE(Visual Basic Editor)を開く
  2. 左側のプロジェクトエクスプローラーで、タイムスタンプを設定したいシート名をダブルクリック
  3. 以下のコードを貼り付ける

コード

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_COL4 に変更
タイムスタンプ列をE列にしたいSTAMP_COL5 に変更
日付だけ記録したいNowDate に変更
上書き時にタイムスタンプを更新したくない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の計算モードが「手動」になっている可能性がある。

対処

  1. 数式」タブ →「計算方法の設定」を開く
  2. 自動」を選択する

これで、セルの編集やファイルの再読み込み時にTODAY/NOWが正しく更新されるようになります。


10. まとめ|振り返りチェックリスト+今日の一歩

おつかれさまでした!この記事で解説した内容を振り返ります。

振り返りチェックリスト

  • [ ] TODAY関数は「日付のみ」、NOW関数は「日付+時刻」を取得すると理解した
  • [ ] 両方とも再計算のたびに値が変わることを把握している
  • [ ] =NOW()-TODAY() で時刻だけを抽出できる
  • [ ] タイムスタンプを固定する3つの方法(ショートカット/値の貼り付け/VBA)を知った
  • [ ] IF+NOWだけではタイムスタンプとして機能しないことを理解した

今日やるべき最小アクション

今日使っているファイルに =TODAY() を1つ入れてみてください。

日報の日付欄や、「最終更新日」の表示に最適です。毎日手入力していた日付が自動で変わるだけで、小さな快適さを実感できるはずです。

関連記事

あせらず、くさらず、あきらめず。TODAY関数ひとつから始めて、慣れてきたらNOW、タイムスタンプ固定、VBA……と段階を踏んでいけば大丈夫です。

あなたのフィードバックが次の記事のヒントになります。「こんな場面で使いたいけど、どうすればいい?」があれば、ぜひコメントで教えてください。

コメント

タイトルとURLをコピーしました