2007年9月30日日曜日

○第46回目 条件式の作り方

○第46回目 条件式の作り方

 第43回でとり上げたものを題材にします。

『エクセルマクロから変数を取り出すマクロの説明;
 これを最終行まで繰り返しますが、問題は変数名ではないものまでが入っているということです。一例を挙げれば、数値です。あとは、変数ではあるが、外の場所に記述されているもの、カッコ内のものの一部です。
  i 0 gyo_cnt 2  ←"0","2"は数値
  p1 (AAA)     ←"(AAA)"はほかの場所で必ず出てくるもの
  AAA1 (AAA p1 1) ←"(AAA"、"1)"はカッコ内の一部。
            ← "p1"はカッコ内の一部ですが、その判断ができないので、生かされます。
  dd2(i) i     ← "dd2(i)"は配列変数なので、カッコ内を100にします。』

 とあります。
 変数名の候補から、上の条件で候補を絞ったり、配列変数に加工を施します。

 条件を書いていきますと、
 1.先頭が数字であるものは、対象外
 2.先頭が"("であるものは、対象外
 3.途中に"("がなく、最後が")"であるものは対象外
 4.途中に"("があり、最後が")"でないものは対象外
 5.途中に"("があり、最後が")"であるものは配列の変数
 6.その他のものは、通常の変数

 ここまででだいたい80%完成です。
 後は構成と、機械的な翻訳です
 その他があるので、順番にやっていくしかなそうです。

 変数名の候補を、a$ とします。

 (記述はQXマクロに準じています)
 
 1. Left(a$,1) >= "0" and Left(a$,1) <= "9"    は対象外
 2. Left(a$,1) = "("                  は対象外
 3. instr(a$,"(") = 0 and right(a$,1) = ")"    は対象外
 4. instr(a$,"(") <> 0 and right(a$,1) <> ")"   は対象外
 5. instr(a$,"(") <> 0 and right(a$,1) = ")"    は対象
 6. その他は                       は対象
 となります。

 これをif文で組立てればいいのです。
 1-4までは、対象外なので逆の条件を書きます。
 if Left(a$,1) < "0" or Left(a$,1) > "9" then
 if Left(a$,1) <> "(" then
 if instr(a$,"(") <> 0 or right(a$,1) <> ")" then
 if instr(a$,"(") = 0 or right(a$,1) = ")" then
 if instr(a$,"(") <> 0 or right(a$,1) = ")"  then
   5の処理
 else
   6の処理

 これを段ずれさせ、end ifをifの数だけ追加します。
 if Left(a$,1) < "0" or Left(a$,1) > "9" then
  if Left(a$,1) <> "(" then
   if instr(a$,"(") <> 0 or right(a$,1) <> ")" then
    if instr(a$,"(") = 0 or right(a$,1) = ")" then
     if instr(a$,"(") <> 0 or right(a$,1) = ")"  then
      5の処理
      else
      6の処理
     end if
    end if
   end if
  end if
 end if
 となります。これで完成です。

 ということで、最初の段階の言葉による条件の書きだしが、だいたい80%を占めているという意味がおわかりかと思います。
 いろいろなミスは避けられませんので、チェックは十分必要です。

 練習問題
 変数名と思われるものを抜き出しました。これを更に分類してみましょう。
 分類に基づき、変数名の頭にll01とかを付加していきます。
 変数名の分類する。配列変数(ll01を付加)、文字の配列変数(ll02を付加)、文字用変数(ll03を付加)、間に"_"があるもの(ll04を付加)、一文字のもの(ll05を付加)、二文字のもの(ll06を付加)、定数(ll19を付加)、その他(ll07を付加)
 文字の配列変数…変数配列であり、どこかに"$"がある。(文字変数に$をつけるといいうのは、エクセルマクロでは廃れた記述方法ですが…)
 文字用変数…最後に"$"がある。
 定数…頭の二文字が、ll、lc、lrのいずれかに該当する
 頭に付加する処理は、mm1$(i) = "llxx" & mm1$(i) となります。
 これまでの課題と違うところは、対象外のケースがなく、すべての場合に必要な処理を行なうということです。

0 件のコメント: