エクセルで日付から週番号を計算してみる2013年04月07日 22:07

週番号 Week xx ってどんな風に決まっている?で、週番号をいろいろ調べてみて、

エクセルで年月日から週番号を表示させたい


と思い計算してみることにしましたが、、、
エクセルのバージョンによって使える関数が異なるようです。
●Excel 2010/2013
●Excel 97/2000/2002/2003/2007


●Excel 2010/2013


1 ISO-8601システム


(1) WEEKNUM(日付シリアル値,Type) 関数

例:変換したい年月日がA1セルにある場合
  =WEEKNUM(A1,21)


 ◎ 日付シリアル値

方法

201212日の場合

セルに日付を入れて参照する

WEEKNUM(A1,21)

DATE(,,) 関数を使う

WEEKNUM(DATE(2010,1,2),21)

日付シリアル値を使う

WEEKNUM(40180,21)

 ◎ Type

Type

週の始まりの曜日

システム

主な使用エリア

1 (Week 1)

21

月曜日

ISO-8601

EU

最初の木曜日を含む週

14日を含む週

 参考:Excel 2010 helpOffice 2010 helpOffice 2013 help


(2) ISOWEEKNUM(日付シリアル値)関数
 Excel 2013では、ISO-8601システム専用の関数があります。

例:変換したい年月日がA1セルにある場合
  =ISOWEEKNUM(A1)

  ※) Excel 2010 はサポートされていません。



2 曜日基準システム

 WEEKNUM(日付シリアル値,Type) 関数

例:変換したい年月日がA1セルにあり、USシステムの場合
  =WEEKNUM(A1)
  =WEEKNUM(A1,1)
  =WEEKNUM(A1,17)


 ◎ 日付シリアル値

方法

201212日の場合

セルに日付を入れて参照する

WEEKNUM(A1,Type)

DATE(,,) 関数を使う

WEEKNUM(DATE(2010,1,2),Type)

日付シリアル値を使う

WEEKNUM(40180,Type)

 ◎ Type
  下表から目的に合ったTypeを選びます。Typeの1は省略できます

Type

週の始まりの曜日

システム

主な使用エリア

1 (Week 1)

1

日曜日

US

US

11日を含む週

 

同じ週の12/31以前は含まない

2

月曜日

その他

 

11

月曜日

 

12

火曜日

 

13

水曜日

 

14

木曜日

 

15

金曜日

 

16

土曜日

中東諸国

17

日曜日

US

US

 参考:Excel 2010 helpOffice 2010 helpOffice 2013 help




●Excel 97/2000/2002/2003/2007

WEEKNUM関数が準備されていますが、Excel 2007 での週番号システムと日付/時刻表示の実装に、Excel の WEEKNUM 関数を使用した週番号システムについて 、と言う記事があって、WEEKNUM 関数で簡単に計算することができないようです。

そこで、Excel 2007 での週番号システムと日付/時刻表示の実装に掲載されているWEEKNUM関数を使わない方法を参考にすると、
考え方は同じですが、計算式の記述方法は、それぞれ複数あります。
下表の数式は、WEEKDAY関数のTypeを省略し、最後に1を足す方法の例になります。

例:変換したい年月日がA1セルにある場合


システム

週の始まりの曜日

算出式

ISO-8601システム

月曜日

=1+INT((A1-DATE (YEAR(A1-WEEKDAY(A1-1)+4),1,5) +WEEKDAY(DATE (YEAR(A1-WEEKDAY(A1-1)+4),1,3)))/7)

曜日基準システム

US

日曜日

=1+INT((A1-(DATE(YEAR(A1),1,2) -WEEKDAY(DATE(YEAR(A1),1,1))))/7)

その他

月曜日

=1+INT((A1-(DATE(YEAR(A1),1,2) -WEEKDAY(DATE(YEAR(A1),1,0))))/7)

火曜日

=1+INT((A1-(DATE(YEAR(A1),1,2) -WEEKDAY(DATE(YEAR(A1),1,6))))/7)

水曜日

=1+INT((A1-(DATE(YEAR(A1),1,2) -WEEKDAY(DATE(YEAR(A1),1,5))))/7)

木曜日

=1+INT((A1-(DATE(YEAR(A1),1,2) -WEEKDAY(DATE(YEAR(A1),1,4))))/7)

金曜日

