| 「Microsoft Excel」であそぶ その1.カレンダーを作る (2002年3月・・・もうすぐ6年生) ひでまろ |
Microsoft Excelを使ってカレンダーを作ってみたよ。
最初の「基礎」シートの"B1"セルに作りたいカレンダーの最初の日を入力します。
例えば2000年のカレンダーを作るときは "2000/1/1"と入力します。
これだけで自動的に「ページA」シートに1月から3月までのカレンダー、「ページB」シートに4月から6月、「ページC」シートに7月から9月、「ページD」シートに10月から12月のカレンダーが表示されます。
このままホームページ用のHTML作るために3ヶ月ごとにシートをわけました。
ちゃんと土曜日と日曜日は赤色で表示していますが休日は自分で赤色に変更してください。
「ページA」から「ページD」シートをHTMLに書き出せば出来上がりです。1つのExcelファイルで何度も作るためにテンプレートファイルにしました。保存するときは好きな名前で保存してください。
考えたこと
- 月ごとにスタート曜日と日数と最終曜日を計算します。
「基礎」シートで12か月分のスタート曜日と日数と最終曜日を計算しています
最初の月の年と月を計算します。これはExcelのYEAR関数とMONTH関数を使っています。
B1セルに入力した日付を参照してYEAR関数を使うと年だけ取り出せます。
MONTH関数を使うと月だけ取り出せます。これを12か月分作ります。
残りの11か月は前の月から計算します。前の月が12月だったら年は1たします。月は1づつたしてゆきますが前の月が12だったら次は1に戻ります。
これはIF関数でできます。"B1"に"2002/1/1"と入力したら"B3"は"=MONTH(B1)"で1が表示されます。
"B4"は"B3"に1たしますが12だったら1にしないといけないので"=IF(B3=12,1,B3+1)"と入力してあります。今は"B3"が1だったから"B4"は2になるけど、もし"B3"が12だったら1になります。こうしておけば途中の月からのカレンダーも簡単につくれ ます。
その月の日数もIF関数で計算しています。
1月、3月、5月、7月、8月、10月、12月は31日まであるからIF関数とOR関数で判断します。OR関数を使うといくつかの条件でどれか1つでも合っていると正しいと判断します。
=IF(OR(B3=1,B3=3,B3=5,B3=7,B3=8,B3=10,B3=12),31,30) このままだと2月、4月、6月、9月、11月が全部 30になっちゃうんだけど2月は30日までないからもう一度IF関数とOR関数を使いました。
=IF(OR(B3=1,B3=3,B3=5,B3=7,B3=8,B3=10,B3=12),31,IF(OR(B3=4,B3=6,B3=9,B3=11),30,28)) これで4月、6月、9月、11月が30日で2月が28日になりますがまだダメです。
2月はうるう年の時は29日まであります。調べたらうるう年は4の倍数の年だけど100の倍数の時はうるう年になりません。でも400の倍数の時はうるう年になります。
倍数を調べるときはMOD関数で余りを調べます。IF関数、AND関数とMOD関数を使って2月の日数を計算しました。4で割った余りが0で100で割った余りが0じゃなければうるう年だから29日まであります。
"IF(AND((MOD(A3,4)=0),(MOD(A3,100)<>0)),29,28)"
最後に400で割って余りが0だったらうるう年の条件を付けて全部完成です。
=IF(OR(B3=1,B3=3,B3=5,B3=7,B3=8,B3=10,B3=12),31,IF(OR(B3=4,B3=6,B3=9,B3=11),30,IF(AND((MOD(A3,4)=0),(MOD(A3,100)<>0)),29,IF(MOD(A3,400)=0,29,28))))
すごくややこしいけど1つ作ればほかの月はそれをコピーするだけです。
スタート曜日と最終曜日は日曜日が0で月曜日は1で土曜日は6になるように数字であらわします。1番最初の月のスタート曜日はWEEKDAY関数を使いました。"B1"セルの日付の曜日が日曜日なら1、月曜日なら2で土曜日なら7になります。だからWEEKDAY関数を使って計算してから1引きました。
その次の月からは前の月のスタート曜日にその日数を足して7で割った余りでスタート曜日を計算できます。またMOD関数を使います。
最終曜日は次の月のスタート曜日より1少ないから簡単です。そのために1か月多く計算しています。次の月のスタート曜日が0だったら土曜日になるから6にします。
- カレンダーの表示方法
12か月分のスタート曜日と日数と最終曜日 が計算できたのでカレンダーが作れるようになりました。1番多い週は6週目まであるので1か月は7×6の表になります。
年と月は「基礎」シートの値を使います。
最初の週はどこが1日目なのか見つけるのにちょっと考えました。
「基礎」シートの最初の月のスタート曜日と同じところに1を付ければいいんです。
だからIF関数で調べることにしました。
カレンダーの最初は日曜日だからスタート曜日が0だったらここが1日目になります。
0じゃなければ空白です。
=IF(基礎!$C$3=0,1," ") 次の月曜日から土曜日はスタート曜日を確かめて自分の曜日なら1を入れます。そうじゃなくて1つ前が空白ならばここも空白です。もし1つ前が空白じゃなかったらカレンダーが始まっているので1足して日にちを表示します。「ページA」シートの"C6"セルは月曜日なので次の計算をします。
=IF(基礎!$C$3=1,1,IF(ページA!B6=" "," ",ページA!B6+1)) "基礎!$C$3"みたいに"$"を付けておくと、この週のほかのセルにコピーしても見る場所は変わらないで"基礎!$C$3"を見にゆきます。これは「基礎」シートの"C3"セルを見ることです。
2週目と3週目は1日前の日にちに1たすだけです。
1番少ないカレンダーは4週間で終わりです。だから4週目と5週目と6週目はその月の日数になったかどうか確認します。
1日前が空白ならばそこからは全部空白です。1日前が空白じゃない時はその数字と日数を比べます。もし前の日が日数と同じだったらあとは全部空白になります。そうじゃなければ1たすだけです。
最初の週と似ていますが「ページA」シートの"C10"セルは次の計算をします。
=IF(ページA!B10=" "," ",IF(基礎!$D$3=ページA!B10,IF(B10=基礎!$D$3," ",基礎!$D$3),B10+1))
これを12か月分用意しておけば「基礎」シートにカレンダーの最初の日にちを入れるだけで自動的に1年分のカレンダーができあがります。最初の日にちが1月じゃなくても大丈夫なように作ったけど必ず1日じゃないとダメです。
スタート曜日は1日の曜日なので"2002/4/15"なんかが入るとおかしくなってしまいます。最初は最終曜日を使うつもりだったけど使わなくてもそれぞれの月の日数だけでカレンダーの表示ができました。