エクセルで月齢カレンダーを作成しました。
年と月を変えると長期間使えます。
月齢は、ユーザー定義関数を作成して求めています。
ユーザー定義関数とは、マクロで自分でオリジナルな関数を作ることです。
詳しいことはここでは省きます。
マクロを使わずに月齢計算をするとシートの数などが多くなるのでカレンダーのような日数が多いと大変なことになるのでマクロを使いました。
このほうが実用的です。
ユーザー定義関数で月齢を求める式を作成して関数を作りました。
月齢カレンダーの説明
作成したユーザー定義関数
geturei:23時59分59秒の月齢
getureiw:12時の月齢
tukimk:月横径‐太陽横径
月の見え方を正確に数字で表す為には正確な太陽の横径と月の横径が必要になります。
太陽と月の横径の差が月の満ち欠けの名前の関係しています。
表1
・日付
数式
例(セルG5)【=IF(MONTH(FLOOR(DATE($A$1,$C$1,0),7)+G$4+$H5)<>$C$1,””,FLOOR(DATE($A$1,$C$1,0),7)+G$4+$H5)】
※日付は万年カレンダー作成のページに詳しく書いています。
万年カレンダーの作成
・月の画像を表示する数字
列A~G、行:6、11、16、21、26、31
例(セルG6)【=IF(G5=””,31,INT(geturei(G5)))】
・画像の切り替え
月の満ち欠けの画像は、画像一覧から画像のリンクでしています。
方法は【画像の自動切り替え】で説明しています。
・月齢
例(セルG7)【=IF(G5=””,””,getureiw(G5))】
月齢の数字は、その日の12時の月齢です。
・月の満ち欠けの名称
月の満ち欠けの名称は
新月は月齢が0になった日です。
三日月は月の太陽の横径の差が40°に一番近い日
上弦は月と太陽の横径の差が90°の日
十三夜は満月の2日前
十四夜は満月の1日前
満月は月と太陽の横径の差が180°の日
十六夜は満月の翌日
十七夜は満月の翌々日
十八夜は満月の三日後
下弦は月と太陽の横径の差が270°の日
二十六夜は月と太陽の横径の差が320°に一番近い日
晦日は月と太陽の横径の差が一番大きい日
というふうに設定しています。
数式:【=IF(ISERROR(VLOOKUP(G5,$B$44:$D$74,3,0)),””,VLOOKUP(G5,$B$44:$D$74,3,0))】
セルB44~D44に月の満ち欠けの名称一覧を作成してVLOOKUPで日付と関連付けしています。
満ち欠けの名称一覧の説明
・B列
数式(セルB44)【=DATE(A1,C1,1)】
月齢カレンダーの年と月を持ってきて1日に日に設定してる式です。
数式(セルB45)【=B44+1】
1日に1足して2日にしています。以下も同じです。
・C列
数式【=IF(tukimk(B44)<0,tukimk(B44)+360,tukimk(B44))】
tukimkはマクロで作成したユーザー定義関数で「月横径‐太陽横径」です。
数式は月の満ち欠けの角度を出した計算式です。
「月横径‐太陽横径」がマイナスになると360°足しています。
・D列
数式(セルD44)
※この数式ではバグが発生します。
IF(E44=(SMALL($E$44:$E$74,1)),”三日月”,
IF(C44=(SMALL($C$44:$C$74,COUNTIF($C$44:$C$74,”<=90″)+1)),”上弦”,
IF(C44=(INDEX($C$44:$C$74,MATCH(180,$C$44:$C$74)-1)),”十三夜”,
IF(C44=(INDEX($C$44:$C$74,MATCH(180,$C$44:$C$74))),”十四夜”,
IF(C44=(SMALL($C$44:$C$74,COUNTIF($C$44:$C$74,”<=180″)+1)),”満月”,
IF(C44=(INDEX($C$44:$C$74,MATCH(180,$C$44:$C$74)+2)),”十六夜”,
IF(C44=(INDEX($C$44:$C$74,MATCH(180,$C$44:$C$74)+3)),”十七夜”,
IF(C44=(INDEX($C$44:$C$74,MATCH(180,$C$44:$C$74)+4)),”十八夜”,
IF(C44=(SMALL($C$44:$C$74,COUNTIF($C$44:$C$74,”<=270″)+1)),”下弦”,
IF(F44=(SMALL($F$44:$F$74,1)),”二十六夜”,IF(C44=(MAX($C$44:$C$74)),”晦日”,””))))))))))))】
C列の月の満ち欠けの角度が一か月のうち表1の角度に一番近い時に満ち欠けの名称をもってくる数式です。
ただし三日月はE列の一番小さい数字、二十六夜はF列の一番小さい日にしています。
【追記】
MATCH関数など順番に並んでないと正確に抽出できないことがあります。
指摘があったように上記の式ではうまく表できない年や月があり次のように変更しました。
今のところちゃんと表示できています。
また、何か不具合があれば連絡してください。
数式(セルD44)
【=IF(C44=(SMALL($C$44:$C$74,1)),”新月”,IF(E44=(SMALL($E$44:$E$74,1)),”三日月”,IF(C44=(SMALL($C$44:$C$74,COUNTIF($C$44:$C$74,”<=90")+1)),"上弦",IF(C44=(INDEX($C$44:$C$74,MATCH(MIN(ABS($C$44:$C$73-155)),ABS($C$44:$C$73-155),0))),"十三夜",IF(C44=(INDEX($C$44:$C$74,MATCH(MIN(ABS($C$44:$C$73-167)),ABS($C$44:$C$73-167),0))),"十四夜",IF(C44=(SMALL($C$44:$C$74,COUNTIF($C$44:$C$74,"<=180")+1)),"満月",IF(C44=(INDEX($C$44:$C$74,MATCH(180,$C$44:$C$74)+2)),"十六夜",IF(C44=(INDEX($C$44:$C$74,MATCH(MIN(ABS($C$44:$C$73-205)),ABS($C$44:$C$73-205),0))),"十七夜",IF(C44=(INDEX($C$44:$C$74,MATCH(MIN(ABS($C$44:$C$73-220)),ABS($C$44:$C$73-220),0))),"十八夜",IF(AND(C43<270,C44>=270),”下弦”,IF(F44=(INDEX($C$44:$C$74,MATCH(MIN(ABS($C$44:$C$73-320)),ABS($C$44:$C$73-320),0))),”二十六夜”,IF(C44=(INDEX($C$44:$C$74,MATCH(MIN(ABS($C$44:$C$73-350)),ABS($C$44:$C$73-350),0))),”晦日”,””))))))))))))】
※カーソルを一番後ろに持っていきCtrl+shiftキーを押しながらEnterキーを押して下さい。
・E列
数式(E44)【=ABS(C44-40)】
・F列
数式(F44)【=ABS(C44-320)】
E列とF列を設けたのはD列の数式がやり易かったからです。
完成品はダウンロードできます。【月齢カレンダー】
圧縮ファイルの解凍の説明はこちらです。