=1+INT((A1-(DATE(YEAR(A1),1,2) -WEEKDAY(DATE(YEAR(A1),1,3))))/7)

土曜日

=1+INT((A1-(DATE(YEAR(A1),1,2) -WEEKDAY(DATE(YEAR(A1),1,2))))/7)

単純週番号システム

=1+INT((A1-DATE(YEAR(A1),1,1))/7)




--- 使っている関数 ---

INT(数値)       小数点以下を切り捨て

  例:INT(12.7)=12

DATE(年,月,日)     年月日から日付シリアル値を返す

  2010年1月2日(土)の場合:YEAR(2010,1,2)=40180

YEAR(日付シリアル値)  日付シリアル値からを返す

  2010年1月2日(土)の場合:YEAR(40180)=2010

WEEKDAY(日付シリアル値,Type) 日付シリアル値の曜日を数値で返す

  返される数値は、Typeごとに異なり、下表のようになっています。

Type

1 or 省略

2

3

4

5

6

7

1

2

1

2

3

4

5

6

7

3

0

1

2

3

4

5

6

  2010年1月2日(土)でType=2場合:WEEKDAY(40180,2)=6

 ----- ポイント -----


 A1-WEEKDAY(B1,Type) で、A1直前の特定曜日日付を算出する

B1

Type

1 or 省略

2

..., A1  , A1+7, ...

直前の土曜日

直前の日曜日

..., A1-1, A1+6, ...

直前の日曜日

直前の月曜日

..., A1-2, A1+5, ...

直前の月曜日

直前の火曜日

..., A1-3, A1+4, ...

直前の火曜日

直前の水曜日

..., A1-4, A1+3, ...

直前の水曜日

直前の木曜日

..., A1-5, A1+2, ...

直前の木曜日

直前の金曜日

..., A1-6, A1+1, ...

直前の金曜日

直前の土曜日

例)直前の日曜日
 =A1-WEEKDAY(A1-1,1)=A1-WEEKDAY(A1-1)=A1-WEEKDAY(A1,2)

<考え方>
 1月10日が日曜日のとき、WEEKDAY関数 (Type=1or省略)は、1を返します。
 1月10日から、戻り値のを引くと、1日前なので、1月9日(土) になります。
 1月10日は年によって曜日が変わるので、
 もし、1月10日が、
  月曜日なら日前で、1月8日(土) になります。
  火曜日なら日前で、1月7日(土) になります。
  ・・・
  土曜日なら日前で、1月3日(土) になります。

 つまり、
 ある日付(A1)から、同じ日の WEEKDAY(A1) 戻り値を引くと、
 A1直前の土曜日日付が算出できます。

 では、
 ある日付(A1)から、前日WEEKDAY(A1-1) 戻り値を引くと、
 引く値が同日より小さくなるので、曜日が後ろにシフトし、
 A1直前の日曜日日付が算出できます。

 逆に、
 ある日付(A1)から、翌日WEEKDAY(A1+1) 戻り値を引くと、
 引く値が同日より大きくなるので、曜日がにシフトし、
 A1直前の金曜日日付が算出できます。

 よって、
 ある日付(A1)から、ある日付(B1)のWEEKDAY関数戻り値を引くと、
 B1A1の何日前か?後か?によって、A1の直前の特定曜日の日付となります。

●Type=2 を使っても、戻り値が1~7なので、同じことができます。
●Type=3 を使うと、戻り値が0~6なので、
 A1と同じ曜日は直前 (7日前) ではなく、A1と同じ日付になってしまいます。

 --------------------------




1 ISO-8601システムの考え方

Week 1月曜日から変換したい日までの日数7で割り、
 小数点以下を切り捨てると、
  Week 1は、0 となり、1を足すと、Week 1に、
  Week 2は、1 となり、1を足すと、Week 2に
   ・・・
 と言う具合で、週番号を算出します。


 <WEEKDAY関数で、Type=1 or 省略 を使った場合>

=1+INT((A1-DATE(YEAR(A1-WEEKDAY(A1-1)+4),1,5) +WEEKDAY(DATE(YEAR(A1-WEEKDAY(A1-1)+4),1,3)))/7)


 <WEEKDAY関数で、Type=2 を使った場合>

=1+INT((A1-DATE(YEAR(A1-WEEKDAY(A1,2)+4),1,5) +WEEKDAY(DATE(YEAR(A1-WEEKDAY(A1,2)+4),1,4),2))/7)



