表紙 へ

[PREV][マクロをつくろう INDEX][NEXT]

マクロをつくろう (3)

条件分岐 (1) ― if を使う

マクロでQXが持っている機能が実行できることはわかりました。その次に必要になってくるのは、場合によって実行したりしなかったり、あるいはどの機能を実行するのか変えたりすることですね。いちばん基本は if を使った条件分岐です。たとえばこんなマクロをごらんください。

 1|  'ファイルを閉じて開く
 2|
 3|  proc main
 4|      dim s$
 5|      if @hwnd = 0 then
 6|          @FileOpen
 7|          exit proc
 8|      end if
 9|      s$ = left$(@Pathname$, inrstr(@Pathname$, "\"))
10|      @FileClose
11|      @@FileOpenDir s$
12|  end proc

ここには if のブロックが5行目から8行目にかけてひとつあります。「if」と「end if」のあいだはインデントを1段深くして、このブロックをわかりやすくしてあります。

「if 〜 then」のあいだにはさまれた「式」、すなわち「@hwnd = 0」が「真(あてはまる)」とき、then のあとに記述された命令が実行されます。ここでは「@FileOpen」を実行してから「exit proc」でマクロを終了しているわけです。(ここに exit proc がなければ、マクロは終了せずに @FileOpen を実行したあと、end if のあとから続けて命令を実行します。if のブロックで分岐したあと、合流することもあるわけです。)

9行目は、現在編集中のファイルのフルパス名(@Pathname$)のなかから、いちばん後ろの「\」までの文字列を切り出しています。切り出された結果(ファイルのあるパス)が変数「$s」に入ります。11行目ではこのパスで「開く」ダイアログを表示しています。

ここで「if」についてのマクロヘルプを見てみます。

if .. then .. end if ステートメント 

構文1   if condition1 then
                ステートメント1...
        elseif condition2 then
                ステートメント2...
        else
                ステートメント3...
        end if

構文2   if condition then ステートメント

機能1
 condition1 が0以外の時 ステートメント1を実行します。
 condition1 が0で、condition2 が0以外の時 ステートメント2を実行します。
 どちらでもないときは、ステートメント3が実行されます。

 elseif condition then は任意の数だけ記述できます。

機能2
 condition が0以外の時 ステートメントを実行します。

condition とは「条件分岐」の判断基準となる「式」のことです。ここが「0以外の時」というのは「真(あてはまる)」ときのこと。で、条件はひとつとは限らないので、たくさんの場合があるとき、「1のケースの場合」、「2のケースの場合」、「3のケースの場合」……と分岐するには、最初が「if」、残りが「elseif」、そのどれにもあてはまらない場合が「else」、if ブロックのしめくくりが「end if」となります。

途中の elseif の項目はいくつあってもいいのですが、順に「あてはまる」ものから内容を実行しますので、ある項目であてはまった場合、それ以後の項目であてはまっても実行されません。

if で評価(判断)する式には and や or も使えますので、「AかつB」という式も書けます。たとえば「変数 num が 50 より大きく、かつ、変数 string$ の内容が半角 80 文字より長い」という条件は「if num > 50 and len(string$) > 80 then」というふうに書きます。

また、if ブロックはこんなふうに「入れ子」にできます。

if num > 50 then     'num が 50 より大きいとき
    if i > 1 then
        A
    elseif i = 1 then
        B
    else
        C
    end if
else                    'num が 50 までのとき
    if i > 1 then
        D
    elseif i = 1 then
        E
    else
        F
    end if
end if

if ブロックの内容の実行のあと、ブロック内で「exit proc」によってマクロを終了させていなければ、マクロは if ブロックのあとで続けて実行されます。分岐したあとでどこに合流するのか、きちんと把握してないと誤動作の原因になりますので、入れ子にしたときは特に注意しましょう。

ヘルプの「機能2」は、1行で条件にあてはまるときに実行する命令まで記述してしまうやりかたです。「あてはまるとき」のみが記述できます。この書式では elseif や else は使えませんが、end if を省略できます。

[PREV][マクロをつくろう INDEX][NEXT]