はじめに
今日、仕事で使おうとしたときに
時間がないのでMicrosoftのGPT-4に式を聞いたんですけど嘘つかれました。
結局自分で考えました。たまに詰めが甘いコード出すよねあの子…
様々な方法が別サイトに載っているなか記事を書いた理由ですが、
MOD関数を用いた求め方が全然見当たらないためです。
ざっくり説明
ちょっとタイトルが分かりづらいけど
「第2月曜日」とか「第4木曜日」とかそういう類のものです。
予備知識
エクセルのWEEKDAY関数は日付からそれに対応する数字を返す関数です。
第一引数は日付を、第二引数は数字を渡します。
第二引数の数字によって何曜日をどの数字に対応させるかを指示します
第二引数 | 日曜 | 月曜 | 火曜 | 水曜 | 木曜 | 金曜 | 土曜 |
---|---|---|---|---|---|---|---|
1 (省略時) | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
2 | 7 | 1 | 2 | 3 | 4 | 5 | 6 |
3 | 6 | 0 | 1 | 2 | 3 | 4 | 5 |
11 | 7 | 1 | 2 | 3 | 4 | 5 | 6 |
12 | 6 | 7 | 1 | 2 | 3 | 4 | 5 |
13 | 5 | 6 | 7 | 1 | 2 | 3 | 4 |
14 | 4 | 5 | 6 | 7 | 1 | 2 | 3 |
15 | 3 | 4 | 5 | 6 | 7 | 1 | 2 |
16 | 2 | 3 | 4 | 5 | 6 | 7 | 1 |
17 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
今回は一番オーソドックスな第二引数を 1 として式を書いています。
使用方法/関数(1)
A1セル:求めたい月の初日のシリアル値(「2024/8/1」など)
A2セル:第◯週(第2週 → 「2」)
A3セル:✕曜日(水曜日 → 「4」)
=A1+(A2-1)*7+MOD(A3-WEEKDAY(A1,1),7)
使用方法/関数(2)
A1セル:求めたい月のいずれかの日のシリアル値(「2024/8/24」など)
A2セル:第◯週(第2週 → 「2」)
A3セル:✕曜日(水曜日 → 「4」)
A1
をDATE(YEAR(A1),MONTH(A1),1)
に置き換えました。
=DATE(YEAR(A1),MONTH(A1),1)+(B1-1)*7+MOD(C1-WEEKDAY(DATE(YEAR(A1),MONTH(A1),1)),7)
使用方法/関数(3)
B1セル:求めたい年(「2024 (文字列可)」など)
B2セル:求めたい月(「8 (文字列可)」など)
A2セル:第◯週(第2週 → 「2」)
A3セル:✕曜日(水曜日 → 「4」)
DATE(YEAR(A1),MONTH(A1),1)
の"年"と"月"を個別に指定したい場合こちらです。
etc DATE("2024","8",1)
=DATE(B1,B2,1)+(A2-1)*7+MOD(A3-WEEKDAY(DATE(B1,B2,1)),7)
仕様等
特になし
注意点
- (1)の式に月初日以外の日付を渡すと異常な値が返ってきます
その他
オマケなんですけど、日付から第◯ ✕曜日を求めるには
=CEILING(DAY(A1)/7, 1)
(第◯週)
=TEXT(A1, "aaa")
(✕曜日)
の組み合わせで実現できます。
A1セル:求めたい月のシリアル値(「2024/8/20」など)
="第" & CEILING(DAY(A1)/7, 1) & TEXT(A1, "aaa") & "曜日"
'もしくは
="第" & CEILING(DAY(A1)/7, 1) & TEXT(A1, "aaaa")
→ 「第2木曜日」「第3火曜日」のような出力がされます