3-2 日付/時刻関数
日付や時刻を求める関数は、使用しているコンピュータのシステムクロックに基づいて現在の日時が返される処理方法と、指定した日時を処理する方法があります。
![]()
___
■日付/時刻関数
DATE 指定した日付に対応するシリアル値を返す
DATEDIF 指定された期間内の日数、月数、または年数を返す
DATEVALUE 日付を表す文字列をシリアル値に変換する
DAY シリアル値を日に変更します
DAYS360 1 年を 360 日 (30 日×12) と仮定して、2 つの日付の間の日数を返す
EDATE 指定された月数だけ前または後の日付に対応するシリアル値を返す
EOMONTH 指定された月数だけ前または後の月の最終日に対応するシリアル値を返す
HOUR シリアル値を時に変換する
MINUTE シリアル値を分に変換する
MONTH シリアル値を月に変換する
NETWORKDAYS 2 つの日付の間にある稼動日数を返す
NOW 現在の日付と時刻に対応するシリアル値を返す
SECOND シリアル値を秒に変換する
TIME 指定された時刻に対応するシリアル値を返す
TIMEVALUE 時刻を表す文字列をシリアル値に変換する
TODAY 現在の日付に対応するシリアル値を返す
WEEKDAY シリアル値を曜日に変換する
WEEKNUM シリアル値に対応する日がその年の何週目にあたるかを、数値で返す
WORKDAY 指定された稼動日数だけ前または後の日付に対応するシリアル値を返す
YEAR シリアル値を年に変換する
YEARFRAC 指定された 2 つの日付の間の日数を、年を単位とする数値で表します

■日付
日付に関係する関数は、シリアル値から日、月、年、曜日を求める関数があります。
●DAY関数
シリアル値から日を求める(戻り値は1〜31の範囲の整数)。
書式 DAY(シリアル値)
シリアル値 日付の連番を指定する
使用例
[A]数式を入力する
[B]日付に対する日が数値で求められる

EX4A481Z EX4A482Z
●MONTH関数
シリアル値から月を求める(戻り値は1〜12の範囲の整数)。
書式 MONTH(シリアル値)
シリアル値 日付の連番を指定する
使用例
[A]数式を入力する
[B]日付に対する月が数値で求められる

EX4A483Z EX4A484Z
●YEAR関数
シリアル値から年を求める(戻り値は1900〜9999の範囲の整数)。
書式 YEAR(シリアル値)
シリアル値 日付の連番を指定する
使用例
[A]数式を入力する
[B]日付に対する年が数値で求められる

EX4A485Z EX4A486Z
●WEEKDAY関数
シリアル値を曜日に変換します。
書式 WEEKDAY(シリアル値, 種類)
シリアル値 日付の連番を指定する
種類 戻り値の種類を数値で指定します
種類 戻り値
1/省略 1(日曜)〜7(土曜)の範囲の整数(旧バージョンのExcelと同じ)
2 1(月曜)〜7(日曜)の範囲の整数。
3 0(月曜)〜6(日曜)の範囲の整数。
戻り値の一覧
種類 月 火 水 木 金 土 日
1 2 3 4 5 6 7 1
2 1 2 3 4 5 6 7
3 0 1 2 3 4 5 6
使用例
[A]数式を入力する
[B]日付に対する曜日が数値で求められる

EX4A487Z EX4A488Z
種類を省略しているので、戻り値一覧の1番のスタイルで求められます。1998/4/16は木曜日なので5が求められています。
[A]数式を入力する
[B]日付に対する曜日が数値で求められる

EX4A489Z EX4A490Z
この数式では、種類に2を指定したので、戻り値一覧の2番のスタイルで求められ、木曜日の番号が4になっています。
[ヒント]
TEXT関数を使うと指定する日付の曜日を英字表示で求めることができます。
TEXT("98/4/16","dddd")
↑
曜日を表示する記号(大文字でもよい、ただし半角であること)
[A]数式を入力する
[B]日付に対する曜日が英字で求められる

EX4A491Z EX4A492Z
【まとめ】
DAY シリアル値を日に変更します。
MONTH シリアル値を月に変換します。
YEAR シリアル値を年に変換します。
WEEKDAY シリアル値を曜日に変換します。
■時刻
時刻に関係する関数は、シリアル値から時、分、秒、を数値で求める関数があります。
●HOUR関数
シリアル値から時刻を求める(戻り値は0(午前0時)〜23(午後11時)の整数)。
書式 HOUR(シリアル値)
シリアル値 日時の連番を指定する
使用例
[A]時刻を求める数式を入力する
[B]時刻が数値として求められる

EX4A493Z EX4A494Z
データをセルB3に時刻形式で入力しています。表示内容は時刻形式(12:30:25)になりますが、実際の入力内容は時刻のシリアル値に変換された値(0.521122・・・)がセルB3に入力されます。確認する場合は、セルB3の表示形式を[標準]に設定し直してください。
●MINUTE関数
シリアル値から分を求める(戻り値は0(分)〜59(分)の整数)。
書式 MINUTE(シリアル値)
シリアル値 日時の連番を指定する
使用例
[A]分を求める数式を入力する
[B]分が数値として求められる

