Quantcast
Channel: 円周率近似値の日に生まれて理系じゃないわけないだろ! - knifeのblog
Viewing all articles
Browse latest Browse all 5376

カレンダーを作ろう -その3-

$
0
0

カレンダー作りも佳境に入ってきました。

今回の目標は、



こんな感じです。


国民の祝日を管理しちゃおうということです。

かなり手強いので、覚悟してくださいねw。


では、祝日データは同じシートの100行以降に構築することにします。

A100セルからC100セルを結合して、シリアル値
D100セルからE100セルを結合して、国民の祝日
F100セルを年、G100セルを月、H100セルを日、
I100セルを備考とします。

A101セルからC101セルを結合して、
=IF(H101<>FALSE,DATE(F101,G101,H101),0)
と入れ、表示形式を
yyyy"年"mm"月"dd"日("aaa")"
として、A136セルまでオートフィルします。

D101セルに、元旦
F101セルに、
=YEAR(DATE(YEAR(A1),MONTH(A1),0))
G101セルに、1
H101セルに、1

F102セルに、
=F$101
と入れ、F136セルまでオートフィルします。

D102セルに、振替休日
G102セルに、=G101
H102セルに、
=IF(AND(DATE(1973,4,30)<=A101,WEEKDAY(A101)=1),H101+1)

D103セルに、成人の日
G103セルに、1
H103セルに、
=IF(AND(1949<=F103,F103<=1999),15,IF(2000<=F103,MOD(2-WEEKDAY(DATE(F103,G103,1)),7)+15))

D105セルに、建国記念の日
G105セルに、2
H105セルに、11

D107セルに、春分の日
G107セルに、3
H107セルに、
=INT(20.8431+0.242194*(F107-1980))-INT((F107-1980)/4)

D109セルに、天皇誕生日
G109セルに、4
H109セルに、
=IF(F109<=1988,29)

D111セルに、みどりの日
G111セルに、4
H111セルに、
=IF(AND(1989<=F111,F111<=2006),29)

D113セルに、昭和の日
G113セルに、4
H113セルに、
=IF(2007<=F113,29)

D115セルに、憲法記念日
G115セルに、5
H115セルに、3

D116セルに、振替休日
G116セルに、=G115
H116セルに、
=IF(AND(DATE(1973,4,30)<=A115,WEEKDAY(A115)=1),IF(F116<=1997,H115+1,H115+3))

D117セルに、国民の休日
G117セルに、5
H117セルに、
=IF(AND(1988<=F117,F117<=2006,H115+2=H120),H115+1)

D118セルに、みどりの日
G118セルに、5
H118セルに、
=IF(2007<=F118,4)

D119セルに、振替休日
G119セルに、=G118
H119セルに、
=IF(AND(DATE(1973,4,30)<=A118,WEEKDAY(A118)=1),H118+2)

D120セルに、こどもの日
G120セルに、5
H120セルに、5

D122セルに、海の日
G122セルに、7
H122セルに、
=IF(AND(1996<=F122,F122<=2002),20,IF(2003<=F122,MOD(2-WEEKDAY(DATE(F122,G122,1)),7)+15))

D124セルに、敬老の日
G124セルに、9
H124セルに、
=IF(AND(1966<=F124,F124<=2002),15,IF(2003<=F124,MOD(2-WEEKDAY(DATE(F124,G124,1)),7)+15))

D126セルに、国民の休日
G126セルに、9
H126セルに、
=IF(AND(1988<=F126,H124+2=H127),H124+1)

D127セルに、秋分の日
G127セルに、9
H127セルに、
=INT(23.2488+0.242194*(F127-1980))-INT((F127-1980)/4)

D129セルに、体育の日
G129セルに、10
H129セルに、
=IF(AND(1966<=F129,F129<=1999),10,IF(2000<=F129,MOD(2-WEEKDAY(DATE(F129,G129,1)),7)+8))

D131セルに、文化の日
G131セルに、11
H131セルに、3

D133セルに、勤労感謝の日
G133セルに、11
H133セルに、3

D135セルに、天皇誕生日
G135セルに、12
H135セルに、23

136行まで、入力していない行は振替休日なので、102行をコピーして、それぞれの行にペーストして下さい。


A100セルからI136セルまでをコピーし、A150セルでペースト。

F151セルに、=F$101+1

F152セルに、=F$102
を入れ、F186セルまでオートフィルする。


データが出来あがったので、条件付き書式で色を変化させてみましょう。


A2セルからG2セルまでを選択し、条件付き書式→新しいルール→数式を使用して、書式設定するセルを決定→

数式蘭と書式を、

=AND(MONTH($A$1)<>MONTH(A2),OR(WEEKDAY(A2)=1,ISNUMBER(MATCH(A2,$A$100:$A$200,0))))
淡い赤色

=AND(MONTH($A$1)<>MONTH(A2),WEEKDAY(A2)=7,NOT(ISNUMBER(MATCH(A2,$A$100:$A$200,0))))
淡い青色

=AND(MONTH($A$1)<>MONTH(A2),WEEKDAY(A2)<>1,WEEKDAY(A2)<>7,NOT(ISNUMBER(MATCH(A2,$A$100:$A$200,0))))
淡い灰色

