TODAYは、今日の日付を返す関数です。
引数がなく、=TODAY() と書くだけです。単純な関数ですが、値が毎日変わるという性質があり、これを理解していないと事故につながります。
書式
=TODAY()
括弧の中は空です。括弧自体は省略できません。
NOWとの違い
| 関数 | 返すもの |
|---|---|
| TODAY() | 今日の日付(時刻は0:00) |
NOW() |
今日の日付+現在時刻 |
日付だけ扱うならTODAYを使ってください。NOW() は時刻を含むため、日付の比較で意図しない結果になります。
=IF(A1 = TODAY(), "今日", "") 正しく動く
=IF(A1 = NOW(), "今日", "") ほぼ一致しない(時刻まで比較される)
期限管理に使う
TODAYの主な用途がこれです。
期限までの日数
=A1 - TODAY()
結果が数値で出ないときは、セルの表示形式が「日付」になっています。「数値」に変えてください。
期限切れの判定
=IF(A1 < TODAY(), "期限切れ", "")
残り日数で3段階に分ける
=IFS(A1 < TODAY(), "期限切れ",
A1 - TODAY() <= 3, "まもなく",
TRUE, "余裕あり")
IFS は上から順に判定されるので、厳しい条件から書く必要があります。
遅延件数を数える
=COUNTIFS(D:D, "未処理", E:E, "<"&TODAY())
COUNTIFS と組み合わせるのが定番です。比較演算子とTODAYは & で連結してください。"
条件付き書式と組み合わせる
期限が近い行に色を付けるには、カスタム数式に次を入れます。
=AND($E2 <> "", $E2 < TODAY(), $D2 = "未処理")
列だけを $ で固定するのがポイントです。行を固定しないことで、各行が個別に判定されます。
$E2 <> "" を入れているのは、空欄を期限切れと判定させないためです。空欄は0として扱われ、TODAYより小さくなるので、これがないと未入力の行が全部赤くなります。実務でよく起きるミスです。
毎日変わることの注意点
TODAYは揮発性関数です。 ファイルを開くたび、シートを編集するたびに再計算されます。
そのため、次のような使い方は危険です。
記録として残らない
「入力した日」を記録するつもりで =TODAY() を入れると、翌日には翌日の日付に変わります。 記録にはなりません。
対策: 入力日を固定したいなら、Ctrl + ; で日付を値として入力してください(Excel・スプレッドシート共通のショートカット)。
自動で記録したいなら、Google Apps Script か、スプレッドシートの「変更履歴」を使うことになります。数式では実現できません。
大量に置くと重い
揮発性関数なので、何千個も置くとファイル全体が重くなります。
対策: どこか1セルに =TODAY() を置き、他はそのセルを参照してください。
$A$1に =TODAY()
他のセル =B2 - $A$1
これだけで再計算のコストが大きく下がります。
過去のデータが変わって見える
「今日から見た残り日数」を保存すると、日が経つにつれて値が変わります。スクリーンショットを撮ったときと違う数字になるので、報告資料には向きません。
報告用には、基準日をセルに入力して固定するほうが確実です。
タイムゾーンに注意
TODAYが返す日付は、ファイルのタイムゾーン設定に依存します。
スプレッドシートの「ファイル → 設定 → タイムゾーン」を確認してください。海外のメンバーと共有していると、日付が1日ずれることがあります。
日付の計算例
月初・月末
=EOMONTH(TODAY(), -1) + 1 今月の1日
=EOMONTH(TODAY(), 0) 今月の末日
EOMONTH と組み合わせます。
今月のデータだけ集計
=SUMIFS(C:C, A:A, ">="&EOMONTH(TODAY(),-1)+1, A:A, "<="&EOMONTH(TODAY(),0))
曜日
=TEXT(TODAY(), "aaa")
年齢や勤続年数
=DATEDIF(A1, TODAY(), "Y")
DATEDIF と組み合わせます。
Excelとの違い
TODAY・NOW ともに共通です。書式も挙動も同じです。
タイムゾーンの扱いだけ異なります。ExcelはPCのシステム時刻を使い、スプレッドシートはファイルの設定を使います。共有ファイルではスプレッドシートのほうが一貫します。
開くたびに変わるという性質を設計に織り込む
今日の日付を返す関数は、シートを開くたび、何かを入力するたびに再計算されます。常に最新の日付になるので、期限管理や年齢の表示には最適です。
しかし、この性質が問題になる場面もあります。ある時点の状態を記録として残したい場合です。
たとえば、受注日を入力する欄にこの関数を使うと、翌日開いたときには翌日の日付になります。記録として残りません。入力した日を残したいなら、関数ではなく実際の日付を入力する必要があります。日付を入力する操作にはショートカットがあり、押した時点の日付が値として入ります。
同じことは、集計表の基準日でも起こります。四月末時点の在籍者数を出した表が、五月に開くと五月時点の数字に変わってしまいます。基準日はセルに入力し、そこを参照する形にしてください。
判断の基準は単純です。常に最新であってほしいなら関数、その時点を残したいなら値。 この使い分けを最初に決めておけば、後から数字が変わって困ることはなくなります。
期限管理の作り方
この関数がもっとも活きるのが、期限の管理です。基本の考え方は、期限日から今日を引いて残り日数を出すことです。
残り日数がマイナスなら期限切れ、零なら当日、正なら残りがあるという判定になります。この数値をもとに、条件付き書式で色を分けると、一目で状況が分かる表になります。
実務では、段階を設けるとより使いやすくなります。期限切れは赤、三日以内は橙、一週間以内は黄、それ以外は色なし。この程度の段階があれば、優先順位が視覚的に伝わります。
注意点として、条件付き書式で今日の日付を使う場合、表示のたびに評価されます。行数が多いと動作が重くなることがあります。範囲は必要な部分に絞ってください。
もうひとつ、土日祝を除いた営業日で数えたい場合は、専用の関数が必要です。単純な引き算では暦日になります。締切管理では、暦日と営業日のどちらで数えるかを明確にしておいてください。
具体的な色分けの手順は、条件付き書式の記事にまとめています。→ 条件付き書式で行全体に色を付ける方法
時刻を含むかどうかで結果が変わる
今日の日付を返す関数は、時刻を含みません。零時ちょうどの値になります。一方、現在の日時を返す関数は、時刻まで含みます。
この違いが、比較のときに影響します。データに時刻付きの日時が入っている場合、今日の日付と比較すると、今日の午前零時と比べることになります。今日発生したデータは、時刻の分だけ大きくなるため、今日以下という条件から外れます。
「今日までのデータ」を集計したつもりが、今日の分が抜けている。この種の誤りは、件数を確認しないと気づきません。
対処としては、条件を明日の零時未満にするか、時刻を切り落とした作業列を用意します。後者のほうが、後の工程でも扱いやすくなります。
逆に、経過時間を計算したい場合は、時刻を含む関数を使う必要があります。用途に応じて使い分けてください。
再計算による負荷
今日の日付を返す関数は、揮発性の性質を持っています。シート内のどこかが変更されるたびに再計算されます。
数個であれば影響はありませんが、行数の多い表で各行に書いていると、入力のたびにすべてが再計算されます。さらに、それを参照する数式も連鎖します。
対処は単純で、今日の日付は一箇所だけに置き、各行はそのセルを参照することです。参照するだけなら揮発性ではないので、負荷が大きく下がります。
基準日をセルに置く設計は、この負荷対策としても有効です。過去時点での集計もできるようになるため、二重の利点があります。
条件付き書式の中で今日の日付を使う場合も同様です。可能なら、基準日のセルを参照する形にしてください。
基準日を持つ設計の利点
今日の日付を直接使うのではなく、基準日をセルに置いて参照する。この一手間には、三つの利点があります。
第一に、過去の時点で集計し直せます。四月末時点の状況を確認したい、というときに基準日を書き換えるだけで済みます。今日の日付を各所に埋め込んでいると、この確認ができません。
第二に、動作が軽くなります。今日の日付を返す関数は揮発性で、シートのどこかが変更されるたびに再計算されます。各行に書いていると、行数分の揮発性関数が入力のたびに走ります。一箇所にまとめれば、影響が最小限になります。
第三に、基準日が明示されます。集計表を見た人が、いつ時点の数字なのかをすぐ確認できます。印刷したときにも残ります。
基準日のセルには、今日の日付を返す関数を入れておいても構いません。普段は自動で更新され、必要なときだけ手で書き換える、という運用ができます。
この設計は、日付を扱うすべての表に当てはまります。期限管理、年齢計算、在籍期間、経過日数。いずれも基準日を一箇所に持つ形にしてください。
期限管理の表を設計する
期限を管理する表には、必要な列が決まっています。過不足なく揃えると、運用が安定します。
項目名、担当者、期限日、完了フラグ、残り日数、状態。この六列が基本です。
残り日数は、期限日から基準日を引いて求めます。完了しているものは対象外にしたいので、完了フラグで分岐します。
状態は、残り日数から判定します。完了、期限切れ、要注意、余裕あり。四段階あれば十分です。この列を条件付き書式の条件に使えば、色分けが単純になります。
並べ替えは、状態と残り日数の二段階で行います。期限切れが上、その中で日数の大きい順、という並びにすると、対処すべき順に並びます。
絞り込みで完了を除外すれば、残りの作業だけが表示されます。
この構成は、個人の作業管理でも、チームの案件管理でも使えます。列を増やしたくなりますが、増やすほど更新が面倒になります。まずこの六列で運用し、本当に必要になったものだけを足してください。
よくある質問
Q. 数値が表示されます
セルの表示形式が標準になっています。日付形式に変えてください。
Q. 更新されません
再計算の設定が手動になっている可能性があります。設定を確認するか、再計算を実行してください。
Q. 入力した日を残したいのですが
関数ではなく値として入力してください。ショートカットで今日の日付を入力できます。
Q. 時刻も欲しいのですが
現在の日時を返す関数を使ってください。ただし、こちらも揮発性です。
Q. 昨日や明日の日付は出せますか
今日の日付に数値を足し引きするだけです。日付は連続した数値なので、一を足せば翌日になります。
Q. 営業日で数えたいのですが
営業日を扱う専用の関数があります。祝日の一覧を用意すれば、それも除外できます。
Q. 月末の日付が欲しいのですが
月末を求める専用の関数があります。→ EOMONTH関数の使い方
Q. ファイルが重いのですが
各行に書いていると負荷になります。一箇所に置いて、各行はそこを参照してください。
まとめ
- 書式は
=TODAY()。括弧の中は空 - 時刻が要らないなら
NOW()ではなくTODAY - 比較演算子と組み合わせるときは
"<"&TODAY() - 毎日変わるので、記録には使えない。固定するなら
Ctrl+; - 揮発性関数。1セルに置いて他から参照すると軽くなる
- 条件付き書式では 空欄の除外 を忘れずに
