2008年2月16日土曜日

第81回目 図形作成システムの完成度を求めて(その4)

○第81回目 図形作成システムの完成度を求めて(その4)

 実際にこのマクロシステムを動かして図を作成してみると、この機能を追加したらやりやすくなるのではないかという、ことに直面しました。
 そこで、これらの機能を選択して、必要と思われるものを追加することにします。

 1.図形番号の並べ替え
 2.図形のグループ化及び解除
 3.図形のサイズ等を合わせる
 4.図形の種類の変更(四角形から円へ変更など)
 としました。
 また、図形番号の指定で、これまでは、一つの図形、一連の番号の図形のどちらかだけしか指定できませんでした。番号が飛んだ時は、その分だけ操作が増えます。番号を変えて同じことの繰り返しとなりますので、これもあわせて改善します。

 5.飛び飛びの図形の指定を可能にする(一例では、"1-3.5.8.9-12"などという指定の仕方です。これで、1.2.3.5.8.9.10.11.12の図形が指定されます。当然、現機能である、最初と最後の省略、全図形の指定もそのままとします)

 5.の"飛び飛びの図形が指定できる機能"が非常に便利です。いろいろなマクロに繋がりますので、有効度はかなりアップしますので。

 今までの機能は、入力値から、no1とno9を求めるものでした。そして、実際の処理のマクロでは、for文で、i = no1 to no9として処理をコントロールしていました。
 今後は、no1とno9の代わりに、zz_no(i)にno1からno9の値を入れ、zz_no(i)とそれの有効値の数のzz_no_maxでコントロールします。
 for k=1 to zz_no_max
  処理
 next k
 となります。
 既存のマクロでの"処理"の中は、今までの図形番号であるiでコントロールされています。そこで処理にはいる前に、i=zz_no(k)として、iに図形番号を入れれば、中の処理は変えなくてもいいことになります
 そこで新しい形は、
 for k=1 to zz_no_max
  i=zz_no(k)
  処理
 next k
 となります。
 したがって、図形番号の入力値から、zz_no(k)を作り上げればいいことになります。
 入力値は、現在の"4-12"、または"2"という形から、"2.2-12.14.16-18"とかいう形になります。(区切り記号として"."を使ったのはその方が、","より入力しやすいからです)
 よくみると、"2.2-12.14.16-18"の入力値を"2"."4-12"."14"."16-18"と区分してみれば、既存のものはそのまま使えることがわかります。
 手順はこうなります。
 "2"をとりだして、no1=2とno9=2という結果を得ます。そしてその結果から、zz_no(k)
に、2を入れてやります。kの最初は1です。最初の処理を終えますと、次の処理には2から始めればいいことになります。一つの処理で入れる数は、(no9-no1+1)個となります。
 そこで、最初にii5=0とおいて、処理が終わった時に、(no9-no1+1)を加算します。
 二つは、"4-12"ですので、no1=4とno9=12となり、それをzz_no(ii5+1)から入れ始めてzz_no(k)(ii5+9)で終わります(9=12-4+1)。
 そして、ii5=ii5+9と更新します。
 この繰り返しとなります。

        ┏━━━━━━━━━━━━━━━━━┓
 入力値 ┃既システム┏━━━━━┓         ┃ zz_no(k)
 を切り⇒┃ z_no⇒   ┃番号の分解┃⇒no1とno9  ┃⇒に4から
 分け   ┃ 4-12     ┗━━━━━┛   4と12   ┃ 12の9個を
 4-12   ┗━━━━━━━━━━━━━━━━━┛ に格納

 次に、"2.2-12.14.16-18"の入力値を"2"."4-12"."14"."16-18"に切り分けることです。
 "."の位置を求めることが必要です。そして、そこまでの文字列を取り出します(Left関数です。入れる先の変数は既存のz_noです)。

 取り出した後は、元の文字列から"2."は不要になりますので、それを除いたものを求めます。これはMid関数です。
 さて、最後はどうなるしょうか。最後の一個前が、"."がない状態になります。
 "."がないので、求める文字列は全部となります。そして、その文字列は不要になるのでそれを除くと、ヌルとなります。
 本当の最後は、文字列がヌルという条件になります。このときにループを抜け出します。
 大きな枠組みは、"do loop"の無限ループとなります。
 位置としてp1はすでに-のために使われていますので、"."の位置は、p2とします。
 今までの入力値z_noは位置づけが変わったので、入力値を新しい変数としましょう。"z_no0"とでもしたらどうでしょうか。それを更新して切り捨てていった文字列を入れておく変数を"z_no15"とでもしておきましょう。

'図形番号の切り出し、格納 と銘うってみましたが、ちょっとおおげさだったかしら。

'図形番号の切り出し、格納
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
=⇒既存のシステムへ

 あとは最後の処理です。
 no1とno9を求めた後です。

For i = no1 To no9
zz_no(ii5 + (i - no1 + 1)) = i
Next i
ii5 = ii5 + (no9 - no1 + 1) ' ii5を更新して、最初に戻ります。

Loop


 一から作るのではなく、既存のものを修正するので、難しいと思います。
 これだけの処理を一行ずつデバックして、チェックする必要があります。それがないと混乱の迷路に陥るでしょう。
 Loop終了後に、 zz_no_max = ii5を忘れずに。
 zz_no(k)、zz_no_max はモジュール変数の定義となります。

0 件のコメント: