表紙 へ

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

マクロをつくろう (2)

マクロファイルの構造

QXのマクロファイルは、拡張子が「 MAC 」のテキストファイルです。QXのマクロは Visual Basic (ビジュアル・ベーシック)というプログラム言語に沿ったもので、その点では Microsoft Word や Microsoft Excel のマクロに似ています。

とはいえ、実際に書く上で、それほど Word のマクロに似ているわけではありません。というのも、基本的にQXのいろいろな動作を自動的に実行させるのがマクロなので、QX固有の命令が多いのです。しかし、固有のものはすべてヘルプを参照しつつ書くことができるので、マクロにおいて重要なのは、「どのような順序で実行させるか」という面、すなわち、ロジックであり設計であると思います。「ああやって、で、こうやって、で、結果がこうならコレで、でなければこう」という手順を文章で書ければ、これをマクロで書くことができます。

さて、マクロファイルですが、いちばん基本はこういう構造です。

'最初にコメントとしてマクロの内容(または名前)を入れる
proc main
    dim num, string$ (などと使用する変数を定義)
    (命令いろいろ)
end proc

ファイルの1行目(必要に応じて、説明が数行にわたることもあり)は、コメント行として、1文字目を「'」とし、そのあとにこのマクロの名前、あるいは内容説明を書きます。この1行が「マクロ一覧」でファイル説明として表示されます。

Visual Basic に準じて、命令のひとかたまりが「proc」になっています。(proc は procedure 手続き の略語。いくつかのことを、この順に実行する、という意味ですね。) ひとつのマクロファイルにひとつだけマクロを書くとき、この proc は「main」という名前にします。すなわち、「proc main」に始まり、「end proc」で終わる、この全体が「main」という「proc」です。

変数の宣言 ― この proc のなかでのみ使う変数(や定数)は、proc の中で定義(型を決めて宣言)します。マクロファイルに他の proc や function があり、そこでも共通して使う変数(や定数)は、ファイルの先頭に proc main の行より前に書きます。(が、これはちょっと複雑な話なので、ちょっと置いときましょう。)

ここでは「num」という変数と「string$」という変数が宣言されています。変数の型は指定しなくてよいのか、というと、じつは「string$」についている「$」がミソで、これがついているのは「文字列変数」である、と自動的に決まるのです。これがついていない「num」については、「数値変数、しかも長整数型」と自動的に決まります。このふたつの型が変数の基本です。もっとくわしいことはマクロヘルプでどうぞ。

では、マクロファイルの実例を見てみましょう。(QXのマクロヘルプより)

 1|  '文書に MACRO TEST と入力する
 2|  proc main
 3|      if @hwnd = 0 then exit proc
 4|      @Input "MACRO TEST"
 5|  end proc

上の例で、左はしの数字は行番号です。「書式設定」−「表示」で「行番号の表示」にチェックを入れると、編集画面で行番号が表示されるようになります。マクロファイルの書式はこの行番号を表示にして、「書式設定」−「行桁」で、「行の数え方」を「改行で1行」(論理行モード)にしておくのが基本です。マクロにエラーがあるとQXがエラー・メッセージを表示しますが、そのとき論理行で「何行目にこういうエラー」というように表示されます。

1行目はこのマクロの内容。上記のように、この1行が「マクロ一覧」で説明として表示されます。この例では変数を使用していないので、変数を宣言する行はありません。

インデント ― 「proc main」と「end proc」のあいだ全体が、1段インデント(タブまたは半角スペース4つ)になっています。これはマクロの作法(広くはプログラミングの作法)とでもいうべきもので、ひとつのブロックのまとまりをわかりやすくするためにやっています。マクロが複雑になってくると、if や loop のブロックが何重にも「入れ子」になります。きちんとインデントしてマクロを書くと、自分でもマクロの構造がきちんと把握できますし、ほかの人が読んでもわかりやすくなります。

編集中の文書はあるか ― 3行目は「編集中の文書があるかどうか」を調べて、編集中のものがなければマクロを終了する、という命令です。「@hwnd」は現在編集中の文書の「ハンドル」で、編集中のファイルのひとつひとつに一つの数字があてられています。このハンドルが「0」である、ということは編集中のファイルがない、ということで、「if 〜 then」のあとにこの「if」の判断が「真(これがあてはまる)」であるとき、どんな動作をするかを書きます。ここでは「exit proc」すなわち、proc から抜ける、マクロを終了する、という動作が設定されています。

マクロでは編集中のファイルがないときは無意味な(あるいはエラーになる)ものも多いので、編集中のファイルについて何か作業をするマクロには、この1行をそのままマクロの最初に入れておくのが基本です。

QXの機能を実行 ― そういうわけで、このマクロで「目に見える動作」をしているのは、4行目の「@Input "MACRO TEST"」だけになります。このマクロファイルを一度でも名前と拡張子「mac」をつけて、(使いたいならマクロフォルダに)保存していれば、「*.mac」について保存してある書式設定にしたがってファイルが表示されているはずです。「まずは準備」での解説に従ってマクロヘルプが「ヘルプファイル」に指定され、カーソル上の単語でヘルプを開く設定ができていれば、この「@Input」という単語にカーソルをのせて右クリックから「マクロヘルプ」で、これが「カーソル位置に指定した文字列を入力する」メソッドである、とわかります。あるいは、自動で表示されないときは、この単語をコピーして「ヘルプ」を開き、「キーワード」にペーストして検索すると便利です。

「マクロヘルプ」では「@Input」の「書式」は、「@Input string」となっています。この string は「文字列」のことで、文字列変数がここにきてもよし、直接文字列を指定してもよし、ということです。この例では、文字列であることを示す「"」でくくって直接指定しています。

QXのメソッド(何かを行う機能)やプロパティ(状態設定の機能)には、先頭に「@」がひとつついたものと、ふたつついたものとがあります。ひとつのものは「現在フォーカスがあるファイルについてだけ作用する」もの、ふたつのものは「QX全体について作用するもの」となっています。

このマクロは、1行目にもあるように、編集中の文書に「MACRO TEST」という文字列を書込みます。マクロファイルそのものを開いたまま実行すると、UNDO が必要です。マクロファイルが隠れるように「ファイル」−「新規作成」で無題ファイルを開き、その状態でメニューから「マクロ」−「マクロmain実行」でマクロを起動して確認するほうがいいでしょう。

バリエーション ― 「@Input」ではなく、「print」にすると、QXのステータスバーに「MACRO TEST」と表示されます。(ステータスバーが表示されていないと、何も起きません。) また、「@Input "MACRO TEST"」の1行を「call msgbox("MACRO TEST")」とすると、「MACRO TEST」というメッセージの下に「OK」ボタンのあるメッセージボックスを表示します。この命令は、マクロで何かを実行したときの確認に便利です。

そういうわけで、QXのマクロは最低限の構造のなかに、QXの命令を書いていけばそれでできあがります。自分が実行したい内容についてはどういう命令を使えばいいのか、調べたいときは、マクロヘルプから「プロバティ・メソッド一覧」−「用途別」で探してください。また、マクロだけで使えるステートメントなどについても、マクロヘルプから「用途別ステートメント / 関数」で調べることができます。

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