(1) A1:変換したい年月日のあるセル (例として 2010年1月2日(土)=40180 を使います)

(2) A1にとってのWeek 1月曜日何日かを計算します。

 ISO-8601のWeek 1は、下表のように、7種類のパターンがあります。
 12/29~1/4 (=1/5の前) の7日間のうち、何れかが月曜日になることになります。

12/29

12/30

12/31

1/1

1/2

1/3

1/4

12/30

12/31

1/1

1/2

1/3

1/4

1/5

12/31

1/1

1/2

1/3

1/4

1/5

1/6

1/1

1/2

1/3

1/4

1/5

1/6

1/7

1/2

1/3

1/4

1/5

1/6

1/7

1/8

1/3

1/4

1/5

1/6

1/7

1/8

1/9

1/4

1/5

1/6

1/7

1/8

1/9

1/10

 表を見ると分かるように、
 ●Week 11月4日を含む週と言い換えられます。

 ●また、A112/29~1/3のとき、
  A1にとってのWeek 11月4日は、A1と同じ年とは限りません。

A1の曜日

同じ週の木曜日が

前年になる場合

 

 

 

前年

 

 

1/1

 

 

 

前年

 

1/1

1/2

 

 

 

前年

1/1

1/2

1/3

同じ週の木曜日が

翌年になる場合

12/29

12/30

12/31

翌年

 

 

 

12/30

12/31

 

翌年

 

 

 

12/31

 

 

翌年

 

 

 

  A1が属する週の木曜日と同じ年になります。
  例ではA1=2010年1月2日(土)なので、表の3行目に当たり木曜日は前年です。

 そこで、
A1が属する週の木曜日の年1月4日何日か?を計算し、

その年の1月4日が含まれる週=Week 1の、月曜日何日か?を計算します。



 ●A1が属する週の木曜日の年1月4日何日か?

=DATE(YEAR(A1-WEEKDAY(A1-1)+4),1,4)=39817 (2009年1月4日)
=DATE(YEAR(A1-WEEKDAY(A1,2)+4),1,4)=39817 (2009年1月4日)


  ◎A1が属する週の木曜日=A1の直前の日曜日4日後
   (直前の日曜日:上記WEEKDAY関数のポイントにある表参照)

=A1-WEEKDAY(A1-1)+4 ( 2009年12月31日=40178)

=A1-WEEKDAY(A1,2)+4 ( 2009年12月31日=40178)


  ◎A1が属する週の木曜日の年

=YEAR(A1-WEEKDAY(A1-1)+4) ( YEAR(40178)=2009)

=YEAR(A1-WEEKDAY(A1,2)+4) ( YEAR(40178)=2009)



 ●その年の1月4日が含まれる週=Week 1の、月曜日何日か?
  ◎1月4日が属する週の月曜日は、12/29~1/4の7日間のうち、何れかで、
   =1月4日の直前の日曜日1日後
   =1月5日の直前の月曜日      という式になります。

=DATE(YEAR(A1-WEEKDAY(A1-1)+4),1,4) -WEEKDAY(DATE(YEAR(A1-WEEKDAY(A1-1)+4),1,4)-1)+1

=DATE(YEAR(A1-WEEKDAY(A1-1)+4),1,5) -WEEKDAY(DATE(YEAR(A1-WEEKDAY(A1-1)+4),1,3))

( =39818-WEEKDAY(39816)=39818-7=39811

  2009年12月29日)


=DATE(YEAR(A1-WEEKDAY(A1,2)+4),1,4) -WEEKDAY(DATE(YEAR(A1-WEEKDAY(A1,2)+4),1,4),2)+1

=DATE(YEAR(A1-WEEKDAY(A1,2)+4),1,5) -WEEKDAY(DATE(YEAR(A1-WEEKDAY(A1,2)+4),1,4),2)

( =39818-WEEKDAY(39817,2)=39818-7=39811

  2009年12月29日)

  


(3) Week 1月曜日から変換したい日までの日数7で割り、
 小数点以下を切り捨てるとWeek 1のとき0になるので、1を足します。

=1+INT((A1-(DATE(YEAR(A1-WEEKDAY(A1-1)+4),1,5) -WEEKDAY(DATE(YEAR(A1-WEEKDAY(A1-1)+4),1,3))))/7)