EX4A495Z EX4A496Z
●SECOND関数
シリアル値から秒を求める(戻り値は0(秒)〜59(秒)の整数)
書式 SECOND(シリアル値)
シリアル値 日時の連番を指定する
使用例
[A]分を求める数式を入力する
[B]分が数値として求められる

EX4A497Z EX4A498Z
【まとめ】
HOUR シリアル値を時に変換します。
MINUTE シリアル値を分に変換します。
SECOND シリアル値を秒に変換します。
■日数を計算する
指定する期間の日数や月数、年数などの日数計算する関数があります。また、1年を360日とした日数計算や土曜や日曜を除いた日数を計算する関数があります。
●DATEDIF関数
指定された期間内の日数、月数、または年数を返します。
書式 DATEDIF(開始日, 終了日, 単位)
開始日 期間の開始日を指定します。
終了日 期間の終了日を指定します。
単位 戻り値の単位と種類を、単位を表す文字列で指定します。
単位 戻り値の単位と種類
"Y" 期間内の満年数
"M" 期間内の満月数
"D" 期間内の満日数
"MD" 1 か月未満の日数
"YM" 1 年未満の月数
"YD" 1 年未満の日数
使用例
[A]期間の年数を求める数式を入力する
[B]年数が求められる
自1998/4/16〜至1999/8/20間での年数は1(端数は切り捨て)だということが求められます。

EX4A499Z EX4A500Z
[A]期間の月数を求める数式を入力する
[B]月数が求められる

EX4A501Z EX4A502Z
[A]期間の日数を求める数式を入力する
[B]日数が求められる

EX4A503Z EX4A504Z
[A]1年未満の月数を求める数式を入力する
[B]端数の月数が求められる
求めた値から、自1998/4/16〜至1999/8/20の期間は1年(セルE7)と4月(セルE11)だということが求められました。

EX4A505Z EX4A506Z
●DAYS360関数
1年を360日(30日×12)と仮定して2つの日付の間の日数を返します。支払いの計算など経理システムで1年を30日×12と仮定している場合に役立ちます。
書式 DAYS360(開始日 ,終了日, 方式)
開始日, 終了日 期間の日付を指定する
方式 米国NASD方式とヨーロッパ方式を論理値で指定する
方式 定義
FALSE/省略 NASD方式。開始日が、ある月の31日になる場合、同じ月の30日として計算が行われます。終了日が、ある月の31日になる場合は、開始日が30日でない限り、その翌月の1日として計算が行われます。2月の28日と29日は、いずれも2月30日と見なされます。
TRUE ヨーロッパ方式。開始日または終了日が、ある月の31日になる場合、同じ月の30日として計算が行われます。
●NASD方式
開始日が、ある月の31日になる場合、同じ月の30日として計算が行われます。終了日が、ある月の31日になる場合は、開始日が30日でない限り、その翌月の1日として計算が行われます。2月の28日と29日は、いずれも2月30日と見なされます。
●ヨーロッパ方式
開始日または終了日が、ある月の31日になる場合、同じ月の30日として計算が行われます。
使用例
[A]NASD方式の数式を入力する
[B]結果

EX4A507Z EX4A508Z
[A]ヨーロッパ方式の数式を入力する
[B]結果

EX4A509Z EX4A510Z
NASD方式とヨーロッパ方式のどちらも同じ日数が計算されるのは、終了日が31日でないからです。至の日付を31日にすると1日のずれが表れます。
[A]終了日を1999/8/31にする
[B]ヨーロッパ方式が1日少なく計算される
EX4A511Z
●NETWORKDAYS関数 要 分析ツール
開始日から終了日までの期間に含まれる稼動日(土曜、日曜を除く)の日数を返します。土曜、日曜以外の祭日、あるいは定休日などを指定して除くことができます。
書式 NETWORKDAYS(開始日, 終了日, 祭日)
開始日 対象期間の初日を表す日付を指定します。
終了日 対象期間の最終日を表す日付を指定します。
祭日 国民の祝日や夏期休暇など、稼動日数の計算から除外する日を表す日付を指定します
使用例
[A]数式を入力する
[B]指定期間の土日と指定日を省いた日数が求められる

EX4A512Z EX4A515Z
指定日が複数日のときは、以下のようにセル範囲で指定します。
[A]数式を入力する
[B]指定期間の土日と指定日を省いた日数が求められる
この例では1998/5/3は日曜日なので、この日の分の減算は行われていません。

EX4A513Z EX4A514Z
●YEARFRAC関数 要 分析ツール
指定期間(開始日と終了日)が、1年間に対して占める割合を返します。
書式 YEARFRAC(開始日, 終了日, 基準)
開始日 対象期間の初日を表す日付を指定します。
終了日 対象期間の最終日を表す日付を指定します。
基準 1 年を何日として計算するかを数値で指定します。
基準 1 月の日数/1 年の日数
0/省略 30 日 /360 日 (NASD 方式)
1 実際の日数/実際の日数
2 実際の日数/360 日
3 実際の日数/365 日
4 30
日 /360 日 (ヨーロッパ方式)
使用例
[A]数式を入力する
[B]結果が求められる
[C]期間を1年後の同月〃日にすると割合1が求められる
![]() |

