○第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 はモジュール変数の定義となります。
2008年2月16日土曜日
登録:
コメントの投稿 (Atom)

0 件のコメント:
コメントを投稿