=1+INT((A1-DATE(YEAR(A1-WEEKDAY(A1-1)+4),1,5) +WEEKDAY(DATE(YEAR(A1-WEEKDAY(A1-1)+4),1,3)))/7)

( =1+INT((40180-39818+7)/7)=1+INT(369/7) =1+INT(52.7...)=1+52=53 : Week 53)


=1+INT((A1-(DATE(YEAR(A1-WEEKDAY(A1,2)+4),1,5) -WEEKDAY(DATE(YEAR(A1-WEEKDAY(A1,2)+4),1,4),2)))/7)

=1+INT((A1-DATE(YEAR(A1-WEEKDAY(A1,2)+4),1,5) +WEEKDAY(DATE(YEAR(A1-WEEKDAY(A1,2)+4),1,4),2))/7)

( =1+INT((40180-39818+7)/7)=1+INT(369/7) =1+INT(52.7...)=1+52=53 : Week 53)


 2010年1月2日(土) は、Week 53 でした。



2 曜日基準システムの考え方

変換したい日と同じ年の1月1日が属する週における、
 週の始まりの日 (日曜始まりなら日曜日の日付) が、
 12月26~1月1日何日か?を算出し、
 始まりの日から変換したい日までの日数7で割り、
 小数点以下を切り捨てると、
  Week 1は、0 となり、1を足すと、Week 1に、
  Week 2は、1 となり、1を足すと、Week 2に
   ・・・
 と言う具合で、週番号を算出します。


(1) A1:変換したい年月日のあるセル (例として 2010年1月6日(水)=40184 を使います)

(2) A1と同じ年の1月1日が属する週における、
 週の始まりの日 (日曜始まりなら日曜日の日付) が、12月26~1月1日何日か?
 を計算します。

 週の始まりが曜日の場合は、
  =1月1日の直前の土曜日1日後
  =1月2日の直前の日曜日

 となるので、他の曜日を基準している場合も同様に考えると、
  =1月2日の直前の基準曜日

 となり、
  上記WEEKDAY関数のポイントにある表より
  (A1=1月2日)-WEEKDAY(B1,Type)

B1

Type

1 or 省略

2

A1 : 1月2日

直前の土曜日

直前の日曜日

A1-1 : 1月1日

直前の日曜日

直前の月曜日

A1-2 : 1月0日 (12/31)

直前の月曜日

直前の火曜日

A1+4 : 1月6日

直前の火曜日

直前の水曜日

A1+3 : 1月5日

直前の水曜日

直前の木曜日

A1+2 : 1月4日

直前の木曜日

直前の金曜日

A1+1 : 1月3日

直前の金曜日

直前の土曜日

  となるため、
  各基準となる曜日における週の始まりの日は、以下の表のようになります。

週の始まりの曜日

Type

週の始まりの日の算出式



日曜日

1 or

省略

=DATE(YEAR(A1),1,2)-WEEKDAY(DATE(YEAR(A1),1,1))

( =40180-WEEKDAY(40179)=40180-6=40173

  2009年12月27日)

2

=DATE(YEAR(A1),1,2)-WEEKDAY(DATE(YEAR(A1),1,2),2)

( =40180-WEEKDAY(40180,2)=40180-6=40173

  2009年12月27日)

月曜日

1 or

省略

=DATE(YEAR(A1),1,2)-WEEKDAY(DATE(YEAR(A1),1,0))

( =40180-WEEKDAY(40178)=40180-5=40174

  2009年12月28日)

2

=DATE(YEAR(A1),1,2)-WEEKDAY(DATE(YEAR(A1),1,1),2)

( =40180-WEEKDAY(40179,2)=40180-5=40174

  2009年12月28日)

火曜日

1 or

省略

=DATE(YEAR(A1),1,2)-WEEKDAY(DATE(YEAR(A1),1,6))

( =40180-WEEKDAY(40177)=40180-4=40175

  2009年12月29日)

2

=DATE(YEAR(A1),1,2)-WEEKDAY(DATE(YEAR(A1),1,0),2)

( =40180-WEEKDAY(40178,2)=40180-4=40175

  2009年12月29日)

水曜日

1 or

省略

=DATE(YEAR(A1),1,2)-WEEKDAY(DATE(YEAR(A1),1,5))

( =40180-WEEKDAY(40176)=40180-3=40176

  2009年12月30日)

2

=DATE(YEAR(A1),1,2)-WEEKDAY(DATE(YEAR(A1),1,6),2)