=AND(MONTH($A$1)=MONTH(A2),ISNUMBER(MATCH(A2,$A$100:$A$200,0)))


として、4パターン追加します。


同様に、O2セルからU7セルまで選択して、

=AND(MONTH($O$1)<>MONTH(O2),OR(WEEKDAY(O2)=1,ISNUMBER(MATCH(O2,$A$100:$A$200,0))))
淡い赤色

=AND(MONTH($O$1)<>MONTH(O2),WEEKDAY(O2)=7,NOT(ISNUMBER(MATCH(O2,$A$100:$A$200,0))))
淡い青色

=AND(MONTH($O$1)<>MONTH(O2),WEEKDAY(O2)<>1,WEEKDAY(O2)<>7,NOT(ISNUMBER(MATCH(O2,$A$100:$A$200,0))))
淡い灰色

=AND(MONTH($O$1)=MONTH(O2),ISNUMBER(MATCH(O2,$A$100:$A$200,0)))


と、こちらも4パターン追加します。


更に、A10セルからU21セルまで選択して、

=AND(MONTH($I$7)<>MONTH(A10),OR(WEEKDAY(A10)=1,ISNUMBER(MATCH(A10,$A$100:$A$200,0))))
淡い赤色

=AND(MONTH($I$7)<>MONTH(A10),WEEKDAY(A10)=7,NOT(ISNUMBER(MATCH(A10,$A$100:$A$200,0))))
淡い青色

=AND(MONTH($I$7)<>MONTH(A10),WEEKDAY(A10)<>1,WEEKDAY(A10)<>7,NOT(ISNUMBER(MATCH(A10,$A$100:$A$200,0))))
淡い灰色

=AND(MONTH($I$7)=MONTH(A10),ISNUMBER(MATCH(A10,$A$100:$A$200,0)))


と、こちらも4パターン追加します。


これで、3ヵ所のカレンダーの日付の色が、該当月以外は淡い色の文字、祝日は赤文字になったことでしょう。


メインのカレンダーに祝日を入れましょう。

B10セルとC10セルを結合し、書式を左寄せにし、
=IF(ISNUMBER(MATCH(A10,$A$100:$A$200,0)),INDEX($D$100:$D$200,MATCH(A10,$A$100:$A$200,0)),"")
と入れます。

他の、該当するところへ、コピペしましょう。


少しだけ、前に並べた数式の解説をしておきます。


ハッピーマンデーによって、第2月曜日や第3月曜日が祝日になるケースがありますね。

成人の日、体育の日は第2月曜日、
=MOD(2-WEEKDAY(DATE(年,月,1)),7)+8)

海の日、敬老の日は第3月曜日、
=MOD(2-WEEKDAY(DATE(年,月,1)),7)+15)

という様に、その年月の1日の曜日から日を求めています。

当然、該当する年かのチェックをしないとならない。


振替休日も、全て同じでよいかというと、そうもいきません。

=IF(AND(DATE(1973,4,30)<=シリアル値,WEEKDAY(シリアル値)=1),日+n)

一番最初の振替休日は1973年4月30日以降でかつ、日曜日ならば、日+nが振替休日になる。

建国記念日(5/3)、みどりの日(5/4)、こどもの日(5/5)のように、国民の祝日が連休となるようなケースで、

建国記念日が日曜の場合、建国記念日の振替休日は3日後の5月6日になる。

みどりの日が日曜日の場合、みどりの日の振替休日は2日後の5月6日になる。

というようなことがある。


また、国民の祝日に挟まれた平日も国民の休日となる。

=IF(AND(1988<=年,日1+2=日2),日1+1)

1988年以降で、日1と日2の差が2なら、間の日も祝日になる。


春分の日、秋分の日は、それぞれ、

=INT(20.8431+0.242194*(年-1980))-INT((年-1980)/4)
=INT(23.2488+0.242194*(年-1980))-INT((年-1980)/4)

1980年の春分である20日20:04:04、秋分である05:58:16、に平均公転周期から365を引いた0.242194に経過年数を掛けたものを加え、…、といったことをやっている。


さて、日の値がFALSEになると、シリアル値は0=1900年01月00日(土)という値にしています。

カレンダーのシリアル値を、A100セルからA200セルまでのシリアル値とマッチングして、見つかれば祝日という判定を条件付き書式でやっていますので、シリアル値0がマッチするような年月を使わなければ問題は起こらないでしょう。

かなり厳密に祝日データを作ったつもりですが、春分の日や秋分の日の計算式が、実際の発表のものとは異なることも考えられますので、その辺は臨機応変に変更してください。

もし、西暦何年何月のカレンダーの祝日が間違っているということがありましたら、コメントください。

もっと簡単な方法や数式があったら、逐次置き換えて行くと思いますので、ご了承下さい。


カレンダー自体の修飾は、それぞれで楽しんでくださいね。

また、このカレンダーは使い回しが効くので、通常のファイル形式ではなく、Excelテンプレートとして保存するのもよいでしょう。


というわけで、『カレンダーを作ろう』は、3回の講座でとりあえずお開きとします。

エクセルでこんなものを作ってというリクエストなどありましたら、私の気が向いたらやりたいと思います。


ではでは、よりよいエクセルライフを…


Viewing all articles
Browse latest Browse all 5376

Trending Articles