EX4A516Z EX4A517Z
EX4A518Z
●WEEKNUM関数 要 分析ツール
シリアル値に対応する日がその年の何週目にあたるかを数値で返します。
書式 WEEKNUM(シリアル値, 週の基準)
シリアル値 日時の連番を指定する
週の基準 1週間が何曜日から始まるかを数値で指定します。既定値は 1 です。
週の基準 週の始まり
1/省略 日曜日。曜日には順に 1 〜 7 の番号が対応。
2 月曜日。曜日には順に 1 〜 7 の番号が対応。
使用例
[A]数式を入力する
[B]1998/4/16は第16週である
[C]1998年は53週であることが求められる

EX4A519Z EX4A520Z
EX4A521Z
【まとめ】
DATEDIF 指定された期間内の日数、月数、または年数を返します。
DAYS360 1
年を 360 日 (30 日×12) と仮定して、2 つの日付の間の日数を返します。
NETWORKDAYS 2
つの日付の間にある稼動日数を返します。
YEARFRAC 指定された 2 つの日付の間の日数を、年を単位とする数値で表します。
WEEKNUM シリアル値に対応する日がその年の何週目にあたるかを、数値で返します。
■前後の日付
指定日から起算して、前日あるいは後日の日付を求める関数があります。土曜や日曜を除いた日数で求める関数もあります。
●EDATE関数 要 分析ツール
開始日から起算して、指定された月数だけ前または後の日付に対応するシリアル値を返します。
書式 EDATE(開始日, 月)
開始日 起算日を表す日付を指定する
月 開始日から起算した月数を指定する(正数は後日、負数は前日)
使用例
[A]日付から2月進めた日付を求める数式
[B]結果がシリアル値で求められる
![]() |

EX4A522Z EX4A523Z
結果を日付形式で表示する場合は、セルの表示形式を日付に設定します。次の例はE4にシリアル値を表示させて、セルE4の表示形式を日付に設定しています。
[A]セルE4に参照式を入力する
[B]セルE4を右クリックしてショートカットメニューの[セルの書式設定]を選択する
[C]表示形式を[日付](ここでは「1997年3月4日」形式を選択)選択する
[D]日付で表示される
![]() |

EX4A524Z EX4A525Z

EX4A526Z EX4A527Z
●EOMONTH関数 要 分析ツール
開始日から起算して、指定された月数だけ前または後の月の最終日(月末)に対応するシリアル値を返します。
書式 EOMONTH(開始日, 月)
開始日 起算日を表す日付を指定する
月 開始日から起算した月数を指定する(正数は後日、負数は前日)
使用例
[A]日付から2月進めた日付を求める数式
[B]結果がシリアル値で求められる

EX4A528Z EX4A529Z
前項のEDATE関数と同じように、セル参照と表示形式を日付に変更して、求めたシリアル値を日付で表示するようにします。
EX4A530Z
先のEDATE関数は2月後の同日が求められましたが、EOMONTH関数は2月後の月末日が求められています。
●WORKDAY関数 要 分析ツール
開始日から起算して、指定された稼動日数だけ前または後の日付に対応する値を返します。稼動日は土曜、日曜、および指定された祭日を除く日のことです。この関数を使用すると、納品書の支払日、発送日、作業日数などを計算するときに、週末や祭日を除くことができます。
書式 WORKDAY(開始日, 日数, 祭日)
開始日 起算日を表す日付を指定する
日数 開始日から起算して土日や祭日を除く日数を指定する(正数は後日、負数は前日)
祭日 祝日や夏期休暇など、稼動日数の計算から除外する日付のリストを指定します。
使用例
ある商品の注文がありました。商品の組立に60日かかります。土曜日、日曜日、臨時休業日を省いた稼働日数60日後の日付を求めると図イのようになります。
[A]数式を入力する
[B]結果がシリアル値で求められる
[C]セルG4でシリアル値を参照して表示形式を日付に設定する

EX4A531Z EX4A532Z
EX4A533Z
【まとめ】
EDATE 指定された月数だけ前または後の日付に対応するシリアル値を返します。
WORKDAY 指定された稼動日数だけ前または後の日付に対応するシリアル値を返します。
EOMONTH 開始日から起算して、指定された月数だけ前または後の月の最終日に対応するシリアル値を返します。
DATE
DATEDIF
DATEVALUE
DAY
DAYS360
EDATE
EOMONTH
HOUR
MINUTE
MONTH
NETWORKDAYS
NOW
SECOND
TIME
TIMEVALUE
TODAY
WEEKDAY
WEEKNUM
WORKDAY
YEAR
YEARFRAC
■シリアル値を日付に変換する
MONTH シリアル値を月に変換します。
YEAR シリアル値を年に変換します。
WEEKDAY シリアル値を曜日に変換します。
DAY シリアル値を日に変更します。
■シリアル値を時刻に変換する
HOUR シリアル値を時に変換します。
MINUTE シリアル値を分に変換します。
SECOND シリアル値を秒に変換します。
■日数を計算する
DATEDIF 指定された期間内の日数、月数、または年数を返します。
NETWORKDAYS 2
つの日付の間にある稼動日数を返します。
YEARFRAC 指定された 2 つの日付の間の日数を、年を単位とする数値で表します。
WEEKNUM シリアル値に対応する日がその年の何週目にあたるかを、数値で返します。
DAYS360 1
年を 360 日 (30 日×12) と仮定して、2 つの日付の間の日数を返します。
■前後の日付
EDATE 指定された月数だけ前または後の日付に対応するシリアル値を返します。
WORKDAY 指定された稼動日数だけ前または後の日付に対応するシリアル値を返します。
EOMONTH 開始日から起算して、指定された月数だけ前または後の月の最終日に対応するシリアル値を返します。
■現在の日時
NOW 現在の日付と時刻に対応するシリアル値を返します。
TODAY 現在の日付に対応するシリアル値を返します。
■指定日時のシリアル値を求める
DATE 指定した日付に対応するシリアル値を返します。
DATEVALUE 日付を表す文字列をシリアル値に変換します。
TIME 指定された時刻に対応するシリアル値を返します。
TIMEVALUE 時刻を表す文字列をシリアル値に変換します。
作成手順
さて、どこから書き始めればいいのでしょう。

