○第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 件のコメント:
コメントを投稿