日本語プログラミング言語「なでしこ」公式サイト |
日本語でプログラミングできる「なでしこ」を使って、プログラミングを身につけましょう。プログラミングができれば、いろいろな仕事を自動化することができます。例えば、似たようなテキストを連続で大量に作成する必要がある場合でも、数行のプログラムを書くことで済んでしまうこともよくあります。今回は、その例として365日分のカレンダーを作ってみましょう。
365日分のカレンダーを作ろう
ところで、皆さんは、自分でカレンダーを作ろうと思ったら、どうやって作るでしょうか。たぶん、多くの方がExcelを使って作ることでしょう。Excelのセルをカレンダーのマスに合わせれば、比較的手軽にカレンダーを作れます。
とは言え、365日分の日付や曜日を書いていくのは、なかなか面倒な作業です。Excelのオートフィルの機能を使えば省力できますが、それでも時間はかかります。その点、プログラミングができれば、あっという間にカレンダーを作ることができます。
それでは、9月始まりの一年分(365日分)のカレンダーを作ってみましょう。まずは、なでしこ3のWeb簡易エディタ(こちら)を開いて見てください。
そして、エディタに以下のプログラムを貼り付けて「実行」ボタンを押してみましょう。
# 365日分のカレンダーを作成
対象日=「2017/09/01」
対象秒=対象日をUNIXTIME変換
365回、ここから
F曜日=対象日の曜日。
F日付=対象日の「/」をタブに置換
「{F日付}{タブ}{F曜日}」を表示。
対象秒=対象秒+(60 * 60 * 24)
対象日=対象秒を日時変換して「 」まで切り取る。
ここまで
すると、日付をタブで区切った一年分のデータが表示されます。そこで、一年分のこのデータを全選択して、クリップボードにコピーしておきましょう。
2017 (タブ) 09 (タブ) 01 (タブ) 金
2017 (タブ) 09 (タブ) 02 (タブ) 土
2017 (タブ) 09 (タブ) 03 (タブ) 日
...
このタブで区切ったデータが何に使えるのかと言うと、Excelを起動して、左上のセルを選択した状態で、「貼り付け」を実行してみてください。すると、以下の画面のように、各セルに一つずつ値が貼り付けられます。
つまり、直接Excelを操作しなくても、なでしこでデータを作り、それをExcelに貼り付けることで、カレンダーの雛形を作ることができるということです。わずか9行のプログラムで、カレンダーの雛形が完成するのですから便利です。
プログラムを確認してみましょう。このプログラムでは、『N回...ここまで』構文を利用して、処理を365回繰り返し実行します。その繰り返しの中では、日付を出力した後で、日付に1日分を加算していきます。
プログラムの冒頭では、日付をUNIXTIMEと呼ばれる数値へと変換しています。UNIXTIMEとは、1970年1月1日以降からの経過秒のことを言います。これを使うと、日時を数値で表すことができるので、日時の計算が楽になります。例えば、ある日の翌日を得ようと思ったら、86400秒(=60秒×60分×24時間)を足すだけで良いからです。ここでも、カレンダーの日付を進めるために、繰り返しの末尾で、この日付の足し算を行っています。
ちなみに、『UNIXTIME変換』が日付をUNIXTIMEに変換する関数で、『日時変換』がUNIXTIMEを「年/月/日 時:分:秒」の形式に変換する関数です。
不要な項目を表示しないようにしよう
ところで、先ほど作ったカレンダーを見てみると、年・月・日がすべて表示されるために、表が見づらいものになっています。年は冒頭と1月1日の時だけ表示し、月も1日のときだけ表示するように改良してみましょう。
以下のプログラムをなでしこ3のエディタに貼り付けて実行してみてください。
対象日=「2017/09/01」
対象秒=対象日をUNIXTIME変換
前回年=0
前回月=0
365回、ここから
F曜日=対象日の曜日。
D=対象日を「/」で区切る。# --- (*1)
F年=D@0
F月=D@1
F日=D@2
もし、F年=前回年ならば、F年=「」
もし、F月=前回月ならば、F月=「」
「{F年}{タブ}{F月}{タブ}{F日}{タブ}{F曜日}」を表示。
対象秒=対象秒+(60 * 60 * 24)
対象日=対象秒を日時変換して「 」まで切り取る。
前回年=D@0
前回月=D@1
ここまで
プログラムは18行と少し長くなりましたが、このプログラムを実行し、Excelに貼り付け、罫線などの装飾を加えると、以下のような行事予定表のカレンダーを作ることができます。(完成したカレンダーcalendar.xlsx)
プログラムでは、年・月において、前回表示した値を覚えておいて、前回と同じなら空白にするという処理を加えています。
それから、プログラムの(*1)以降の部分ですが、日付データは「年/月/日」と記号「/」で区切られています。そこで、日付データを「/」で区切ると、配列変数Dに[年,月,日]という三つのデータが代入されます。配列変数というのは、一つの変数の中に複数の値を保持することができる変数です。そして、『配列変数名@要素番号』と書くと、配列変数の各要素を取得できます。配列変数については、また、後日詳しく紹介します。
まとめ
以上、今回は、指定回数だけ繰り返す『N回...ここまで』構文を使って、365日分のカレンダーを作ってみました。ここでは、9月始まりのカレンダーを作りましたが、プログラムの冒頭にある『対象日』の値を、任意の日付に変更することで、特定の日から一年分のカレンダーを作ることができます。
市販のカレンダーは、1月か4月始まりのものがほとんどなので、半端な日付から始まるカレンダーが必要な場合、自作しなければなりませんが、このプログラムを利用することで、自作が容易になるでしょう。参考にしてください。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。