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関数

シリアル値から日を求める(戻り値は131の範囲の整数)。

 

書式     DAY(シリアル値)

 

シリアル値   日付の連番を指定する

 

使用例

[A]数式を入力する

[B]日付に対する日が数値で求められる

 

 

EX4A481Z                EX4A482Z

 

 

●MONTH関数

シリアル値から月を求める(戻り値は112の範囲の整数)。

 

書式     MONTH(シリアル値)

 

シリアル値   日付の連番を指定する

 

使用例

[A]数式を入力する

[B]日付に対する月が数値で求められる

 

  

EX4A483Z                EX4A484Z

 

 

●YEAR関数

シリアル値から年を求める(戻り値は19009999の範囲の整数)。

 

書式     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日は、いずれも230日と見なされます。

TRUE            ヨーロッパ方式。開始日または終了日が、ある月の31日になる場合、同じ月の30日として計算が行われます。

 

NASD方式

開始日が、ある月の31日になる場合、同じ月の30日として計算が行われます。終了日が、ある月の31日になる場合は、開始日が30日でない限り、その翌月の1日として計算が行われます。2月の28日と29日は、いずれも230日と見なされます。

●ヨーロッパ方式

開始日または終了日が、ある月の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が求められる

 

 

 

線吹き出し 3: [A]

 


 

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]結果がシリアル値で求められる

 

線吹き出し 3: [A]

 


  

EX4A522Z              EX4A523Z

 

結果を日付形式で表示する場合は、セルの表示形式を日付に設定します。次の例はE4にシリアル値を表示させて、セルE4の表示形式を日付に設定しています。

 

[A]セルE4に参照式を入力する

[B]セルE4を右クリックしてショートカットメニューの[セルの書式設定]を選択する

[C]表示形式を[日付](ここでは「1997年3月4日」形式を選択)選択する

[D]日付で表示される

 

 

 

 

線吹き出し 3: [B]

 


 

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     時刻を表す文字列をシリアル値に変換します。

 

 

 


 

 

作成手順

 さて、どこから書き始めればいいのでしょう。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


■現年度を求める

 今日現在の年度始(41日)の日付を求めるにはどういう数式にすれば良いでしょうか。例えば以下のような場合です。

 

 

 

 

 

 

  今日               年度始

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というふうに表示させます。

 

 例えば、本日(200010月)時点で、以下のように表示したいのです。

 

1978/9/1 大4

1984/9/1 高1

1985/9/1 中3

1994/4/1 小1

1994/4/2 未就学児

 

 それから、A列のセルに既に大学を卒業している人の誕生日が入力されている、または未入力の場合は空白が返ってくるようにします。

 

【回答】

1.Sheet1A1: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に対応したLIST2列目の小6 が返ってくるわけです。

 

=VLOOKUP(4,LIST,2,TRUE)

 

 上記式の場合にはLISTの左端の列に 4 がないので、4未満で最も大きい値、すなわち 0 に対応したLIST2列目の 未就学児 が返ってくるわけです。

 

=VLOOKUP(23,LIST,2,TRUE)

 

 上記式の場合にはLISTの左端の列に 23 がないので、23未満で最も大きい値、すなわち 22 に対応したLIST2列目の "" が返ってくるわけです。

 

 それでは、セルA2が未入力の場合はどうなるでしょうか?

=DATEDIF(A2,$D$1,"Y")

 

 シリアル値 1 1900/1/1 となり、01900/1/0 となります。従って、

=DATEDIF(0,"2000/4/1","Y") の返り値 100 VLOOKUP関数の検索値となり、

=VLOOKUP(100,LIST,2,TRUE) となります。

 

 上記式の場合にはLISTの左端の列に 100 がないので、100未満で最も大きい値、すなわち 22 に対応したLIST2列目の "" が返ってくるわけです。

 

 サンプルファイルはこちらです。

 

 

 

■月末の日付

 先月末、今月末、来月末の日付を求めるにはそれぞれどういう数式にすればよいでしょうか?

 例えば、今日が2000/10/16であった場合、それぞれ2000/9/302000/10/312000/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/82001/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) 11日の前日、すなわち前年の1231日を返します。

 =DATE(A1,10,0) 101日の前日、すなわち930日を返します。

 

 WEEKDAY関数は、日付(シリアル値)から曜日に対応する値を返します。

 WEEKDAY(シリアル値, 種類)という引数をとります。種類によって曜日に対応する値が異なります。

 種類は以下の3種類があります。種類を省略すると1になります。

 上記式では種類として3を指定しています。

 

 1: 1 (日曜) 7 (土曜)

 2: 1 (月曜) 7 (日曜)

 3: 0 (月曜) 6 (日曜)

 

 第2月曜日は8日から14日までの範囲のどれかです。

 

 1231日が月曜日(WEEKDAY関数の返り値は0)の場合、翌年の1月の第2月曜日は14日(=14-0)になります。

 1231日が火曜日(WEEKDAY関数の返り値は1)の場合、翌年の1月の第2月曜日は13日(=14-1)になります。

 1231日が日曜日(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

 

20011月の第1火曜日(1月の1番目の火曜日)、すなわち2001/1/2を返します。

 

(例2

 

2001

1

3

4

 

20011月の第3金曜日(1月の3番目の金曜日)、すなわち2001/1/19を返します。

 

(例3

 

2000

12

1

1

 

200012月の第1火曜日(12月の1番目の火曜日)、すなわち2000/12/5を返します。

 

(例4

 

2000

12

3

4

 

200012月の第3金曜日(12月の3番目の金曜日)、すなわち2000/12/15を返します。

 

【回答】

=DATE(A1,A2,A3*7-WEEKDAY(DATE(A1,A2,-A4),3))

 

【解説】

 サンプルファイルはこちらです。

 

 7の倍数から、前月末日の曜日と求める曜日の日数の差を引くといった感じの数式になります。

 

 20011月の第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()という結果になります。

 

 次に20011月の第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 その前日及び翌日が「国民の祝日」である日(日曜日にあたる日及び前項に規定する休日にあたる日を除く。)は、休日とする。

 

 ”その前日及び翌日が「国民の祝日」である日”は、54日だけです。

憲法記念日(53)

こどもの日(55)

 

 54日が日曜日の場合には、国民の休日にはなりません。

 53日が日曜日の場合には、54日は振替休日となり、国民の休日にはなりません。

 

 例えば、2003年、2008年、2009年には国民の休日はありません。

 

【回答】

=IF(WEEKDAY(DATE(A1,5,3),3)>=5,"",DATE(A1,5,4))

 

【解説】

 53日または54日が日曜日の場合、国民の休日はありません。言い換えると53日が土曜日か日曜日の場合、国民の休日はありません。

 

 WEEKDAY関数は、日付(シリアル値)から曜日に対応する値を返します。

 WEEKDAY(シリアル値, 種類)という引数をとります。種類によって曜日に対応する値が異なります。

 種類は以下の3種類があります。種類を省略すると1になります。

 上記式では種類として3を指定しています。

 

 1: 1 (日曜) 7 (土曜)

 2: 1 (月曜) 7 (日曜)

 3: 0 (月曜) 6 (日曜)

 

=WEEKDAY(DATE($A$1,5,3),3)>=5

は、53日が土曜日か日曜日であればTRUEを返します。

 

 

 

 

 

 

 

 

 

■最終営業日

 月末の日付を求める数式、例えば今月の月末であれば、

 

=DATE(YEAR(TODAY()),MONTH(TODAY())+1,0)

 

あるいは、

 

=EOMONTH(TODAY(),0)

 

で求めることができます。

 

 それでは、例えば月末が休日(土日祝日)であったら、その前日の営業日の日付を取得するようにするにはどうしたら良いでしょうか。

 つまり、月の最終営業日を求める数式を作りたいのです。

 セルA2に日付を入力するとします。

 

20011 2001/1/31 ()

20012 2001/2/28 ()

20013 2001/3/30 ()

20014 2001/4/27 ()

20015 2001/5/31 ()

20016 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/2929日かどうかを判定し、その結果返るTRUE/FALSE 1 をかけて数値化しています。

 

=(MONTH(DATE(YEAR(B1),2,29))=2)*1

 でも同じ結果が返ります。

 この式では、その年の2/292月かどうかを判定し、その結果返る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]線吹き出し 3: [B]線吹き出し 3: [B]線吹き出し 3: [A]線吹き出し 3: [B]線吹き出し 3: [A]線吹き出し 3: [B]線吹き出し 3: [B]線吹き出し 3: [B]線吹き出し 3: [B]線吹き出し 3: [B]

線吹き出し 3: [B]線吹き出し 3: [C]線吹き出し 3: [A]線吹き出し 3: [A]線吹き出し 3: [C]線吹き出し 3: [A]線吹き出し 3: [A]線吹き出し 3: [A]線吹き出し 3: [A]線吹き出し 3: [A]

線吹き出し 3: [A]線吹き出し 3: [B]
線吹き出し 3: [D]線吹き出し 3: [B]線吹き出し 3: [B]線吹き出し 3: [B]線吹き出し 3: [B]線吹き出し 3: [B]線吹き出し 3: [B]線吹き出し 3: [B]線吹き出し 3: [B]線吹き出し 3: [B]線吹き出し 3: [B]線吹き出し 3: [B]線吹き出し 3: [A]線吹き出し 3: [C]線吹き出し 3: [A]線吹き出し 3: [A]線吹き出し 3: [A]線吹き出し 3: [A]線吹き出し 3: [A]線吹き出し 3: [A]線吹き出し 3: [A]線吹き出し 3: [A]線吹き出し 3: [A]r操作