見出し画像

[EXCEL] 日程表作成レッスン6 週番号を表示する

目次 > 入力 > 日付 関連記事:日付と時間



【まとめ】
こんな日程表を作ってみます。1年分が1シートになっています。

主な特徴(仕様と作成内容が混在していますがご寛恕ください)
1 各日3行。ただし、日付表示は冒頭行だけ。
2 日付・曜日は自動表示
3 土日に色付け(土日同色。日付欄以外にも色付け)
4 閉庁日(祝日等)に色付け(土日とは異色)
  *事前に閉庁日リストを作成
5 1年分の枠を一気に作成
6 週番号を表示・・・今回はここ
7 開始と終了時間の欄を作る

*必ずしも上の順番である必要はないが、上の順番だと手戻りが少ない(はず)。


【説明】
過去記事で、日程表の作り方について順次掲載していくといいましたが、その第6回です。

前回までで作成したのがこんな表です。

一番左のA列の連番は、これまで作った欄を、365日分(正しくは363日分)、一気に作成するためのものでした。
今度は、このA列に「週番号」を入れていきます。
週番号とは、初日がある日を第1週として、各日が初日から数えて第何週目に属しているか、を示すものです。
1年は通常365日なので、365÷7=52.14・・・。
つまり、1年間は概ね52週あることになります。
その週が1年間の何週目であるかで、「現在位置」を知ることができ、今後の業務のスケジュール感醸成にも役立ちます。
なお、日付とは違うので、この「週番号」は必須ではありません。
私はあった方が「現在位置」が分かって便利だと思いますが、そこはお好みでどうぞ。


ここでは、
・1週間は月曜始まりとする(ISO/JIS準拠。単に私の好み。)
・初日以降の月曜日から第2週とする。仮に4/1が日曜日なら、4/2の月曜日から第2週とする(単にシンプルにしたいだけ)。

では、どうやっていくか? 順に示します。

1 4/1の左(A列)の計算式を消す。
現在、A3セルには以下の数式が入っています。
=SEQUENCE(365*3)
これは、1日3行を365日分作るために付けた連番をつくるためのものでした。

もう必要ないので、A3セルの数式を消します(DEL)
すると、A列の連番が全て消えます。

もともとA3セルの数式が「スピル」機能によりA4以下のセルに「溢れて(=スピル)」いたためです(A4以下のセルには数式は入っていなかった)。
なお、SEQUENCE関数以外で、A列に連番を入れている場合(=各セルに実際に番号が入っている場合)は、A列全体を範囲指定してから削除すれば同じことになります。

2 A3セルに以下の数式を入れる。
=INT((B3-($B$3-WEEKDAY($B$3,3)))/7)+1

B3は、初日(4/1)が入っているセルです。
「$B$3」はコピーしても列も行も変わらない「絶対参照」、
「B3」セルはコピーすれば列も列もずれて変わっていく「相対参照」です。

数式を入れて、もし「1月1日」等の日付形式で表示されたら、
Ctrl+Shift+^ で、標準の書式に戻します(1と出るはず)。

列幅が広がったら、アホイ( Alt ⇒ H ⇒ O ⇒ I )で自動調整します。

3 セルの右下にカーソルを合わせ、「+」が出たらダブルクリック
⇒ フラッシュフィルにより、A3セルより下のセルに同じ数式が入ります。

第2週の4月7日(月)からは「2」となります。

念のため、日程表の最後を見てみると、最終週である53が入っているのが分かります(1年は52週ですが、この場合、第1週が7日間無いため、53週目が発生しています)。


これで、週番号が入りました。
以上で、日程表の作成は終了です。


といいたところですが、なぜ以下の式で週番号が入るか、説明します。
=INT((B3 - ($B$3 - WEEKDAY($B$3,2) + 1)) / 7) + 1

通常の「週数」(1/1始まり)なら「=WEEKNUM(日付)」あるいは「=ISOWEEKNUM(日付)」で出ます(前者は日曜始まり、後者は月曜始まり)。
しかし、今回は4月1日始まりなので、これらは使えません。
そのため、やや複雑な数式になりましたが、初日が4/1でなくても、週数を出すことができます。
数式の作成は、Copilotとのやり取りをしながら行いました。
WEEKNUMから始まって、結構何度もやり取りしました。

週番号算出の考え方(月曜始まりの場合)

初日の「直前の月曜日」と「該当の日付」の日数差を7で割り(=週数が出る)、初日の週数(=1)に足す。


手作業でもできますが・・・

週番号は、第1週が「1」で、次の月曜日が来たら「2」になります(月曜始まりの場合)。
なので、最初の週には「1」を手入力して、その後の月曜日に「=上のセル+1」、それ以下のセル(日曜まで)には「=上のセル」とし、それを下まで貼り付けていけば、自動で週番号を表示できます。
でも、手作業は面倒。
行削除等によっても数式が変わってしまうおそれもあります(日付と違って週番号が多少違っていても影響は少ないでしょうけど)。
なので、日付から週番号を出すことを考えます。

日付から週番号を出す数式

初日(4/1火)を1とすると、週番号は7日ごとに1増えます。
4/1+7日後=4/8(第2週)
4/1+14日後=4/15(第3週)

ということは・・・
①「該当の日付」から初日を引き、「該当の日付」と「初日」の間の日数を出し、
②それを7で割ると、「初日」から「該当の日付」までの週数が出ます。
③その週数を1に足せば、「該当の日付」の週番号が出ます。

① 4/1-4/15=14日 
② 14÷7=2
③ 第1週+2=第3週
「初日」が何曜日でも、翌週の同じ曜日で週番号が変わっていくなら、これで構いません。

