2012年10月6日土曜日

○第168回目 QXマクロ、プログラムの構成をつくる

 プログラムから、ポイントとなる用語を含む行のみを残して、プログラムの構造を具現化するといいうマクロです。
 
 用語の候補としては、次のようなものが考えられます。
 Sub、proc、if else end if elseif、do loop、for next、end、'@、○、コメント行、
 exit do、exit for、InputBox
 したがって、上の用語が含まれる行が残ることになります。
 また、
 処理抑止行(ローカル定義。" ''"の行。自分は後で使えそうなコマンドをこの形で残している)は表示しないことにしています。
 論理行数(⇔表示行数)を付加する。
 という機能をも追加します。

 
 これをもとにプログラムの俯瞰図ができる。

 長いマクロの場合、全体像がわかりづらいので、このような俯瞰図を持っておくと、便利なのではないでしょうか。また、入力関係も抜出していますので、InputBox文の周りにコメント行を入れておくと、それも抜出されますので操作マニュアル的なものができます。
 
 マクロとしては簡単です。1行ずつ見ていき、これらの用語が含まれている行だけを残しておけばいいのですから。
 また、指定した範囲内だけの処理としています。
 
 ※このマクロを作った背景…既存のマクロを基に新たなマクロを作っていたのですが、さて処理になったときに、if文の対応がおかしいというメッセージがでました。画面を見ていただけではなかなか分からなかったので、このような機能のマクロがあればいいと思ったのでした。
 

 表示されるコマンドは、次のとおりとなります。
 96 ----'Aグループの番号を取得
 99 ----  for i = 1 to gru_a_cnt
 101 ---  next
 114 ---  for i = 1 to gru_a_cnt
 116 ---   for j = j0 to gru_b_cnt step 1
 117 ---    if gru_a(i, 1) = gru_b(j, 1) then
 122 ---     exit for
 123 ---    elseif gru_a(i, 1) < gru_b(j, 1) then exit for
 124 ---    end if
 125 ---   next
 126 ---   if flag1 = 99 then
 129 ---   end if
 130 ---  next
 となります。
 前に行数と-が入りますので、実質的なコマンドは9桁目からはじまります。

 これでは簡単すぎるので、さらに分析を追加しましょう。
 
  do loopの数と対応
  for nextの数と対応
  ifの数
  end ifの数
  elseの数 などを集計しましょう。

《抽出したコマンド群の内訳分析》  
'@文 -- 3  コメント文 -- 4  exit -- 9
if -- 9  end if -- 9  elseif -- 2  else --0
完結IF文の数(thenの後に処理を書き、そのif文だけで処理が完結しているもの) --0
for -- 8  next -- 8
do -- 4  loop -- 4 
proc --0  Sub --1  end --1  ○ --0

 試してみると、半分ぐらいに短縮しますが、もっと短縮したいというときもあるでしょう。その時は、ある階層以下のものしか表示しないという機能を追加するといいでしょう。
 私のマクロコマンドの書き方では、半角スペース2つ分で、コマンドの字下げをしていますので、半角スペース2つの単位で、表示するコマンドを指定したらどうでしょうか。3と指定すれば、半角スペース単位で6つまでのコマンドが表示され、7つ以上のスペースがあるコマンドは表示されないということになります。TABを使っている場合は、実質的な半角スペースに換算してみてください。
 この追加機能は、これまでのマクロに入れないで、別のマクロで処理した方がいいかもしれません。
 

0 件のコメント: