« Excel for Mac でも VBA で日本語が使える。 | トップページ | Excel for Mac の VBE で変数の宣言を強制する。 »

Excel で第二月曜日は何日かを求める。

この記事は自分用の覚書です。
(Windows 10 Pro 64ビット + Excel2016 Office365 Business サブスクリプション  バージョン1810(ビルド11001.20074)

H.K さん。

ある月の第二月曜日は、何日になるかを求めるやり方です。
月曜日を対象にしていますが、何曜日であっても基本的な考え方、やり方は同じです。

日数や曜日を扱う計算については、インターネット上でたくさんの方々がいろいろな解説をしてくれています。

もっとわかりやすい説明があるかと思います。見つけたら私にも教えてくださいね。

考え方

以下、当たり前の話ですが大事なところなのであらためてふれておきます。

第二月曜日というのは、その月で二度目の月曜日です。
「ある日が二度目の月曜日」なのは、一度目の月曜日が過ぎてから初めておとずれた月曜日だからです。

一週間は七日あります。

ということは、「第一月曜日の日付(シリアル値)」がわかれば、それに 7 を足すと第二月曜日の日付を求めることができます。

たとえば、2018年11月なら、第一月曜日が 11月5日 だとわかれば、2018/11/5 + 7 の計算で、第二月曜日である 2018/11/12 を求めることができます。

そして、「ある日付が第一月曜日である」とわかるには、その月の「一日は何曜日か」がわからなければなりません。

一日が日曜日なら第一月曜日は翌日の2日だとわかります。
一日が火曜日なら第一月曜日は7日です。

「その月の一日の曜日」を求めることが最初にすることです。

「すること」を順番で並べると――

1.「その月の一日は何曜日か」を調べる。

2.1 の答えをもとに、「第一月曜日の日付(シリアル値)」を求める。

3.2 の答えである日付に 7 を足して「第二月曜日」を求める。

となります。

ちょっと話がそれますが、曜日を考えるとき、横軸上に左から右に順に並んでいるものとしてイメージしませんか? 
日・月・火・水・木・金・土――このように曜日を捉えると、今回の処理は考えづらいかと思います。

曜日が円形につながっているものとして捉えると、今回の処理は考えやすいと私には思えました。

週の始めを日曜日からとしたほうが考えやすい人もいるでしょうし、月曜日からにしたほうが考えやすい人もいるでしょう。
一週間の曜日を円形に並べて捉えれば、どちらの考え方をする人でも、今回の処理は少しでも考えやすくなると思うのですが、どうでしょうか。

Shitiyou_2

その月の一日の曜日を 1 として時計回りに数えてください。

一日が日曜なら、日曜を 1 として時計回りに数えると、第一月曜日は2日です。一日が火曜なら、火曜を 1 として 2,3,4,5,6,7 と数えて第一月曜日は7日……というふうに。

一つひとつの処理を作業列に分けて行う。

話を元に戻します。上記の3つを一つのセルでやろうとすると、数式がネストされたややこしいものになってしまいます。

仕事でつくるファイルは、できるかぎり、誰が見てもわかりやすくつくるべきです。
そういう意味で、作業列を使って処理の過程を分けるのが望ましいです。作業列で過程を分ければ全体として何をしているかを理解しやすいです。

仕事でつくるファイルでは、ネストしなければならない具体的な理由がない場合は、数式のネストは避けるのが望ましいと私は思っています。

1.「その月の一日は何曜日か」を調べる。

全体としては、次の図のようにしてみました。

01dainangetuyoubi

A列からD列で、「その月の一日は何曜日か」を調べています。

C列では、DATE 関数で一日の日付をつくっています。
もともとは年と月しか入っていない表だということでしたので、そこからそれぞれの月の一日を求めています。

また、C列のセルの書式を yyyy/m/d(aaa) にして、何曜日であるかが見た目でもわかりやすいようにしてみました。

一日の日付をつくったら、何曜日かを求めます。それがD列です。

C列はセルの書式で曜日を表示していますが、書式は計算につかえる値にはなりません。
曜日を、計算で使える値にしてやる必要があります。

WEEKDAY 関数でそれができます。書式は次のようです。

WEEKDAY(シリアル値,[週の基準])

D列で使っている WEEKDAY 関数では、引数「週の基準」を省略しているので、日付が日曜だったら 1 を返します。

月曜なら 2 を、火曜は 3 というように返してきます。土曜なら 7 が返ってきます。
一週間の曜日を表す数字なので、返ってくる値は 1 から 7 までです。

・引数「週の基準」を省略した際に WEEKDAY 関数が返す値
日曜日→1
月曜日→2
火曜日→3
水曜日→4
木曜日→5
金曜日→6
土曜日→7

2.「第一月曜日の日付(シリアル値)」を求める。

一日が何曜日かを表す数字ができたので、それをもとに第一月曜日が何日かを求めます。
E列とF列でそれをやっています。

なお、図では、少しでもわかりやすくなるかと思って、E列にはセルの書式設定で「日」を表示するようにしてあります。

ここで、冒頭の円の図をもう一度見てみてください。
一日が何曜日かによって変わってくる「第一月曜日が何日か」の確認です。

一日が日曜だったら、時計回りに 1,2 と数えて第一月曜日は2日です。
一日が月曜なら第一月曜日は当日です。
一日が火曜なら第一月曜日は7日になります。
水曜なら6日です。
木曜なら5日です。
金曜なら4日です。
土曜なら3日です。

――というように、一日の曜日によって、第一月曜日が何日なのかが変わってきます。

どんな数式をつくればよいかというと、

WEEKDAY 関数が返す値が、

・ 1 (一日が日曜)なら 2 を返す。
・ 2 (一日が月曜)なら 1 を返す。
・ 3 (一日が火曜)なら 7 を返す。
・ 4 (一日が水曜)なら 6 を返す。
・ 5 (一日が木曜)なら 5 を返す。
・ 6 (一日が金曜)なら 4 を返す。
・ 7 (一日が土曜)なら 3 を返す。

ができればいいわけです。
返ってきた値が、第一月曜日は何日かを示しています。

02dainangetuyoubi

Office365サブスクリプションの Excel2016 には、こういうときに最適な関数が実装されています。 SWITCH 関数です。

円の次の図では、セル E2 にはこういう数式が入っています。

=SWITCH(D2,1,2,2,1,3,7,4,6,5,5,6,4,7,3)

SWITCH 関数の書式は次のようです。

SWITCH(式, value1, result1, [既定値または value2, result2],…[既定値または value3, result3])

SWITCH 関数は、(式と呼ばれる) 1 つの値に対して値の一覧を評価し、最初に一致する値に対応する結果を返します。
(出典:Excel「ヘルプ」)

上記の式でいうと、( )のなかで最初は D2,1,2, になっています。
D2 の値が 1 の場合は、2 を返すという指定です。

その月の一日が日曜(D2 が 1)なら、第一月曜日は2日ということです。

その次を見ると、D2,1,2,2,1, になっていますから、一日が月曜(D2 が 2)なら、返す値は 1 です。当日が月曜なので。

その次は、3,7 が続きます。一日が火曜(D2 が 3)なら 7 を返します。第一月曜日は7日です。

そうやって残りも、4 なら 6、5 なら 5 、6 なら 4 、7 なら 3 を返すというように指定しています。

実際には、E列のセルは次のように入力しています。
2行目以降ではスペースを入れて頭をそろえています。

=SWITCH(D2,1,2,
                   2,1,
                   3,7,
                   4,6,
                   5,5,
                   6,4,
                   7,3)

こうしておけば、「(D2が)1 なら 2 を返す、2 なら 1 を返す、3 なら 7 を返す……」といった組み合わせが理解しやすいですよね。

03dainangetuyoubi_switch

なお、Office365サブスクリプションではない Excel では、CHOOSE 関数で対応できます。

CHOOSE 関数の数式は、

=CHOOSE(D2,2,1,7,6,5,4,3)

となります。

D2 に入るのは、1 から 7 です。
2,1,7,6,5,4,3 の部分は、D2 の値によって返す順番に並べています。

D2 が 1 なら、2 を返します。(並びの一番目を返す)
D2 が 2 なら、1 を返します。(並びの二番目を返す)
D2 が 3 なら、7 を返します。(並びの三番目を返す)……

書き方が違うだけで、 SWITCH 関数も CHOOSE 関数も結果は同じです。

IF 関数でも可能ですがお勧めしません。その理由は想像すればわかりますよね。
「IF 関数ならこうなります」という例を作ろうとしたくもありません。かなり面倒です。

=IF(D2=1,2,IF(D2=2,1,""))

2つだけやってみました。2つ目のIFを入力したときにもうやりたくなくなりました。

E列で第一月曜日は何日なのかがわかったので、それをもとにF列では、 DATE 関数で第一月曜日の日付をつくっています。

3.第一月曜日の日付に 7 を足して「第二月曜日」を求める。

G列が第二月曜日の日付です。
F列の第一月曜日の日付に 7 を足しています。

F列の時点で、 =DATE(A2,B2,E2)+7 というように 7 を足せば、F列で第二月曜日を求められますが、ここでは、「第一月曜日の日付(シリアル値)がわかれば、それに 7 を足すことで第二月曜日を求めることができる」という思考の過程がよりわかりやすいように分けてみました。

これで作業終了です。
こうやって作業列で処理を分けると全体で何をやっているかが理解しやすくないですか。

仕事でつくるファイルでは、作業列を積極的に使ってください。

別の曜日について

なお、別の曜日でも考え方は同じです。
違ってくるのは、この例でいうなら SWITCH 関数の引数です。

また、第三○曜や第四○曜日を求めるには、第一月曜日の日付に 7 を足して第二月曜日を求めたように、処理を分けて 7 を足していけばいいです。

|

« Excel for Mac でも VBA で日本語が使える。 | トップページ | Excel for Mac の VBE で変数の宣言を強制する。 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: Excel で第二月曜日は何日かを求める。:

« Excel for Mac でも VBA で日本語が使える。 | トップページ | Excel for Mac の VBE で変数の宣言を強制する。 »