VBAでCalendar_1
シリーズ3作目はカレンダーを作成します。
今では、市販の物やアプリ等様々なカレンダーが普及していますので、今更自作しなくても間に合っているでしょうけど、仕事柄水曜日から始まるものや2週間単位のもの、4月1日から始まるものが欲しい。などの欲求があるかもしれません。
また、一口にカレンダーと言っても普段意識しないような新たな発見があるかもしれませんので、最後までお付き合いいただければありがたいです。
では、カレンダーにはどのような規則性があるのでしょう。
まず思い浮かぶのは、
①1週間が7日間で日曜日から土曜日を繰り返す。
②1年は1月~12月まで12の月があって、それぞれの日数が決まっている。
③1年は通常365日で、閏年と呼ばれる年は366日で2月が1日増える。
④日本では、国民の祝日と呼ばれる休みの日が有る。
おおよそ、これくらいのことを念頭に置けば、ある程度のものはできるのではないでしょうか。
それでは、これらをひとつずつ細かく見てみましょう。
①は一般的に、日・月・火・水・木・金・土の繰り返しですが、自作の場合は、水曜日から始まったり、2週間分を繰り返したり、自分の都合に合った自由な作り方も可能です。
②は1月が31日、2月が28日または29日、3月が31日・・・12月が31日です。
③の閏年の定義は、4年に一度「4で割り切れる西暦年」である。と思われがちですが、これでは不完全です。
正確には「4で割り切れて、100で割り切れない西暦年」または「400で割り切れる西暦年」となっています。
したがって、1800年や1900年は閏年ではなかったのです。また2000年も前段の条件では閏年ではないのですが、後段の条件によって閏年だったのです。なので2000年2月29日に生きていた方は、400年に一度の大変貴重な1日を過ごされたことになります。また、2100年まで生きられる方は、閏年でないことを確認してください。(私には無理です)
余談ですが、40年ほど前、まだ今のようなパーソナルコンピューターがなかった頃、汎用コンピューターでプログラムを作っていた時は、この閏年や曜日の計算には随分神経を使いながらやったものですが、今ではExcelさんに任せると簡単に求めることができるので後ほど紹介します。
④は昭和23年に施行された法律第178号「国民の祝日に関する法律」によって定められていて、何度か改訂を経ながら今日に至っています。
また、春分の日と秋分の日については、国立天文台から2月1日に公告される官報によって、翌年の日付が確定することになっています。
今回も準備から始めます。フォルダー「Calendar」を作り、その中にマクロBook「暦.xlsm」を作ってください。
それでは「暦.xlsm」を開いて、③の閏年を確認してみましょう。 4行目D列にある西暦年で閏年の判定をするようにします。 たとえば、4行目D列に2023と入力して
Sub aaa()
YY = Cells(4, "D")
Cells(4, "E") = Day(DateSerial(YY, 3, 1) - 1)
End Sub
とすると、実行結果が4行目E列に28が表示されます。
これは、「Day(DateSerial(YY, 3, 1) - 1)」を日本語で言うと「2023年3月1日の1日前は何日か」ってことになり、その答えが4行目E列に28(2月28日)と表示されます。
4行目D列に2024を入力して実行すると、4行目E列には29が表示されます。
これを閏年の判定に使うことも可能ですが、カレンダーの場合は28、29をそのまま2月の日数として使えるので好都合です。
1900や2000についても試してみてください。
ついでに、1月1日の曜日を調べてみましょう。
曜日を返してくれる命令Codeは「Weekday(YMD, a)」です。YMDには年/月/日を入れます。aは1~7で答えが変わります。a=1のとき日曜日が1となり、月、火、水が2、3、4となり、a=2のときは月曜日が1となり、火、水、木が2、3、4となります。
たとえば
Sub bbb()
YMD = Cells(4, "D")
MsgBox Weekday(YMD, a)
End Sub
などを作って、aを1~7の間で任意の値に変えて検証してみてください。
日付は2023/1/1が月曜日なので分かりやすいですよ。
これらのことを予備知識として、カレンダーを作っていきますが、今回はここまでとします。
次回は具体的な作り方を紹介する予定です。
続けてご覧いただけたらありがたいです。
この記事が気に入ったらサポートをしてみませんか?