しかし、今回は「月曜始まり」です。
「初日」が何曜日であっても、月曜日になったら週番号が1つ増える、という式にする必要があります。
これをどう考えるか?

一番楽なのは、「初日」の週の月曜日がいつか?を調べることです。
つまり「初日の直前の月曜日」がいつか、です。
「初日の直前の月曜日」が分かれば、「初日の直前の月曜日の日付」と「該当の日付」の間の日数を数え、それを7で割って「第1週」に足せば、「日付」の週数が出るはずです。

初日の直前の月曜日を調べる

ある曜日から〇日分遡れば月曜日になるかを考えます。
これは、曜日が分かれば簡単です。
火曜日なら1日、水曜日なら2日、木曜なら3日・・・日曜日なら6日遡れば、その週の月曜日になります。
これは、4/1が初日でなくても同じです。

「初日」の曜日は =WEEKDAY(初日セル,〇)で数値化できます。
〇が1だと、日曜始まり(日=1,月=2、火=3、、、土=7)
〇が2だと、月曜始まり(月=1、火=2,水=3、、、日=7)
〇が3だと、同じく月曜始まりですが、月=0、火=1,水=2、、、日=6となります。

今回は =WEEKDAY(初日,3) とします。
すると、初日から、WEEKDAY(初日,3)で曜日を数値化して引くと、「初日の直前の月曜日」の日付が出ます。
つまり =初日-WEEKDAY(初日,3)
で、「初日の直前の月曜日」の日付が出ます。

これは、初日がいつであっても(4/1でなくても)、算出可能です。

これで、「初日の直前の月曜日」の日付が出ました。

次に
「該当の日付」と「初日の直近の月曜日の日付」の日数差を出します。
数式は
=該当の日付-(初日-WEEKDAY(初日,3))
となります。
この日数差を7(1週間)で割り、小数点以下を切り捨てにすれば「該当の日付」が初日から第何週になるか、わかります。

=(該当の日付-(初日-WEEKDAY(初日,3)))/7 を、INT関数で整数化します。
つまり、
=INT((該当の日付-(初日-WEEKDAY(初日,3)))/7)となります。
*INTのトジカッコは7の後ろに来ます。

しかし、第1週の場合、
「該当の日付」と「(初日-WEEKDAY(初日,3)」は、6以下になります。
7で割ると「1」より小さくなり、INTで整数化すると「0」になります。
第1週目の週番号は「1」ですので(当たり前)、数式に「+1」としt、第1週目の各日の答えが「1」となるようにします。
当然、第2週目は「2」となります。

数式の整理

分かりづらいかもしれませんが、下の通り整理してみました。

①曜日を数値化
=WEEKDAY(日付セル,3)
*月曜:0、火曜:1、水曜:2、木曜:3・・・日曜:6

②直前の月曜日の日付を出す
=初日セル - WEEKDAY(日付セル,3)

③ 該当の日付と直前の月曜日の日数差を出す
= 該当の日付のセル-(初日セル - WEEKDAY(日付セル,3))
*該当の日付が第1週の場合、答えは7より小さくなる(最大で6だから)

④日数差を7で割る(初日と該当の日付の週数が出る)
= (該当の日付のセル-(初日セル - WEEKDAY(日付セル,3))/7
*全体を7で割るので、カッコで括っておく
*第1週の各日は1より小さい数値となる(最大で6÷7だから)

⑤日数差を7で割ったものを整数化(小数点以下切り捨て)
=INT( (該当の日付のセル-(初日セル - WEEKDAY(日付セル,3))/7)
*7で割った多数値を整数化するので、全体をカッコで括る
*第1週の各日は0となる(最大で6÷7だから)

⑥ 初週を1とするために、1を足す
=INT( (該当の日付のセル-(初日セル - WEEKDAY(日付セル,3))/7)+1


なお、WEEKDAY関数は、レッスン3でも使いました。
[EXCEL] 日程表作成レッスン3 土日に色を付ける(土日同色)
この時は、「条件付き書式」の中に
=WEEKDAY(セルの日付,2)>5 
という数式を入れて、「セルの日付の曜日を数値化したもの >5」「土(=6)」「日(=7)」なら、色を付ける、という条件にしました。
これは、今回の
=WEEKDAY(セルの日付,3) 
とは、後ろの数値(引数)が、2と3で異なります。
ここで混乱が起きるようでしたら、今回のものを
=WEEKDAY(セルの日付,2)
とする方法もあります。
この場合、全体の数式は以下の通りとなります。
=INT((B3 - ($B$3-WEEKDAY($B$3,2) +1)) / 7) +1

=WEEKDAY(セルの日付,2) は
=WEEKDAY(セルの日付,3) に対して、
曜日化を数値すると1つ小さくなります。
月曜:0⇒1、火曜:1⇒2
そのため、「初日の日付から、初日の曜日を数値化した数値」を引くと、1小さくなるため、
($B$3-WEEKDAY($B$3,2) +1)
と、1を足します。

全体の数式としては
=WEEKDAY(セルの日付,3) の方が判りやすい(でもわかりづらい)と思いますが、
同じファイル内の同じ関数で違いが出て混乱するなら、
=WEEKDAY(セルの日付,2)を使ってもいいでしょう。 

数式を段階的に構成していくと、以下の通りとなります。


以上で、「日程表作成」は終了です。
次回は、ちょっと「おまけ」を記載します。
こんな風に開始と終了時間を入れる欄を作ってみます。


いいなと思ったら応援しよう!