マクロの概要(入門用) 見本 2(Ver8.10対応版)
見本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;
//このサブルーチンは戻り値を返しません
上記のマクロについての補足説明
メインのマクロ部分で配列と基準年度を定義すると、干支を計算し表示するサブルーチンの独立性がそこなわれます。再利用する場合は若干手を入れなくてなりません。
この見本は、構造化プログラミングに反するプログラムになっています。
しかし、このマクロではあえて定数として取り扱っています。
理由は、サブルーチンの見本として作成していることと、コンピュータに余計な処理を増やさないためです。
処理が多くなればなるほど記述エラーや内部エラーなどが増えます。
短い記述で処理を少なくし、目的を達成させることも重要です。
戻る 目次  

戻る