2008年3月16日日曜日

第85回目 図形作成システムの更なる完成度を求めて(その2)

○第85回目 図形作成システムの更なる完成度を求めて(その2)

 続きです。
 3.図形番号の設定の改善
 この機能の目的は、飛び飛びの図形番号を指定できるようにするということです。
 今までは、全部の図形、一つの図形、ある番号からある番号までの図形のいずれかという指定の仕方しか出来ませんでした。
 一つの図形及びある番号からある番号までの図形を複数個指定できるようするものです。例えば、3.5-9.11.16.20-28とか指定します。
 この意味は、解説するまでもなく、3.5.6.7.8.9.11.16.20.21.22.23.24.25.26.27.28の図形を指定しているものです。
 複雑かなと思っていましたが。、意外とすっきりしていました。
 今までの機能では、
 3が入れば3と3
 5-9が入れば、5と9
 というのが出力されます。
 この機能をそのままにして、1.出てきた結果を格納し、2.必要なだけ繰り返す、という二つの機能を追加すればいいのでした。
 番号を格納する変数を、zz_no(200)としました。これはモジュール変数です。モジュールの最初に記述してください。
 この変数の中には、上の例では、3.5.6.7.8.9.11.16.20.21.22.23.24.25.26.27.28とうものが、順番に格納されます。zz_no(1)=3、zz_no(2)=5とかいうようにです。
 既存の機能での出力は、no1とno9となります。ですから
 for i= no1 to no9
  zz_no(i-no1+1) = i
 next i
 となります。
 これまの処理で何個(ii5)か格納されているので、正確には
  zz_no(ii5+i-no1+1) = i
 となります。

 頭に戻りまして、入力値を3とか5-9とかに切り分ける処理です。
 これも"."の位置を取得すればいいことになります。
 その位置の前の部分が、既存の処理の入力値となります。
 そして、次の回の処理には、その部分を除いたもので処理を続ければいいことになります。
 最初はいいのですが最後はどうなるでしょうか。実質的な最後は、"."がなくてヌルでないということになります。次の回の処理は、使った部分は捨てられますので、文字列はヌルになります。ここでループを出ることになります。
 入力値 3.5-9.11.16.20-28
 最初の切り出し 3。残りは、5-9.11.16.20-28
 次の切り出し 5-9。残りは、11.16.20-28
 次の切り出し 11。残りは、16.20-28
 次の切り出し 16。残りは、20-28
 次の切り出し 20-28。(この段階で"."はない)残りは、ヌル
 次の切り出し ヌルなのでループを抜ける。

 格納した図形の数(ii5)は、初期値が0で、各回の処理ごとの図形の数を加算していきます。各回の図形の数は、"no9-no1+1"となります。

 最初の部分は次のようになります。
 Do
'終了は、文字がない時
If z_no15 = "" Then Exit Do

p2 = InStr(z_no15, ".")
If p2 = 0 Then
z_no = z_no15 '最後の場合
z_no15 = ""
Else
z_no = Left(z_no15, p2 - 1)
z_no15 = Mid(z_no15, p2 + 1)
End If
z_no は既存の処理で使われる変数。
 【既存の処理】

 後の処理は、図形番号の格納ですが、つぎのようになります。
 For i = no1 To no9
  zz_no(ii5 + (i - no1 + 1)) = i
 Next i
ii5 = ii5 + (no9 - no1 + 1)
Loop
 最後に
zz_no_max = ii5 として最終的な図形の数を格納しておきます。
 ※zz_no_maxはモジュール変数です。

 すでに、図形番号の指定はサブルーチン化していますので、一つ修正すればよいことになります。しかし、今回は出力値が変わってきますので、サブルーチンの読み込んだマクロ側の修正が必要とあります。
 今までの出力値は、no1とno9でしたが、これからはzz_no(i)と zz_no_max です。
 ですから処理側では、今までは
 for i = no1 to no9
  ActiveSheet.Shapes(i).Select
  処理
 next i
 となっていましたが、今後は、
  for i=1 to zz_no_max
   j= zz_no(i)
  ActiveSheet.Shapes(j).Select
    処理
  next i
 となります。
 図形の削除など、逆から進むものもありますので注意願います。
 この場合は、一行目のステップが
  for i= zz_no_max to 1 step -1 となります。
 ※"no1 to no9"、"no9 to no1"、"no1"、"no9"などの文字列で、モジュール内の該当箇所を探してください。意外と修正漏れがあるものです。

0 件のコメント: