背景
何かとエクセルでカレンダーっぽいもの作りたくなる時ってあると思います。
作り方をググってみるといくらでも出てきますが、主要な手段は特定のセルに作成したい月の月初日を入力し、数式で+1していくような作りが殆どなんじゃないかと思います。
ですがこの作り方だと「隔週でこういう処理を入れたい」という時、if文を使いすぎて一つのセル内の数式がくどく成りがちでした。
なので、私はROW()とCOLUMN()とVLOOKUP()を使ったカレンダーを用いています。
ググっても同じような奇行を取っている変態がいなかったので投稿してみることにしました。
カレンダー関連の関数整理
日曜日を週の初めとします。
以下に記載する関数がカレンダー記述の基準となる関数です。
重要なのは=WEEKDAY(A2)
と=WEEKNUM($A2)-(WEEKNUM($A$2)-1)
です。
覚書ついでによく使う関数をいくつか記載しています。
(A2に日付が入力されているものとします。)
関数 | 目的 |
---|---|
=TEXT(2023/12/1,"yyyy/mm/dd") ※A2 |
入力した日付を指定の書式に変える |
=TEXT(A2+1,"yyyy/mm/dd") ※A3~ |
基準日から月末までの日付 |
=TEXT(A2,"aaa") |
日付に対して曜日を返す |
=WEEKDAY(A2) |
曜日を数字に置き換えたもの オプションで週の初めの曜日も指定できる |
=COUNTIF($C$2:C2,C2) |
その月での何番目の曜日かを返す 第1日曜日、第2日曜日・・・ |
=WEEKNUM($A2)-(WEEKNUM($A$2)-1) |
その月での何番目の週かを返す 第1週、第2週・・・ |
=TEXT(EOMONTH(A2,0),"m/d") |
その月の末日を返す |
=TEXT(A2+7-WEEKDAY(A2,1)+IF(WEEKDAY(A2,1)<=1,-6,1),"m/d") |
指定日付から見た次の日曜日 |
カレンダー作成開始
上記の表のE列とC列を=E2*10+C2
という式で結合します。これを番地と呼ぶことにします。
次にROW()とCOLUMN()を使って以下のような表を作成します。表2とします。
今回はB2を基準に=ROW()-1&COLUMN()-1
を入れています。
これをB2~H7までコピーして、同じ数式が入った状態にします。
この上表で出力された2桁の数字ですが、この数字を番地と見立てます。
ここでVLOOKUP()を使って、番地を検索値として目的の値を持ってきます。
VLOOKUP()で呼び出す値を表1に作成します。
表2の数式を変更します。
ROW()-1&COLUMN()-1
は素の状態だと文字列として処理されるのでVALUE(ROW()-1&COLUMN()-1)
とし、
=VLOOKUP(VALUE(ROW()-1&COLUMN()-1),表1!$F:$G,2,FALSE)
という数式を入力します。
同じ数式でいいのでコピペが楽ちんです。
エラーが気になるので、=IFERROR(VLOOKUP(VALUE(ROW()-1&COLUMN()-1),表1!$F:$G,2,FALSE),"")
にします。
という具合でカレンダーを作成していきます。
サンプルとして第何曜日を表示させます。
今回はCHAR(10)を使って改行させて、=G2&CHAR(10)&H2
を戻り値にします。
表1
おわり
以上です。小ネタでした。