毎年この時期になると、カレンダーを作り直していませんか。
去年のファイルを開いて、日付を打ち直して、曜日をずらして、土日の色を塗り直す。やってみると意外と時間がかかるうえに、どこか1マスだけ微妙にずれている。あとから気づいて直す、あれが地味に嫌なんですよね。
正直に言うと、僕も最初に作ったカレンダーは、なかなかひどい仕上がりでした。
今日ご紹介するのは、年と月のセルを変えるだけで、中身が全部入れ替わるカレンダーです。日付も曜日も自動。土曜は青、日曜は赤、祝日にも自動で色が付きます。一度作ってしまえば、来年もそのまま使えます。
使う関数は4つだけです。
- SEQUENCE関数 … 日付を42マス分、一気に並べる
- DATE関数 … 「その月の1日」を作る
- WEEKDAY関数 … 1日が何曜日かを調べる(この記事の山場です)
- COUNTIF関数 … 祝日リストと照らし合わせる
聞いたことがない関数があっても大丈夫です。1つずつ、何をしているかから説明していきます。
先にお伝えしておくことが2つあります。
1つ目。SEQUENCE関数はExcel 2021以降で使えます。それより古いバージョンでは、この作り方は使えません。お使いのExcelで =SEQUENCE( と打ってみて、候補に出てこなければ非対応です。
2つ目。祝日だけは、自動では取ってこられません。祝日は年によって日付が変わりますし、ハッピーマンデーのように「◯月の第2月曜日」という決まり方をするものもあって、計算がかなり複雑になります。この記事では、祝日の一覧を別シートに用意しておく方式にします。年に1回だけ更新すれば済むので、こちらのほうが現実的です。
完成形と、準備するもの
作るのは、こういうカレンダーです。
- A1セルに年(例:2026)
- B1セルに月(例:8)
- この2つを書き換えると、下のカレンダーが丸ごと切り替わる
シートの構成はこうします。
| 場所 | 入れるもの |
|---|---|
| A1 | 年(2026) |
| B1 | 月(8) |
| A2〜G2 | 曜日の見出し(日 月 火 水 木 金 土) |
| A3〜G8 | カレンダー本体(ここに数式を1つ入れます) |
カレンダー本体が6行×7列=42マスなのには理由があります。1か月は最大31日ですが、1日が土曜日から始まると最後の週がはみ出してしまう。どんな月でも収まる大きさが6行なんです。
祝日用に、シートをもう1枚用意します。名前は「祝日」としておきましょう。A列に祝日の日付を、上から順に入れていくだけです。
ステップ1:SEQUENCE関数で42マスを埋める
まずはA3セルに、これを入れてみてください。
=SEQUENCE(6,7,1,1)
すると、1から42までの数字が6行7列に並びます。
SEQUENCE関数は「連続した数字を、指定した行数・列数で自動的に並べる」関数です。中身は次の4つです。
=SEQUENCE(行数, 列数, 開始する数, 増やす数)
今回は「6行、7列、1から始めて、1ずつ増やす」と指示しました。
ここで大事なのは、入力したのはA3セル1つだけという点です。42マス分の数字が、勝手に右と下へ広がっていきます。これをスピルと呼びます。1つの数式が複数のマスに答えを返してくれるので、コピーして貼り付ける作業がまるごと要りません。
さて、並んだのはただの1〜42の数字です。これが日付になれば、カレンダーの形になりそうですよね。
ステップ2:DATE関数で「その月の1日」を作る
日付を作るのはDATE関数の仕事です。
=DATE(年, 月, 日)
A1に年、B1に月が入っていますから、その月の1日はこう書けます。
=DATE(A1,B1,1)
A1が2026、B1が8なら、2026年8月1日になります。年と月のセルを変えれば、この日付も自動で変わるわけです。ここがカレンダー全体の起点になります。
「じゃあ、さっきのSEQUENCEの開始する数を、この日付にすればいいのでは?」
そのとおりです。ただし、それだけではカレンダーになりません。
ステップ3:WEEKDAY関数で「1日は何曜日か」を調べる
カレンダーは、必ず日曜から始まる形で並んでいます。でも、その月の1日が日曜日とは限りません。
2026年8月1日は土曜日です。もし1日を左上のマスに置いてしまうと、日曜の列に土曜が入ることになり、全部ずれてしまいます。
そこで必要なのが「1日は何曜日なのか」という情報です。これを教えてくれるのがWEEKDAY関数です。
=WEEKDAY(日付, 種類)
WEEKDAY関数は、日付を入れると曜日を番号で返してくれます。「種類」に1を指定すると、次のようになります。
| 曜日 | 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|---|
| 番号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
試しに、どこか空いているセルに入れてみてください。
=WEEKDAY(DATE(A1,B1,1),1)
2026年8月なら 7(土曜日)が返ってきます。
ステップ4:左上のマスに来る日付を計算する(ここが山場)
ここがこの記事でいちばん大事なところです。
カレンダーの左上(A3セル)に入るのは、その月の1日ではなく、1日を含む週の日曜日です。8月1日が土曜なら、その週の日曜は7月26日。つまり左上には7月26日が入ります。
では、7月26日をどう計算するか。
1日から、曜日の番号を引いて、1を足す。これだけです。
=DATE(A1,B1,1) - WEEKDAY(DATE(A1,B1,1),1) + 1
なぜこれで合うのか、数字を追ってみます。
- 8月1日は土曜日 → WEEKDAYは 7
- 8月1日から7を引くと、7月25日(金曜日)
- そこに1を足すと、7月26日(日曜日)
日曜日のWEEKDAYは1です。1を引いて1を足せば元の位置に戻る——つまり1日が日曜日の月なら、左上はそのまま1日になります。どんな曜日から始まる月でも、この式ひとつで正しい日曜日にたどり着きます。
ここでよくある間違いを1つ。「1日が木曜なら4つ戻ればいい」と考えて、引く数を自分で決めてしまうやり方です。これだと月が変わるたびに数字を直すことになり、自動になりません。引く数はWEEKDAY関数に決めてもらう、というのがポイントです。
計算した日付を、ステップ1のSEQUENCEの「開始する数」に入れます。完成した数式がこちらです。
=SEQUENCE(6,7,DATE(A1,B1,1)-WEEKDAY(DATE(A1,B1,1),1)+1,1)
長く見えますが、やっていることは「左上の日曜から始めて、42日分を1日ずつ並べる」だけです。
ステップ5:表示形式を整えて、日にちだけを表示する
数式を入れると、46229のような5桁の数字が並んだはずです。故障ではありません。
Excelの日付は、1900年1月1日を1として数えた通し番号でできています。これをシリアル値と呼びます。見た目が日付になっているのは表示の設定のおかげで、中身はずっと数字なんです。
なので、表示の設定を切り替えてあげます。
- A3〜G8を選択する
- 表示形式を「日付」にする(ここで一度、2026/7/26のような形になります)
- もう一度表示形式を開いて「ユーザー定義」を選び、種類の欄に d とだけ入れる
d は「日にち」を表す記号です。年も月も消えて、26 のように日にちだけが残ります。これでカレンダーらしい見た目になりました。
ステップ6:その月以外の日を目立たなくする
見た目は整いましたが、まだ問題があります。左上の7月26日〜31日や、最後の週の9月の日付まで、同じ濃さで表示されています。8月のカレンダーなのに、7月と9月が紛れている状態です。
これを条件付き書式でグレーにします。
- A3〜G8を選択する
- 条件付き書式 → 新しいルール → 「数式を使用して、書式設定するセルを決定」
- 数式に次を入れる
=MONTH(A3)<>$B$1
- 書式でフォントの色をグレーにする
MONTH関数は、日付から「月」だけを取り出す関数です。<> は「等しくない」という意味。そのマスの月が、B1の月と違っていたらグレーにする、という指示になります。
数式に入れる A3 は、選択した範囲の左上のセルを書きます。あとはExcelが各マスに合わせてずらして判定してくれます。B1のほうは $B$1 と固定するのを忘れないでください。ここがずれると、正しく判定されません。
ステップ7:土曜を青、日曜を赤にする
ここでもう一度WEEKDAY関数の出番です。同じ手順で、ルールを2つ追加します。
土曜日(青)
=AND(WEEKDAY(A3,1)=7,MONTH(A3)=$B$1)
日曜日(赤)
=AND(WEEKDAY(A3,1)=1,MONTH(A3)=$B$1)
WEEKDAYが7なら土曜、1なら日曜。ここまではステップ3のとおりです。
問題は、AND関数のほうです。WEEKDAYの条件だけにすると、グレーにしたはずの先月・翌月の土日にまで色が付いてしまいます。そこで「かつ、その月であること」という条件を足しています。AND関数は「AもBも満たすとき」という意味です。
MONTH(A3)=$B$1——ステップ6で使った式と、ほとんど同じものが出てきましたね。同じ考え方を使い回しているだけです。
ステップ8:祝日に色を付ける
最後に祝日です。ここでCOUNTIF関数を使います。
COUNTIF関数は、本来「指定した範囲の中に、条件に合うものがいくつあるか」を数える関数です。
=COUNTIF(探す範囲, 探すもの)
ただ今回は、個数を知りたいわけではありません。知りたいのは「祝日リストの中に、このマスの日付があるかどうか」だけ。あれば1以上、なければ0が返ってくるので、0より大きければ祝日と判定できます。条件付き書式でCOUNTIFがよく使われるのは、この使い方ができるからです。
ルールを追加します。
=AND(COUNTIF(祝日!$A$2:$A$50,A3)>0,MONTH(A3)=$B$1)
書式は「赤の太字」にします。日曜の赤と区別したいので、太字を足しておくと分かりやすくなります。
範囲の 祝日!$A$2:$A$50 は、祝日シートのA2からA50までという意味です。ドルマークで固定するのを忘れないでください。固定しないと、マスごとに探す範囲がずれていってしまいます。行数はご自分のリストに合わせて調整してください。
ルールの順番についても、ひとこと。祝日が日曜と重なる年があります。条件付き書式は上にあるルールが優先されるので、祝日のルールを日曜より上に置いておくと、祝日の太字が勝ちます。順番は「条件付き書式 → ルールの管理」から入れ替えられます。
動かして確認する
準備ができました。B1セルの月を、8から9に変えてみてください。
日付が一斉に入れ替わり、曜日の位置がずれ、土日の色も付き直したはずです。年を変えれば、来年のカレンダーになります。
これが「年月を変えるだけ」のカレンダーです。あとはセルの幅と高さを整えたり、罫線や色を好みで足したりすれば、印刷して使えるものになります。
つまずきやすいところ
=SEQUENCE( を打っても候補に出てこない
Excel 2021より前のバージョンです。この方法は使えません。
#NAME? と表示された
関数名の打ち間違いか、そのバージョンに無い関数を使っています。SEQUENCEが原因のことが多いです。
#SPILL! と表示された
スピルで広がろうとした先に、すでに何か入っています。A3から下・右の42マスを空にしてから、もう一度入れてみてください。
日付が5桁の数字のまま
表示形式が「標準」に戻っています。ステップ5をもう一度。これは故障ではなく、Excelの日付が最初から数字だからです。
先月・翌月の日付にまで色が付く
条件付き書式のAND関数(MONTH(A3)=$B$1)が抜けています。
祝日に色が付かない
祝日シートの日付が「文字列」として入っている可能性があります。左詰めで表示されていたら文字列です。日付として入れ直してください。
まとめ
- 42マスはSEQUENCE関数が並べてくれる。入力するのは1か所だけ
- カレンダーの左上に来るのは、1日ではなくその週の日曜日
- 左上の日付は「1日 − WEEKDAY + 1」で求められる。引く数は自分で決めない
- 日にちだけの表示は、表示形式のユーザー定義「d」
- 色分けは条件付き書式。「かつ、その月であること」を忘れずに
いちばんの山場はステップ4です。ここさえ通れば、あとは色を付けていくだけでした。
関数は1つずつ覚えようとすると、なかなか身につきません。1つのものを作りながらのほうが、記憶に残ります。カレンダーはそのちょうど良い題材です。SEQUENCE・DATE・WEEKDAY・COUNTIF——今日使った4つは、どれもカレンダー以外でも出番のある関数です。
動画では、実際に画面を動かしながら同じ手順を解説しています。数式を組み立てていく様子は、動いているものを見たほうが分かりやすいと思います。
▼動画で見る
【Excel】年月を変えるだけ!日付と曜日が自動で切り替わるカレンダーの作り方
https://youtu.be/heqTpbAbbQY
「自分の仕事のExcelでもできますか?」というご相談も受け付けています。
今の状況を聞かせていただければ、どこから始めると良いか一緒に整理していきます。


