【Excel】対象日が今週日付なら0、先週なら-1、来週なら+1を返す式
対象日が今週の日付なら0、先週の日付なら-1、来週の日付なら+1、となるような式を考えてみた。
Excel2007以降でオートフィルタ使えば、日付でうまい具合にソートできるが、2003ではそうもいかないので考えてみた。
使用する関数:
- TODAY()
- WEEKDAY()
- ROUNDDOWN()
- ROUNDUP()
- IF()
Excelでは、日付を連続したシリアル値として処理している。
1990年1月1日がシリアル値1として保存されていて、2008年1月1日は39,448日後だからシリアル値は39,448。
なので、基準となる日曜日の日付と対象の日付の差を出し、それを7で割った際の商の部分が週の数になる。
式で表すと、
(対象日付 - 基準日) ÷ 7
この式のままだと、小数点も表示されてしまうので、ROUDDOWN関数とROUNDUP関数を使う。正の値の場合はROUNDDOWN関数で切り下げ、負の値の場合はROUNDUP関数で切り上げる。負の値で切り上げるのは、「-0」という値を無くす為。
基準日の算出だが、Excelには「今週の日曜日の日付」をそのまま表す関数は無い。そこで、WEEKDAY関数を使う。
WEEKDAY関数は、WEEKDAY(シリアル値、種類)で表現される。
日付を表すシリアル値から、その日付に対応する曜日を返す。規定(種類=1の場合)では、1(日曜)から7(土曜)までの範囲の整数となっている。よって、TODAY関数を使って本日日付をWEEKDAY関数のシリアル値に入れれば曜日を表す整数が帰ってくるので、その値を本日日付から引いた日付に1日足せば今週の日曜日の日付が導出出来る。
式で表すと、
基準日(今週の日曜日) = 本日日付 - WEEKDAY(本日日付,1) + 1
上記の式を組み合わせると、
IF(%対象セル%-(TODAY()-WEEKDAY(TODAY(),1)+1)<0,ROUNDUP((%対象セル%-(TODAY()-WEEKDAY(TODAY(),1)+1))/7,0),ROUNDDOWN((%対象セル%-(TODAY()-WEEKDAY(TODAY(),1)+1))/7,0))
で欲しい結果が帰ってくる。
関連記事
-
-
【Excel】VBAの雑多なTips
ExcelのVBAでマクロを作る際に、メモしておこうと思ったTipsを以下に列挙。 ・列番号を英文