エクセルで年と月から日付と曜日を出す方法(DATE・EOMONTH・曜日表示)【LibreOfficeで計算して確認】
月が変わるたびに、シフト表の日付と曜日を手で打ち直していないでしょうか。この記事では、年と月を入れるだけで、その月の日付と曜日を自動で出す式を、実際に計算して確かめた結果だけで紹介します。
出典: 筆者がLibreOfficeで計算して確認(検証スクリプト: site/verify/date_weekday.py)。外部サイトの説明は参照していません。Excelでは未確認です。使うのは基本的な関数ですが、本番の表に使う前に、何か月分かで結果を確かめてください。
先に結論
- A2に年(例: 2026)、B2に月(例: 10)を入れます。
- その月の1日は
=DATE(A2,B2,1)です。 - 2日目以降は、前のセルに1を足します。
- 月末日は
=EOMONTH(その月の1日,0)で出ます。日数は=DAY(月末日)です。 - 曜日は
=CHOOSE(WEEKDAY(日付),"日","月","火","水","木","金","土")で、書式設定に頼らず文字として出せます。 - 月に31日が無い月は、29日〜31日のセルを
=IF(前の日付+1の月が同じ月,前の日付+1,"")の形で空欄にします。
日付を並べる式
C2に1日目を入れ、D2以降は1日ずつ足します。
C2: =DATE($A$2,$B$2,1)
D2: =IF(C2="","",IF(MONTH(C2+1)=$B$2,C2+1,""))
D2の式は、「前のセルが空欄なら空欄」「翌日がまだ同じ月なら翌日」「月が変わったら空欄」と判断します。D2をそのまま右へ31日分コピーすれば、30日の月は31日目が、2月は29〜31日目が空欄になります。
実際に計算した結果
次の10か月で、1日・月末日・日数・曜日・15日・31日目を計算しました(月末日の表の日付は、書式を「日付」にした場合の表示です)。
| 年月 | 月末日 | 日数 | 1日の曜日 | 末日の曜日 | 31日目 |
|---|---|---|---|---|---|
| 2024年2月 | 2024-02-29 | 29 | 木 | 木 | (空) |
| 2023年2月 | 2023-02-28 | 28 | 水 | 火 | (空) |
| 2026年10月 | 2026-10-31 | 31 | 木 | 土 | 2026-10-31 |
| 2026年12月 | 2026-12-31 | 31 | 火 | 木 | 2026-12-31 |
| 2025年1月 | 2025-01-31 | 31 | 水 | 金 | 2025-01-31 |
| 2100年2月 | 2100-02-28 | 28 | 月 | 日 | (空) |
| 2000年2月 | 2000-02-29 | 29 | 火 | 火 | (空) |
| 2026年4月 | 2026-04-30 | 30 | 水 | 木 | (空) |
| 2027年3月 | 2027-03-31 | 31 | 月 | 水 | 2027-03-31 |
| 2028年2月 | 2028-02-29 | 29 | 火 | 火 | (空) |
10か月×7項目の70件すべて、Pythonの標準ライブラリで求めた期待値と一致しました。ポイントは次の3つです。
- うるう年の判断は、DATEとEOMONTHに任せて大丈夫でした。 2024年・2000年・2028年の2月は29日、2023年・2100年の2月は28日と出ました(2100年は4で割り切れても平年です)。自分で「4年に1度」の判定式を書く必要はありませんでした。
- 31日目の式は、月が30日以下のとき空欄になりました。 2026年4月(30日)と各年の2月で、空欄になることを確認しています。
- EOMONTHの結果は、書式を設定しないと数字(シリアル値)で出ます。 今回の検証でも、書式を付けない状態では「45351」のような数字が返りました。セルの書式を「日付」にしてください。ここでつまずく人が多いはずです。
曜日を出す2つの方法
曜日の出し方は2つあります。
方法1(文字として出す): =CHOOSE(WEEKDAY(C2),"日","月","火","水","木","金","土")
方法2(表示だけ変える): 日付のセルの書式を「aaa」にする
方法1は、結果が文字なので、あとから =IF(C3="土",...) のように曜日で判定できます。方法2は、セルの中身は日付のままで、見た目だけ曜日になります。今回の検証で確かめたのは方法1の式です。方法2の書式「aaa」は、この記事では検証していません。
注意点: この式ができないこと
- 祝日は判定しません。祝日の一覧を別に用意して照合する形になりますが、その一覧は祝日の改正で変わるため、この記事では扱いません。
- 土日の列に自動で色を付ける設定(条件付き書式)は、この記事では検証していません。
- 西暦以外(和暦)の表示は扱いません。
- 月の途中で締める(20日締めなど)の表は、式を変える必要があります。
シフト表のひな形が必要なら
この記事の式は、自分で作った表にそのまま使えます。年月を入れるだけで日付と曜日が自動で入るひな形を探しているなら、運営者が作った月間シフト表(Excelテンプレート・500円)があります。A4横1枚で印刷でき、15人まで入ります。ただし、祝日の判定は入っていません。Excelの確認はWindowsデスクトップ版16のみです。この記事の方法で足りる場合は、買う必要はありません。
関連して、日数の差や勤務時間を計算したいときは、無料の勤務時間の計算ツールも使えます(入力は外部に送信されません)。出勤人数を数える方法はシフト表で日ごとの出勤人数を数える方法にまとめています。
まとめ
- 1日は
=DATE(年,月,1)、月末は=EOMONTH(1日,0) - 2日目以降は前のセル+1。月が変わったら空欄にする式で、28〜31日を1本の式で済ませる
- うるう年の判定は自分で書かず、DATE・EOMONTHに任せる(2024・2000・2028は29日、2023・2100は28日と確認)
- EOMONTHの結果は書式を「日付」にする
- 式はいずれもLibreOfficeで計算した結果。Excelでは未確認のため、本番の表に使う前に数か月分で確かめる
参考にした情報
- 出典: 筆者がLibreOfficeで計算して確認(検証スクリプト: site/verify/date_weekday.py)