新しい作品に挑戦してみよう


<はじめに>

パンフレット本編では、迷路のプログラミングについて学びました。

応用問題では引き続きVBAにて、新要素"配列"を使用したプログラムの作成を行います。




<配列とは?>

配列について簡単に説明します。

配列とは、同じ型のデータを一つの名前で表し、まとめて扱うために用意されたデータ構造です。簡単に説明すると、情報を記憶させておくための箱です。

画像で表すとこのようになります。この場合、配列名が"くだもの"、配列に記憶されている情報が"りんご"、"みかん"、"ぶどう"、"いちご"となります。

配列画像.png




<プログラム概要>

今回作成するプログラムは、シート上に入力した8桁の生年月日から生まれ年の干支と星座を求め、メッセージボックスに出力するというものです。

なお、今回のプログラムでは干支の切り替わりは11日とします。

また、処理を簡潔に行うため2月の最終日は30日とし、うるう年は考慮しておりません。ご了承ください。




<プログラミングを始める前に>

挿入より標準モジュールをクリックしてから、コードを入力して下さい。

(プログラミングパンフレット P.8参照)



<プログラム作成>



↓では実際に作成していきましょう。プログラムの完成図がこちらです↓


全体図1.jpg全体図2.jpgend if.jpg



①  干支用配列"と"星座用配列"それぞれに使用する十二干支及び12星座を入力します

12星座の始まりと終わり、合わせて2つ山羊座のデータが存在するのは、山羊座が12月~1月まで年を跨いでいるためです。"星座各月最終日"とは、それぞれの星座が月ごとに切り替わる日を示しています。また、上記の通り山羊座が星座用配列に2つ存在する関係上、山羊座の切り替わり日も始まりと終わりに合わせて2つ入れています。月用配列は112月までの各月の日数を入れています。

■ 変数・配列の宣言

Dim関数とは

変数に「どのような値だけが代入されるのを許すか」を指定するために使用される関数です。今回の場合、変数のデータ型は"Long"、配列のデータ型は"Variant"と指定されているため、変数N・T・Hに代入できる値(データ)は-2,147,483,648 ~ 2,147,483,647の範囲に存在する整数】、配列[ETO][SEIZA][DAY][MONTH]に代入できる値(データ)は【(数値・文字・日付等含む)すべてのデータ】となります。

Array関数とは

配列内にまとめて値を格納することが出来る関数のことです。本来、配列に値を格納する場合には、ひとつずつ格納場所を指定しながら格納を行う必要がありますが、Array関数を使用することでまとめて格納を行うことが可能となります。

画像1.jpg





②  干支を導き出すため、入力データからN(年)を抽出する処理を行います

 N(年)は配列[ETO]に関係しており、N0となれば十二支の頭である『子』となり、最大は11で『亥』となります。

 今回、干支を導き出す具体的な仕組みは、入力データの左4桁の数を抜き出し、それを12で割った余り(= N)を[ETO]の配列番号に合致させることで生まれ年の干支を求めるというものです。

しかし、入力データをそのまま12で割って余りを出すとズレが生じてしまいます。

例えば子年の場合、配列の0番目にデータが存在するため、12で割った余りは0にならなければなりませんが、実際に計算を行ってみると、余りは4となってしまいます。そのため、今回は4桁の数に8を足し12で割り切れるよう

に調整を行っています。

画像2.jpg



■ Val関数とは?

Val関数とは、指定した文字列を数値データに変換する関数です。

MOD関数による余りを求める計算処理を行う際、割られる数となる年データは必ず数値データでなければなりません。

そのため、入力した年月日のデータが数値以外のデータ型であった場合にも処理が問題なく行えるよう、Val関数によって数値データへの返還を行っています。







③  星座を導き出すため上記の②同様、入力データからT(月)とH(日)を抽出します 

3つめの処理については、Tに入力されている1(月)~12(月)を配列の仕様(0~11)に合わせるために行います。

画像3.jpg







④  入力された文字数と月、日が正常な値であるかをチェックします

文字数は8桁ではないものをエラーとして処理し、エラーメッセージを表示します。

Tは0または11を超えるもの、H2月、4月、6月、9月、11月の場合(T = 135810)は0または30を超えるものを、それ以外は0または31を超えるものをエラーとして処理し、エラーメッセージを表示します。

Hのチェックは、配列[MONTH]に予め各月の最終日を入れておくことで処理が可能となります。



画像4.jpg







⑤  最後に、これまでの処理で求めたデータを用い、干支と星座をメッセージボックスに表示します

HDAYT)を超えている場合は、星座が切り替わるためT+1をして一つ後ろの星座へ、DAYT)以下であればそのままにします。


画像5.jpg



♦  ここまで作成が出来たら、自分の生年月日を入れて試してみましょう。正しく干支と星座が表示されたら成功です




※先頭に0がつく生年月日(西暦1000年未満の生年月日)を入力したい際には、8桁の数の前にシングルクォーテーション( ' )を付けましょう。エクセルでは基本的に数値データの場合、先頭の0は自動で省略され消えてしまいますが、この記号を付けることで文字データへと変換され、消えることがなくなります。また、シングルクォーテーションは文字数にカウントされないため、処理に影響を及ぼすこともありません。



<おわりに>


干支と星座は上手く表示できましたか?

是非ご家族やご友人など、身近な方々とお楽しみいただければと思います。

また、パンフレットと当ホームページの問題を通して少しでもプログラミングの面白さをお伝えできていれば幸いです。

最後まで取り組んでいただきありがとうございました。