マクロの概要(入門用) 見本 2(Ver9.34対応版)
見本2
この見本では、ユーザーからの入力を受け取る方法、配列変数の使用方法、サブルーチンの使用方法、剰余の使い方、グローバル変数とローカル変数などの動作と記述方法をお見せします。
秀丸エディタを起動し、新規作成の状態にし、このヘルプファイルのマクロ部分(破線で囲まれた部分)をコピーしたものをペーストして、マクロファイルとして名前(CalculateEto.mac)をつけてマクロファイル用のフォルダに保存してください。
保存するファイルの種類は「秀丸マクロファイル(*.mac)」です。
わかりにくい場合は、当ヘルプの「
マクロの登録と実行について」を参照してください。
「マクロ」→「マクロ実行」を選択すると、入力ボックスに西暦の数値を入力すると、ダイアログボックスに干支を表示します。「キャンセル」が押されるまで繰り替えしマクロが実行されます。
以下がマクロ部分です。
以下がマクロ部分です。 |
//十二支を表す配列変数を作成
$eto[0] = "『子』(ねずみ)";$eto[1] = "『丑』(うし)";
$eto[2] = "『寅』(とら)";$eto[3] = "『卯』(うさぎ)";
$eto[4] = "『辰』(たつ)";$eto[5] = "『巳』(へび)";
$eto[6] = "『午』(うま)";$eto[7] = "『未』(ひつじ)";
$eto[8] = "『申』(さる)";$eto[9] = "『酉』(とり)";
$eto[10] = "『戌』(いぬ)";$eto[11] = "『亥』(いのしし)";
//配列計算用基準年度を設定
#base_year = 1900;
//メインのマクロ部分
while( 1 ){
$value = input("干支を知りたい西暦を半角数字で入力してください \n数字以外を入力すると西暦0年の干支を表示します \nキャンセルでマクロを終了します");
if( !result )break;
#year = val($value); //文字列を数値に変換
call CalculateEto(#year); //サブルーチンの呼び出し
}
endmacro;
//ここでマクロを終了
//サブルーチン部分
CalculateEto:
##mod = ( ##1 - #base_year ) % 12;
//基準年度「#base_year」と入力された西暦(パラメータ)の
//差の12の剰余(余り)を計算させる
if ( ##mod < 0 ){ //余りが負だと正の数と同じになるように補正
##mod = 12 + ##mod;
}
message "入力された" + str(##1) + "年の干支は" + $eto[##mod] + "です";
return;
|
マクロ部分はここまでです。
このマクロで作者が意図した命令は、以下のとおりです。
「input」関数で西暦の数値を入力すると干支を表示します。
「while」文の無限ループを利用し、「キャンセル」が押されるまでマクロを実行させます。
次にマクロの詳しい動作説明です。
コメント(説明)が多くて見にくいですが、処理の流れと内容を読み取ってください。
以下がマクロ部分です。 |
//十二支を表す配列変数を作成します
//この配列を使用するのはサブルーチンだけですが、
//メインのマクロから呼び出されるたびに配列が初期化されるので、
//グローバル変数で定義したほうが処理が早くなります
//このように書き換えがされない(変化のない)配列変数はグローバル変数として
//定数のように扱ったほうがよい場合があります
$eto[0] = "『子』(ねずみ)";$eto[1] = "『丑』(うし)";
$eto[2] = "『寅』(とら)";$eto[3] = "『卯』(うさぎ)";
$eto[4] = "『辰』(たつ)";$eto[5] = "『巳』(へび)";
$eto[6] = "『午』(うま)";$eto[7] = "『未』(ひつじ)";
$eto[8] = "『申』(さる)";$eto[9] = "『酉』(とり)";
$eto[10] = "『戌』(いぬ)";$eto[11] = "『亥』(いのしし)";
#base_year = 1900;
//配列変数のインデックスが0の西暦を基準年度として代入します
//しかし、この変数もマクロが動作している間に書き換えられることのない
//定数ですので、グローバル変数として定義します
//この基準年度と入力された西暦の差の12の剰余(余り)を計算することによって、
//干支を定義した配列のインデックスを求めます
//また、基準年度以下の西暦を入力されると剰余の計算をさせていますが、
//マイナス側の剰余はプラス側の剰余と反転しています
//よって、if文で剰余の答えがマイナスなら反転させる再計算させています
//西暦の年数は年齢に合わせた入力が多いと考えられますので、
//ある程度古い年のほうが計算が少しでも速くなります
//メインのマクロ部分
while( 1 ){
//while文の条件式に「1」を指定することにより無限ループさせます
$value = input("干支を知りたい西暦を半角数字で入力してください \n数字以外を入力すると西暦0年の干支を表示します \nキャンセルでマクロを終了します");
//キャンセルならresult==false
if( !result )break;
#year = val($value);
//文字列を数値に変換します
//文字列が入力された場合など、
//数値に変換できなければ「val」関数は「0」を返します
call CalculateEto(#year);
//サブルーチンにパラメータ(入力された西暦)をつけて呼び出します
}
endmacro;
//ここでマクロを終了させます
//この終了させる文「endmacro」がないと、
//下部にあるサブルーチンが実行されます
//サブルーチン部分
CalculateEto: //サブルーチン名を定義します
##mod = ( ##1 - #base_year ) % 12;
//「call CalculateEto(#year);」では
//パラメータに数値型を使用していますので、
//ローカル変数「##1」でパラメータを受け取ります
//基準年度「#base_year」と入力された西暦(パラメータ)の
//差の12の剰余(余り)を計算させます
if ( ##mod < 0 ){
//基準年度より入力された西暦(パラメータ)のほうが少ないと
//計算結果「##mod」はマイナスになります
##mod = 12 + ##mod;
//正の数と負の数では余りの出方が違う(反転する)ので
//正の数と同じように補正します
}
message "入力された" + str(##1) + "年の干支は" + $eto[##mod] + "です";
//パラメータの「##1」は数値型変数なので「str」関数で文字列型に変換します
//表示するメッセージを配列変数を使って組み立てます
return;
//このサブルーチンは戻り値を返しません
|
上記のマクロについての補足説明
メインのマクロ部分で配列と基準年度を定義すると、干支を計算し表示するサブルーチンの独立性がそこなわれます。再利用する場合は若干手を入れなくてなりません。
この見本は、構造化プログラミングに反するプログラムになっています。
しかし、このマクロではあえて定数として取り扱っています。
理由は、サブルーチンの見本として作成していることと、コンピュータに余計な処理を増やさないためです。
処理が多くなればなるほど記述エラーや内部エラーなどが増えます。
短い記述で処理を少なくし、目的を達成させることも重要です。