2010年11月11日

付録.Excel関数で万年カレンダーを作る

 家庭でも職場でも、メモを書き込めるカレンダーがあると重宝します。方々から毎年頂くカレンダーの中で、捨てられずに実用されるカレンダーは、日付と共にメモ余白が大きくとってあり、暦注(大安、先勝)の記載、写真や絵面が綺麗なものが、手元に残ります。
 面倒なく自分で作れたら、スケジュール管理も楽しいかも知れませんね。でも、「何年の何月は何曜日?」を調べて、その都度入力していては、 面倒になります。面倒な曜日計算はExcelのワークシート関数に任せて、貴方のオリジナル万年カレンダーを作ってみましょう。
ExcelVBAマクロ
Excelで万年カレンダー

 月ごとに、最後の日付は違いますね。閏(うるう)年の2月もありますから、ワークシート関数を組み合わせていきましょう。 この万年カレンダーで使用する関数は、論理関数の{ IF }関数、日付関数の{ WEEKDAY }関数、情報関数の{ ISERR }の3つの関数です。
 万年カレンダーをExcelで作成する際に、考慮しなければならないポイントは、「第1週目の日数は、最大で7日、最小で1日」は必ずあることと、 月によって「第6週が無い」場合もあること、それに、閏年の2月です。日付は10進数ですから、単純に隣接するセルの値に「+1」していく式を 30回繰り返すだけでは、万年カレンダーにはなりません。手始めに、「その月の1日(ついたち)は、何曜日から始まるのか」を調べなくてはなりません。
 第1週目の日曜日の日付を表示するセルB5に、次の関数を入力します。セルD2には西暦、セルF2には、月を表す数字が必要です。
 =IF(WEEKDAY($D$2&"/"&$F$2&"/"&1)=1,1,"")
 関数式を文章で表すと、「もし、西暦2004年10月1日の曜日が1を返すなら1、それ以外は空白」となっています。WEEKDAY関数に、西暦と月数、 日を渡した結果を受け取っています。仮に、セルD2に「2004」、セルF2に「10」と入力してあった場合、上の関数式を入力したセルには、 何も表示されません。これは、西暦2004年10月の最初の1日は、金曜日から始まっているためです。
 続いて、第1週目の月曜日の日付を表示するセルC5に、次の関数を入力します。
 =IF(B5<>"",B5+1,IF(WEEKDAY($D$2&"/"&$F$2&"/"&1)=2,1,""))
 もし、この月の1日が日曜日であった場合、セルB5には既に「1」が表示されている筈なので、単純に「1」を加えた値を返します。 日曜日から始まっていなければ、セルC5のある月曜日、若しくは火曜日以降に1日が始まりますので、論理関数の{ IF }関数を入れ子にして、 再度1日が始まる曜日を検証しています。あとは、第1週目の土曜日まで、日付関数の{ WEEKDAY }関数の返す値をそれぞれの曜日のオフセット位置を 表す数字で検証します。
 セルD5
 =IF(C5<>"",C5+1,IF(WEEKDAY($D$2&"/"&$F$2&"/"&1)=3,1,""))
 セルE5
 =IF(D5<>"",D5+1,IF(WEEKDAY($D$2&"/"&$F$2&"/"&1)=4,1,""))
 セルF5
 =IF(E5<>"",E5+1,IF(WEEKDAY($D$2&"/"&$F$2&"/"&1)=5,1,""))
 セルG5
 =IF(F5<>"",F5+1,IF(WEEKDAY($D$2&"/"&$F$2&"/"&1)=6,1,""))
 セルH5  =IF(G5<>"",G5+1,IF(WEEKDAY($D$2&"/"&$F$2&"/"&1)=7,1,""))
 これで、第1週目の「1日(ついたち)」が始まるセルに「1」、それ以降のセルには「+1」の日付が表示されるようになりました。


ワークシート情報関数{ ISERR }関数で、値の真偽を判定


 1週を7日間とするカレンダー表記の場合、第2週目から第4週目までは、西暦や月、閏年に関係なく全てのセルに日付が入ります。 したがって、単純に第1週目の土曜日の値に「1」を加えた数字が、第2週目の日曜日の日付になります。 万年カレンダーの第2週目の日曜日の日付を表すセルB9には、次の式を入れるだけで済みます。
 =H5+1
 これを第4週目のセルH17まで続けると、第4週目の土曜日の日付を表すセルH17には、次の式が入ります。
 =G17+1
 問題は、第5週目の扱いです。月の1日が何曜日なのかは、ワークシート関数の日付関数{ WEEKDAY }関数が返す値で、知ることができました。 月の最初は必ず「1」日から始まりますが、月の最後の日付は分かりません。 そこで、ワークシート関数の情報関数{ ISERR }関数を使い、式の内容を真偽に諮り、その結果に応じて最終日付を求めます。 第5週目の日曜日の日付を表すセルB21には、次の関数を入力します。
 =IF(ISERR(WEEKDAY($D$2&"/"&$F$2&"/"&H17+1))=TRUE,"",H17+1)
 これは、第4週目の土曜日の日付に「1」を加えた式を情報関数{ ISERR }関数で判定し、エラーが返ってきた場合は空白、 式が成立する場合は第4週目の土曜日の日付に「1」を加えて表示します。第1週目と同じように、以降のセルに入力していきます。
 セルC21
 =IF(ISERR(WEEKDAY($D$2&"/"&$F$2&"/"&B21+1))=TRUE,"",B21+1)
 セルD21
 =IF(ISERR(WEEKDAY($D$2&"/"&$F$2&"/"&C21+1))=TRUE,"",C21+1)
 セルE21
 =IF(ISERR(WEEKDAY($D$2&"/"&$F$2&"/"&D21+1))=TRUE,"",D21+1)
 セルF21
 =IF(ISERR(WEEKDAY($D$2&"/"&$F$2&"/"&E21+1))=TRUE,"",E21+1)
 セルG21
 =IF(ISERR(WEEKDAY($D$2&"/"&$F$2&"/"&F21+1))=TRUE,"",F21+1)
 セルH21
 =IF(ISERR(WEEKDAY($D$2&"/"&$F$2&"/"&G21+1))=TRUE,"",G21+1)
 また、西暦と月の組み合わせによっては第6週の月曜日が、 月最終の日付になる場合がありますので、第6週目の日曜日、月曜日の日付を表すセルにも、 同様に関数を入力していきます。
 セルB25
 =IF(ISERR(WEEKDAY($D$2&"/"&$F$2&"/"&H21+1))=TRUE,"",H21+1)
 セルC25
 =IF(ISERR(WEEKDAY($D$2&"/"&$F$2&"/"&B25+1))=TRUE,"",B25+1)
 これで、Excelで作る貴方オリジナルの万年カレンダーの基幹部分が出来上がりました。 西暦を月を入力するセルに、日付関数で現在の西暦と月を表示させれば、リアルタイムのカレンダーにもなります。 あとは、セルの書式設定やオートシェイプ、はたまた自前の写真を取り込んで、オリジナルの万年カレンダーを作ってみてください。


posted by くきお at 11:11| Comment(0) | ExcelVBAマクロ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。