![]() |
|||
■現年度を求める
今日現在の年度始(4月1日)の日付を求めるにはどういう数式にすれば良いでしょうか。例えば以下のような場合です。
今日 年度始
1999/10/10 → 1999/4/1
2000/1/23 → 1999/4/1
2000/3/31 → 1999/4/1
2000/4/1 → 2000/4/1
2000/10/10 → 2000/4/1
【回答】
=DATE(YEAR(TODAY())-(MONTH(TODAY())<=3),4,1)
【解説】
2000/3/31までは1999年度、2000/4/1から2000年度になります。単に =DATE(YEAR(TODAY()),4,1) とすると、2000/1/1から2000/3/31の年度始が2000/4/1と翌年度の年度始の日付となります。
1月から3月は前年に入ります。
そこで、 -(MONTH(TODAY())<=3) という式をかませています。
MONTH(TODAY())<=3 で今日の月が3以下であれば TRUE を、それ以外であれば FALSEを返します。
論理値 TRUE/FALSE は算術演算子とともに使われるとそれぞれ数値 1, 0 に変換されることを利用し、 YEAR(TODAY())-(MONTH(TODAY())<=3) で、今日の月が3以下であれば 今日の年から -1 することで、年度を調整しているわけです。
![]() |
■満年齢
A列に誕生日が入っています。例えばセルA2に入っている誕生日の人の今日現在の年齢を算出するにはどういう数式を使えばよいでしょうか?
【回答】
=DATEDIF(A2,TODAY(),"Y")
【解説】
DATEDIF関数は、指定された期間内の日数、月数、または年数を返します。
DATEDIF(開始日,終了日,単位)という引数をとります。
[開始日]は[終了日]より前の日付でなければいけません。[終了日]が[開始日]より前の日付の場合にはエラーとなります。
[単位]で戻り値の種類を指定します。
"Y" 期間内の満年数
"M" 期間内の満月数
"D" 期間内の満日数
"MD" 1ヶ月未満の日数
"YM" 1年未満の月数
"YD" 1年未満の日数
DATEDIF関数は、Lotus 1-2-3 関数との互換性を保つために用意されています。[関数ウィザード] の「関数名一覧」には含まれていません。
DATEDIF関数は、[開始日]が閏年か平年かで違った値を返します。
=DATEDIF("1998/2/1","1999/3/1","YD") は 28(平年−平年)
=DATEDIF("1999/2/1","2000/3/1","YD") は 28(平年−閏年)
=DATEDIF("2000/2/1","2001/3/1","YD") は 29(閏年−平年)
=DATEDIF("2000/2/1","2004/3/1","YD") は 29(閏年−閏年)
■生年月日から学年を求める
A列に生年月日が入っています。B列に現在時点での学年を表示させるにはどうしたら良いでしょうか?
B列には、未就学児、小1、小2、・・・大3、大4というふうに表示させます。
例えば、本日(2000年10月)時点で、以下のように表示したいのです。
1978/9/1 大4
1984/9/1 高1
1985/9/1 中3
1994/4/1 小1
1994/4/2 未就学児
それから、A列のセルに既に大学を卒業している人の誕生日が入力されている、または未入力の場合は空白が返ってくるようにします。
【回答】
1.Sheet1のA1:B19に以下のリストを作成します。
年齢 学年
0 未就学児
6 小1
7 小2
8 小3
9 小4
10 小5
11 小6
12 中1
13 中2
14 中3
15 高1
16 高2
17 高3
18 大1
19 大2
20 大3
21 大4
22 =""
2.A1:B19を選択して、名前ボックスに「LIST」と入力
3.続いてSheet2のセルD1に以下の式を入力
=DATE(YEAR(TODAY())-(MONTH(TODAY())<=3)*1,4,1)
4.A2に生年月日が入力されているとして、B2に以下の式を入力
=VLOOKUP(DATEDIF(A2,$D$1,"Y"),LIST,2,TRUE)
5.必要な行までコピー
これで、以下のようになります。
1976/9/1
1977/9/1
1978/9/1 大4
1979/9/1 大3
1980/9/1 大2
1981/9/1 大1
1982/9/1 高3
1983/9/1 高2
1984/9/1 高1
1985/9/1 中3
1986/9/1 中2
1987/9/1 中1
1988/9/1 小6
1989/9/1 小5
1990/9/1 小4
1991/9/1 小3
1992/9/1 小2
1993/9/1 小1
1994/3/31 小1
1994/4/1 小1
1994/4/2 未就学児
1994/9/1 未就学児
1995/9/1 未就学児
1996/9/1 未就学児
【解説】
=DATE(YEAR(TODAY())-(MONTH(TODAY())<=3)*1,4,1)
上記式で今年度の年度始の日付 2000/4/1 が算出されます。
=DATEDIF(A2,$D$1,"Y")
上記式で誕生日を開始日、今年度の年度始の日付を終了日とする満年数が算出されます。例えば 1988/9/1 がセルA2に入力されていると、1988/9/1 と年度始 2000/4/1 の満年数として 11 が返り値となるわけです。
VLOOKUP関数は、VLOOKUP(検索値, 範囲, 列番号, 検索の型) という引数をとります。
指定された[範囲]の左端の列で[検索値]を検索し、[範囲]内の対応する[列番号]セルの値を返します。
[検索の型]では、[検索値]と完全に一致する値だけを検索するか、その近似値を含めて検索するかを、論理値で指定します。
TRUE または 1 を指定するか省略すると、検索値が見つからない場合に、検索値 未満で最も大きい値が使用されます。
FALSE または 0 を指定すると、検索値 と完全に一致する値だけが検索され、見つからない場合はエラー値 #N/A が返されます。
=VLOOKUP(11,LIST,2,TRUE)
上記式の場合には LISTの左端の列の11に対応したLISTの2列目の小6 が返ってくるわけです。
=VLOOKUP(4,LIST,2,TRUE)
上記式の場合にはLISTの左端の列に 4 がないので、4未満で最も大きい値、すなわち 0 に対応したLISTの2列目の 未就学児 が返ってくるわけです。
=VLOOKUP(23,LIST,2,TRUE)
上記式の場合にはLISTの左端の列に 23 がないので、23未満で最も大きい値、すなわち 22 に対応したLISTの2列目の "" が返ってくるわけです。
それでは、セルA2が未入力の場合はどうなるでしょうか?
=DATEDIF(A2,$D$1,"Y")
シリアル値 1 は1900/1/1 となり、0は1900/1/0 となります。従って、
=DATEDIF(0,"2000/4/1","Y") の返り値 100 がVLOOKUP関数の検索値となり、
=VLOOKUP(100,LIST,2,TRUE) となります。
上記式の場合にはLISTの左端の列に 100 がないので、100未満で最も大きい値、すなわち 22 に対応したLISTの2列目の "" が返ってくるわけです。
サンプルファイルはこちらです。
■月末の日付
先月末、今月末、来月末の日付を求めるにはそれぞれどういう数式にすればよいでしょうか?
例えば、今日が2000/10/16であった場合、それぞれ2000/9/30、2000/10/31、2000/11/30を求めたいのです。
【回答】
先月末 =DATE(YEAR(TODAY()),MONTH(TODAY()),0)
今月末 =DATE(YEAR(TODAY()),MONTH(TODAY())+1,0)
来月末 =DATE(YEAR(TODAY()),MONTH(TODAY())+2,0)
【解説】
今日が2000/10/16だとして、来月末を求める数式を解説します。
=YEAR(TODAY())
YEAR関数は、日付に対応する年を返します。従って、2000が返ります。
=MONTH(TODAY())
MONTH関数は、日付に対応する月を返します。従って、10が返ります。
その結果、=DATE(YEAR(TODAY()),MONTH(TODAY())+2,0)は、
=DATE(2000,10+2,0) すなわち、=DATE(2000,12,0)
となります。
=DATE(2000,12,1) は2000/12/1です。
=DATE(2000,12,0) は2000/12/1の一日前と解釈され、2000/11/31となります。
=DATE(YEAR(TODAY()),MONTH(TODAY())+2,0)は、
=DATE(YEAR(TODAY()),MONTH(TODAY())+2,1)-1 と同じです。"2ヵ月後の月初の一日前"="1ヶ月後の月末"というわけです。
メニュー[ツール]-[アドイン]で[分析ツール]にチェックをつけていれば、以下の数式でも算出することができます。
=EOMONTH(TODAY(),-1)
=EOMONTH(TODAY(),0)
=EOMONTH(TODAY(),1)
EOMONTH関数は、=EOMONTH(開始日, 月) という引数をとります。
月に正の数を指定すると、起算日より後の日付となり、負の数を指定すると、起算日より前の日付となります。
[分析ツール]にチェックが入っていない場合には、#NAME? というエラー値が表示されます。
■月の日数
今月が何日あるか、その日数を求めるにはどういう数式を使えば良いでしょうか?
例えば今日が2000/10/19であれば31、今日が2000/2/19であれば29を求めたいのです。
【回答】
=DAY(DATE(YEAR(TODAY()),MONTH(TODAY())+1,0))
【解説】
日割り計算などを行う際などに、この数式が役に立つのではないでしょうか?
=DATE(YEAR(TODAY()),MONTH(TODAY())+1,0)
で”来月の1日の前日”、すなわち今月末の日付が算出されます。
DAY関数は、その日付が何日かを返します。
=DAY(DATE(YEAR(TODAY()),MONTH(TODAY())+1,0))
で、月末の日が何日か、すなわちその月の日数が何日あるかを返すわけです。
メニュー[ツール]-[アドイン]で[分析ツール]にチェックをつけていれば、以下の数式でも、その月の日数を算出することができます。
=DAY(EOMONTH(TODAY(),0))
■成人の日、体育の日
その年の成人の日と体育の日が何日かを求めるには、それぞれどういう数式を使えば良いでしょうか?
成人の日は1月の第2月曜日、体育の日は10月の第2月曜日です。
セルA1に四桁の年を入力するとします。
例えばセルA1に 2001 と入力したら、それぞれ、2001/1/8、2001/10/8を返します。
【回答】
成人の日
=DATE(A1,1,14-WEEKDAY(DATE(A1,1,0),3))
体育の日
=DATE(A1,10,14-WEEKDAY(DATE(A1,10,0),3))
【解説】
=DATE(A1,1,0) は1月1日の前日、すなわち前年の12月31日を返します。
=DATE(A1,10,0) は10月1日の前日、すなわち9月30日を返します。
WEEKDAY関数は、日付(シリアル値)から曜日に対応する値を返します。
WEEKDAY(シリアル値, 種類)という引数をとります。種類によって曜日に対応する値が異なります。
種類は以下の3種類があります。種類を省略すると1になります。
上記式では種類として3を指定しています。
1: 1 (日曜) 〜 7 (土曜)
2: 1 (月曜) 〜 7 (日曜)
3: 0 (月曜) 〜 6 (日曜)
第2月曜日は8日から14日までの範囲のどれかです。
12月31日が月曜日(WEEKDAY関数の返り値は0)の場合、翌年の1月の第2月曜日は14日(=14-0)になります。
12月31日が火曜日(WEEKDAY関数の返り値は1)の場合、翌年の1月の第2月曜日は13日(=14-1)になります。
12月31日が日曜日(WEEKDAY関数の返り値は6)の場合、翌年の1月の第2月曜日は8日(=14-6)になります。
それぞれ以下の式でも同じ結果が返ります。
成人の日
=DATE(A1,1,14-WEEKDAY(DATE(A1-1,12,31),3))
体育の日
=DATE(A1,10,14-WEEKDAY(DATE(A1,9,30),3))
■第n曜日を求める
A1:A4に以下を入力するとします。
第n曜日の日付を求めるにはどういう数式にすれば良いでしょうか?
A1: 年
A2: 月
A3: n
A4: 曜日に対応する値:0 (月曜) 〜 6 (日曜)
この数式は、A1:A4に以下が入力されていると、
(例1)
2001
1
1
1
2001年1月の第1火曜日(1月の1番目の火曜日)、すなわち2001/1/2を返します。
(例2)
2001
1
3
4
2001年1月の第3金曜日(1月の3番目の金曜日)、すなわち2001/1/19を返します。
(例3)
2000
12
1
1
2000年12月の第1火曜日(12月の1番目の火曜日)、すなわち2000/12/5を返します。
(例4)
2000
12
3
4
2000年12月の第3金曜日(12月の3番目の金曜日)、すなわち2000/12/15を返します。
【回答】
=DATE(A1,A2,A3*7-WEEKDAY(DATE(A1,A2,-A4),3))
【解説】
サンプルファイルはこちらです。
7の倍数から、前月末日の曜日と求める曜日の日数の差を引くといった感じの数式になります。
2001年1月の第1火曜日の例で解説します。
=DATE(2001,1,1*7-WEEKDAY(DATE(2001,1,-1),3))
=DATE(2001,1,-1)
これは、2001/1/1(月)の前日、2000/12/31(日)の1日前、すなわち2000/12/30(土)を返します。
土曜日なので、=WEEKDAY(DATE(2001,1,-1),3)
の返り値は5になります。
=1*7-5の返り値は2なので、=DATE(2001,1,2)すなわち、2001/1/2(火)という結果になります。
次に2001年1月の第3金曜日の例で解説します。
=DATE(2001,1,3*7-WEEKDAY(DATE(2001,1,-4),3))
=DATE(2001,1,-4)
これは、2001/1/1(月)の前日、2000/12/31(日)の4日前、すなわち2000/12/27(水)を返します。
水曜日なので、=WEEKDAY(DATE(2001,1,-4),3)
の返り値は2になります。
=3*7-2の返り値は19なので、=DATE(2001,1,19)すなわち、2001/1/19(金)という結果になります。
WEEKDAY関数は、日付(シリアル値)から曜日に対応する値を返します。
WEEKDAY(シリアル値, 種類)という引数をとります。種類によって曜日に対応する値が異なります。
種類は以下の3種類があります。種類を省略すると1になります。
上記式では種類として3を指定しています。
1: 1 (日曜) 〜 7 (土曜)
2: 1 (月曜) 〜 7 (日曜)
3: 0 (月曜) 〜 6 (日曜)
■国民の休日
セルA1に四桁の年を入力するとして、その年の国民の休日がない場合には −
を、ある場合にはその日付を返すにはどういう数式にすれば良いでしょうか?
以下は「国民の祝日に関する法律」第三条(休日)です。
1 「国民の祝日」は、休日とする。
2 「国民の祝日」が日曜日にあたるときは、その翌日を休日とする。
3 その前日及び翌日が「国民の祝日」である日(日曜日にあたる日及び前項に規定する休日にあたる日を除く。)は、休日とする。
”その前日及び翌日が「国民の祝日」である日”は、5月4日だけです。
憲法記念日(5月3日)
こどもの日(5月5日)
5月4日が日曜日の場合には、国民の休日にはなりません。
5月3日が日曜日の場合には、5月4日は振替休日となり、国民の休日にはなりません。
例えば、2003年、2008年、2009年には国民の休日はありません。
【回答】
=IF(WEEKDAY(DATE(A1,5,3),3)>=5,"−",DATE(A1,5,4))
【解説】
5月3日または5月4日が日曜日の場合、国民の休日はありません。言い換えると5月3日が土曜日か日曜日の場合、国民の休日はありません。
WEEKDAY関数は、日付(シリアル値)から曜日に対応する値を返します。
WEEKDAY(シリアル値, 種類)という引数をとります。種類によって曜日に対応する値が異なります。
種類は以下の3種類があります。種類を省略すると1になります。
上記式では種類として3を指定しています。
1: 1 (日曜) 〜 7 (土曜)
2: 1 (月曜) 〜 7 (日曜)
3: 0 (月曜) 〜 6 (日曜)
=WEEKDAY(DATE($A$1,5,3),3)>=5
は、5月3日が土曜日か日曜日であればTRUEを返します。
■最終営業日
月末の日付を求める数式、例えば今月の月末であれば、
=DATE(YEAR(TODAY()),MONTH(TODAY())+1,0)
あるいは、
=EOMONTH(TODAY(),0)
で求めることができます。
それでは、例えば月末が休日(土日祝日)であったら、その前日の営業日の日付を取得するようにするにはどうしたら良いでしょうか。
つまり、月の最終営業日を求める数式を作りたいのです。
セルA2に日付を入力するとします。
2001年1月 2001/1/31 (水)
2001年2月 2001/2/28 (水)
2001年3月 2001/3/30 (金)
2001年4月 2001/4/27 (金)
2001年5月 2001/5/31 (木)
2001年6月 2001/6/29 (金)
【回答】
祝日を入力した範囲に 祝日
と名前をつけているとします。
=WORKDAY(EOMONTH(A2,0)+1,-1,祝日)
【解説】
WORKDAY関数、EOMONTH関数どちらもアドイン関数なので、メニュー[ツール]-[アドイン]で分析ツールにチェックしておく必要があります。
=WORKDAY(EOMONTH(A2,0)+1,-1,祝日) は、月末日の翌日の前営業日というやり方
で最終営業日を求めています。
例えば、セルA2に 2001/3/1 が入力されているとすると、
月末日 2001/3/31 (土)
↓
翌日 2001/4/1 (日)
↓
前営業日 2001/3/30 (金)
というふうにして月の最終営業日を求めています。
もう少し詳細に解説すると、
=EOMONTH(A2,0)
これで月末の日が返ります。
セルA2には 2001/3/1 が入っているので、=EOMONTH(A1,0) は 2001/3/31 (土)
を返します。
=EOMONTH(A2,0)+1
月末の翌日、すなわち月初の
2001/4/1 (日) を返します。
=WORKDAY(EOMONTH(A2,0)+1,-1,祝日)
WORKDAY関数は、WORKDAY(開始日, 日数, 祭日)という引数をとります。開始日
から起算して、指定された稼動日数だけ前または後の日付に対応する値を返しま
す。
2001/4/1 (日) の前営業日で、2001/3/30 (金) が返ります。
翌月の最終営業日という場合は、
=WORKDAY(EOMONTH(A2,1)+1,-1,祝日)
前月の最終営業日という場合は、
=WORKDAY(EOMONTH(A2,-1)+1,-1,祝日)
という式になります。
月末が休日だった場合には翌月の月初営業日というふうにするには、
=WORKDAY(EOMONTH(A2,0)-1,1,祝日)
とします。
月末日 2001/3/31 (土)
↓
前日 2001/3/30 (金)
↓
翌営業日 2001/4/2 (月)
という処理を行っているわけです。
サンプルファイルはこちらです。
■一ヶ月後の日付
セルA2に日付が入力されています。その日付の一ヶ月後を求めるにはどういう関数を使用すれば良いでしょうか?
例えば、セルA2に 2001/5/29 が入力されていたら、セルB2に 2001/6/29 を返したいのです。
2001/5/31 のように対応する日がない場合には、月末の日付 2001/6/30 を返すこととします。
【回答】
=EDATE(A2,1)
セルB2を選択して、Ctrl+1 (メニュー[書式]-[セル])で[表示形式]タブで[分類]を日付
にして、[種類]で表示させたい日付の形式を選択します。
【解説】
メニュー[ツール]-[アドイン]で[分析ツール]にチェックをしておく必要があります。
EDATE関数は、EDATE(開始日, 月) という引数をとります。
月 に正の数を指定すると、起算日より後の日付となり、負の数を指定すると、起算日より前の日付となります。
二ヶ月前の日付を求めるには、
=EDATE(A2,-2) のようにします。
■EDATE関数
EDATE関数は =EDATE(C1,1) とあった場合、C1より1ヶ月後の日付を表示させる関数です。
EDATE関数を使用するには、メニュー[ツール]-[アドイン]で[分析ツール]にチェックを入れておく必要があります。
EDATE関数を使わないで、1ヶ月後の日付を返す数式はないでしょうか?
【回答】
=MIN(DATE(YEAR(C1), MONTH(C1)+1,
DAY(C1)),DATE(YEAR(C1), MONTH(C1)+1+1,0))
【解説】
例えば、2ヶ月後の日付の場合には以下になります。
=MIN(DATE(YEAR(C1), MONTH(C1)+2,
DAY(C1)),DATE(YEAR(C1), MONTH(C1)+1+2,0))
■閏年
以下のようにB1:B5に日付が入力されています。
2001/8/31
2003/12/31
2004/1/1
2004/2/29
2008/2/29
隣のA列に、B列の日付が閏年(うるうどし)なら 1 を、平年の場合には 0 を表示させたいのですがどういう数式を使えばよいでしょうか?
セルA セルB
1 0 2001/8/31
2 0 2003/12/31
3 1 2004/1/1
4 1 2004/2/29
5 1 2008/2/29
【回答】
=(DAY(DATE(YEAR(B1),2,29))=29)*1
【解説】
その年の2/29が29日かどうかを判定し、その結果返るTRUE/FALSEに 1 をかけて数値化しています。
=(MONTH(DATE(YEAR(B1),2,29))=2)*1
でも同じ結果が返ります。
この式では、その年の2/29が2月かどうかを判定し、その結果返るTRUE/FALSEに 1 をかけて数値化しています。
以下のページもご参考になるのでは?
XL2000: Excel Incorrectly Assumes 1900 Is a
Leap Year
http://support.microsoft.com/default.aspx?scid=kb;en-us;214326
[XL2002]Excel で用いている閏年の判定方法
http://support.microsoft.com/default.aspx?scid=kb;JA;118923
■翌営業日
セルA1に日付が入っているとします。
5日後は、=A1+5 と簡単に算出できます。
これを5日後が土日祝日の場合には次の営業日にするにはどういう数式にしたら良いでしょうか?
5営業日後ではなく、暦日で5日後の日付が土日祝日の場合には、その翌営業日を求めたいのです。
【回答】
祝日を入力した範囲に 祝日
と名前をつけているとします。
=WORKDAY(A1+4,1,祝日)
【解説】
WORKDAY関数を使用するには、メニュー[ツール]-[アドイン]で[分析ツール]にチェックをしておく必要があります。
暦日で5日後の日付が土日祝日の場合には、その翌営業日 = 4日後の翌営業日というふうに考えます。
![線吹き出し 3: [C]](clip_image118.gif)
![線吹き出し 3: [B]](clip_image088.gif)
![線吹き出し 3: [B]](clip_image112.gif)
![線吹き出し 3: [A]](clip_image089.gif)
![線吹き出し 3: [B]](clip_image139.gif)
![線吹き出し 3: [A]](clip_image113.gif)
![線吹き出し 3: [B]](clip_image092.gif)
![線吹き出し 3: [B]](clip_image043.gif)
![線吹き出し 3: [B]](clip_image061.gif)
![線吹き出し 3: [B]](clip_image043.gif)
![線吹き出し 3: [B]](clip_image031.gif)
![線吹き出し 3: [B]](clip_image010.gif)
![線吹き出し 3: [C]](clip_image153.gif)
![線吹き出し 3: [A]](clip_image140.gif)
![線吹き出し 3: [A]](clip_image128.gif)
![線吹き出し 3: [C]](clip_image109.gif)
![線吹き出し 3: [A]](clip_image093.gif)
![線吹き出し 3: [A]](clip_image083.gif)
![線吹き出し 3: [A]](clip_image062.gif)
![線吹き出し 3: [A]](clip_image044.gif)
![線吹き出し 3: [A]](clip_image032.gif)
![線吹き出し 3: [A]](clip_image011.gif)
![線吹き出し 3: [B]](clip_image147.gif)
![線吹き出し 3: [D]](clip_image133.gif)
![線吹き出し 3: [B]](clip_image122.gif)
![線吹き出し 3: [B]](clip_image104.gif)
![線吹き出し 3: [B]](clip_image043.gif)
![線吹き出し 3: [B]](clip_image077.gif)
![線吹き出し 3: [B]](clip_image067.gif)
![線吹き出し 3: [B]](clip_image055.gif)
![線吹き出し 3: [B]](clip_image049.gif)
![線吹き出し 3: [B]](clip_image037.gif)
![線吹き出し 3: [B]](clip_image025.gif)
![線吹き出し 3: [B]](clip_image010.gif)
![線吹き出し 3: [B]](clip_image004.gif)
![線吹き出し 3: [A]](clip_image148.gif)
![線吹き出し 3: [C]](clip_image134.gif)
![線吹き出し 3: [A]](clip_image098.gif)
![線吹き出し 3: [A]](clip_image078.gif)
![線吹き出し 3: [A]](clip_image068.gif)
![線吹き出し 3: [A]](clip_image056.gif)
![線吹き出し 3: [A]](clip_image050.gif)
![線吹き出し 3: [A]](clip_image038.gif)
![線吹き出し 3: [A]](clip_image026.gif)
![線吹き出し 3: [A]](clip_image016.gif)
![線吹き出し 3: [A]](clip_image005.gif)