( =40180-WEEKDAY(40177,2)=40180-3=40176

  2009年12月30日)

木曜日

1 or

省略

=DATE(YEAR(A1),1,2)-WEEKDAY(DATE(YEAR(A1),1,4))

( =40180-WEEKDAY(40175)=40180-2=40177

  2009年12月31日)

2

=DATE(YEAR(A1),1,2)-WEEKDAY(DATE(YEAR(A1),1,5),2)

( =40180-WEEKDAY(40176,2)=40180-2=40177
  2009年12月31日)


金曜日

1 or

省略

=DATE(YEAR(A1),1,2)-WEEKDAY(DATE(YEAR(A1),1,3))

( =40180-WEEKDAY(40174)=40180-1=40178

  2010年1月1日)

2

=DATE(YEAR(A1),1,2)-WEEKDAY(DATE(YEAR(A1),1,4),2)

( =40180-WEEKDAY(40175,2)=40180-1=40178

  2010年1月1日)

土曜日

1 or

省略

=DATE(YEAR(A1),1,2)-WEEKDAY(DATE(YEAR(A1),1,2))

( =40180-WEEKDAY(40180)=40180-7=40173

  2009年12月26日)

2

=DATE(YEAR(A1),1,2)-WEEKDAY(DATE(YEAR(A1),1,3),2)

( =40180-WEEKDAY(40174,2)=40180-7=40173

  2009年12月26日)



(3) 各基準となる曜日における週の始まりの日から変換したい日までの日数7で割り、
 小数点以下を切り捨てるとWeek 1のとき0になるので、1を足します。

 <WEEKDAY関数で、Type=1 or 省略 を使った場合>

=1+INT((A1-DATE(YEAR(A1),1,2) +WEEKDAY(DATE(YEAR(A1),1,1)))/7)
月=1+INT((A1-DATE(YEAR(A1),1,2) +WEEKDAY(DATE(YEAR(A1),1,0)))/7)
火=1+INT((A1-DATE(YEAR(A1),1,2) +WEEKDAY(DATE(YEAR(A1),1,6)))/7)
水=1+INT((A1-DATE(YEAR(A1),1,2) +WEEKDAY(DATE(YEAR(A1),1,5)))/7)
木=1+INT((A1-DATE(YEAR(A1),1,2) +WEEKDAY(DATE(YEAR(A1),1,4)))/7)
金=1+INT((A1-DATE(YEAR(A1),1,2) +WEEKDAY(DATE(YEAR(A1),1,3)))/7)
=1+INT((A1-DATE(YEAR(A1),1,2) +WEEKDAY(DATE(YEAR(A1),1,2)))/7)


 <WEEKDAY関数で、Type=2 を使った場合>

=1+INT((A1-DATE(YEAR(A1),1,2) +WEEKDAY(DATE(YEAR(A1),1,2),2))/7)
月=1+INT((A1-DATE(YEAR(A1),1,2) +WEEKDAY(DATE(YEAR(A1),1,1),2))/7)
火=1+INT((A1-DATE(YEAR(A1),1,2) +WEEKDAY(DATE(YEAR(A1),1,0),2))/7)
水=1+INT((A1-DATE(YEAR(A1),1,2) +WEEKDAY(DATE(YEAR(A1),1,6),2))/7)
木=1+INT((A1-DATE(YEAR(A1),1,2) +WEEKDAY(DATE(YEAR(A1),1,5),2))/7)
金=1+INT((A1-DATE(YEAR(A1),1,2) +WEEKDAY(DATE(YEAR(A1),1,4),2))/7)
=1+INT((A1-DATE(YEAR(A1),1,2) +WEEKDAY(DATE(YEAR(A1),1,3),2))/7)




3 単純週番号システムの考え方

変換したい日と同じ年の1月1日から

変換したい日までの日数7で割り、
 小数点以下を切り捨てると、
  Week 1は、0 となり、1を足すと、Week 1に、
  Week 2は、1 となり、1を足すと、Week 2に
   ・・・
 と言う具合で、週番号を算出します。

システム

週の始まりの曜日

算出式

単純週番号

11日の曜日

=1+INT((A1-DATE(YEAR(A1),1,1))/7)


 通常日本で使う日曜始まりや月曜始まりの月間カレンダーでは
 週の途中で、週番号が変わることになります。