○第82回目 図形作成システムの完成度を求めて(その5)
今回は、前回取り上げたうちの3と4を取り上げます。
3.図形のサイズ等を合わせる
4.図形の種類の変更(四角形から円へ変更など)
まずは、下の4から、
これは、図形の作成を原型に使います。図形の変更のコマンドはどうなるのでしょうか。この一点にかかっています。
見当がつかないので、2003でマクロの記録をとって、2007に移植します。
結果は、
ActiveSheet.Shapes("Rectangle 147").Select
Selection.ShapeRange.AutoShapeType = msoShapeRoundedRectangle
となりました。
ということで、図形を指定した後に、
Selection.ShapeRange.AutoShapeType = の後に、図形の種類を書いておけばいいことになります。
この考えをもとに、コピーした図形の作成を直してください。
(図形の指定は前回のものを使えば、飛び飛びに処理が出来ます)
3.図形のサイズ等を合わせる
は、二つの図形番号が必要です。一つは元になる図形番号です。残りは、変えたい図形群です。
図形の番号を指定するわけですので、それぞれ区分してわかるようにしてください。元の番号は、オリジナルから、orgをつけておきました。
決めなくてはいけないのは、何をコピーするかです。
筆者は、大きさのほかに、文字のフォント情報、文字の位置情報、図形の色としました。
まず、元となる図形の必要情報を取っておきます。
ActiveSheet.Shapes(no_org).Select
hig = Selection.ShapeRange.Height
wid = Selection.ShapeRange.Width
fo_na = Selection.Font.Name
fo_sty = Selection.Font.FontStyle
iro = Selection.ShapeRange.Fill.ForeColor.SchemeColor
ichi1 = Selection.VerticalAlignment
ichi2 = Selection.HorizontalAlignment
そして、コピーしたい図形に適用します。
'サイズ等の変更
Selection.ShapeRange.Height = hig
Selection.ShapeRange.Width = wid
With Selection.Font
.Name = fo_na
.FontStyle = fo_sty
End With
Selection.ShapeRange.Fill.ForeColor.SchemeColor = iro
Selection.VerticalAlignment = ichi1
Selection.HorizontalAlignment = ichi2
という感じになるでしょうか。
これらのプロパティにかかるコマンドは、取得と設定の二つの役割りが、イコールの前後に何があるかによって定まります。一つ知れば、二つわかるというパターンのものです。
この機能と飛び飛び指定の機能を使うと作業が格段に短縮化されます。
飛び飛びの機能はあらゆる番号指定のパターンをカバーしていますので、非常に作業の省力化に役立ちます。
飛び飛びの昨日を考慮すべきものは、未来系も含めて、
図形の移動_整列もどき、図形のサイズの変更、図形の削除
図形ライン_コネクタの修飾、ラインの太さ、矢印の向き
図形_色の選択、図形の順序、図形の外枠の設定_消去
図形の整列、文字の変更、文字の配置、図形のグループ化及び解除
図形のサイズ等を合わせる
図形の種類の変更
となります。
2008年2月23日土曜日
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 はモジュール変数の定義となります。
実際にこのマクロシステムを動かして図を作成してみると、この機能を追加したらやりやすくなるのではないかという、ことに直面しました。
そこで、これらの機能を選択して、必要と思われるものを追加することにします。
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月10日日曜日
第80回目 図形作成システムの完成度を求めて(その3)
○第80回目 図形作成システムの完成度を求めて(その3)
2.実際の図形のコネクタの状況から、図形作成管理表のコネクタ情報を更新する
これは違った意味で難しかったです。どのようなコマンド(正式にはプロパティというようだが)を使ったらよいのかがわからない、という点です。これはいろいろなところを探し回るしかありません。
なんとなくこんなコマンドだというのがわかったあとでも、正確な記述例がないために、その後もエラーが発生しその原因解明に四苦八苦しました。
説明文の記述には、Dim文で as shape として定義して、そこをイコールで結べ(代入ということ)ばよい、ということだったが、それが動かない。
結局は二つのことがわかりました。
・エクセルのマクロにはshapeという定義がない。その代わりにObjectとして定義する必要がある。
・Objectに代入するには、Set文で代入する。
そんなことでやっと、コネクタの始点がついている図形の番号、終点がついている図形の番号、始点のついている箇所(上とか下とか左とか右とか)、終点のついている箇所、を取得することが出来ました。
コネクタを中心に見て、コネクタの始点がついている箇所です。(終点はBeginの代わりにEnd)
Dim kk0 As Object
cone0_si(j) = Selection.ShapeRange.ConnectorFormat.BeginConnectionSite
'cone0_siは、コネクタ_始点_サイトという意味
Set kk0 = Selection.ShapeRange.ConnectorFormat.BeginConnectedShape
kk0.Select
図形は、Objectとして取得します。
次にこの図形の図形番号は?
これも難しい。
Selection.ShapeRange.Indexは動くのですが、その内容がどの番号なのかわかりません。そこでNameをとり、全部の図形のNameと比較して、目指す図形番号を取得することとしました。
'図形番号の判断
kk0.Select
obj_name = Selection.Name
For k = 1 To ii9
ActiveSheet.Shapes(k).Select
If Selection.Name = obj_name Then Exit For
Next k
cone0_ob_no(j) = k 'コネクタ_始点_オブジェクト_番号という意味
後は、セルへの書き込みです。コネクタ情報のエリアは、19列目から4列ありますのでそこに、順番に書き込みます。全件なので無条件に6行目から書き込みます。
コネクタの情報は、始点の図形番号、終点の図形番号、始点の図形にコネクタがついている場所、終点の図形にコネクタがついている場所の順で四項目となっています。
整理すると、
1.図形がコネクタかどうかの判定。ここでコネクタの数を求めておく。
2.始点の図形の名前から図形番号を求め、コネクタのついている場所を求める。
3.終点の図形の名前から図形番号を求め、コネクタのついている場所を求める。
4.図形作成管理表の所定のセルにコネクタの数だけコネクタ情報を書き込む。19列目、6行目から。
※前回の図形の位置情報の件ですが、自分たちが設定することから考えれば、セルとか行とかを基準として行なうべきです。しかしながら、状況によっては手作業で動かさざるを得ない時があります。そのとき、現時点のシステムでは不整合が生じてしまいます。その対応を考えています。
具体的には、セルを基準としたもののほかに、セルでは表現できない余りをもっておくことで対応することを考えています(通常はゼロ)。位置情報エリアに行列あわせて2列追加すればいいことですから、それほどの修正ではありません。いや待て、四列必要となりそうです。ほかの箇所にも影響が出そうです。図形描画エリアを大きく右に動かしましょう。
この修正を行なう場合、図形情報を書き込む場所がずれてきます。列番号がずれてきます。この変更は大変ですね。
そのために、列番号の定数には変数をあてがっています。10列目は、lc010となっています。これが2列ずれると、一括変換でlc010をlc012に変換して、lc012に12をセットしておけばいいのです(これも一括変換できます。lc012 = 10をlc012 = 12にすればいいのです)。かなり修正が簡単になります。問題は、ほかにlc010を含む変数等があった場合です。これはほとんど考えられませんので、ほとんど大丈夫なのです。10を12に変換する場合は、こうは簡単にいかないでしょう。
2.実際の図形のコネクタの状況から、図形作成管理表のコネクタ情報を更新する
これは違った意味で難しかったです。どのようなコマンド(正式にはプロパティというようだが)を使ったらよいのかがわからない、という点です。これはいろいろなところを探し回るしかありません。
なんとなくこんなコマンドだというのがわかったあとでも、正確な記述例がないために、その後もエラーが発生しその原因解明に四苦八苦しました。
説明文の記述には、Dim文で as shape として定義して、そこをイコールで結べ(代入ということ)ばよい、ということだったが、それが動かない。
結局は二つのことがわかりました。
・エクセルのマクロにはshapeという定義がない。その代わりにObjectとして定義する必要がある。
・Objectに代入するには、Set文で代入する。
そんなことでやっと、コネクタの始点がついている図形の番号、終点がついている図形の番号、始点のついている箇所(上とか下とか左とか右とか)、終点のついている箇所、を取得することが出来ました。
コネクタを中心に見て、コネクタの始点がついている箇所です。(終点はBeginの代わりにEnd)
Dim kk0 As Object
cone0_si(j) = Selection.ShapeRange.ConnectorFormat.BeginConnectionSite
'cone0_siは、コネクタ_始点_サイトという意味
Set kk0 = Selection.ShapeRange.ConnectorFormat.BeginConnectedShape
kk0.Select
図形は、Objectとして取得します。
次にこの図形の図形番号は?
これも難しい。
Selection.ShapeRange.Indexは動くのですが、その内容がどの番号なのかわかりません。そこでNameをとり、全部の図形のNameと比較して、目指す図形番号を取得することとしました。
'図形番号の判断
kk0.Select
obj_name = Selection.Name
For k = 1 To ii9
ActiveSheet.Shapes(k).Select
If Selection.Name = obj_name Then Exit For
Next k
cone0_ob_no(j) = k 'コネクタ_始点_オブジェクト_番号という意味
後は、セルへの書き込みです。コネクタ情報のエリアは、19列目から4列ありますのでそこに、順番に書き込みます。全件なので無条件に6行目から書き込みます。
コネクタの情報は、始点の図形番号、終点の図形番号、始点の図形にコネクタがついている場所、終点の図形にコネクタがついている場所の順で四項目となっています。
整理すると、
1.図形がコネクタかどうかの判定。ここでコネクタの数を求めておく。
2.始点の図形の名前から図形番号を求め、コネクタのついている場所を求める。
3.終点の図形の名前から図形番号を求め、コネクタのついている場所を求める。
4.図形作成管理表の所定のセルにコネクタの数だけコネクタ情報を書き込む。19列目、6行目から。
※前回の図形の位置情報の件ですが、自分たちが設定することから考えれば、セルとか行とかを基準として行なうべきです。しかしながら、状況によっては手作業で動かさざるを得ない時があります。そのとき、現時点のシステムでは不整合が生じてしまいます。その対応を考えています。
具体的には、セルを基準としたもののほかに、セルでは表現できない余りをもっておくことで対応することを考えています(通常はゼロ)。位置情報エリアに行列あわせて2列追加すればいいことですから、それほどの修正ではありません。いや待て、四列必要となりそうです。ほかの箇所にも影響が出そうです。図形描画エリアを大きく右に動かしましょう。
この修正を行なう場合、図形情報を書き込む場所がずれてきます。列番号がずれてきます。この変更は大変ですね。
そのために、列番号の定数には変数をあてがっています。10列目は、lc010となっています。これが2列ずれると、一括変換でlc010をlc012に変換して、lc012に12をセットしておけばいいのです(これも一括変換できます。lc012 = 10をlc012 = 12にすればいいのです)。かなり修正が簡単になります。問題は、ほかにlc010を含む変数等があった場合です。これはほとんど考えられませんので、ほとんど大丈夫なのです。10を12に変換する場合は、こうは簡単にいかないでしょう。
2008年2月6日水曜日
第79回目 図形作成システムの完成度を求めて(その2)
○第79回目 図形作成システムの完成度を求めて(その2)
図形の位置、1セル以下の端数も考慮する。
前回の機能でもまだ表現できないところがあります。それはセル単位以下の位置です。
ある程度のアバウトでもともってはじめたのですが、ここまでくるとこの点に対処しないことの穴が気になって仕方ありません。
ということで、今回は位置のセル以下の端数値をフィードバックするという点を取り上げます。
原理的には、前回で情報は十分整っていますので、今回はその加工となります。
図形の位置=⇒セル単位に換算する=⇒実際の位置とセル単位での位置との差を求める=⇒それらを図形作成管理表に書き込む。
図形作成管理表はそこまで考えられていませんので、列を挿入します。
図形を動かすもととなる位置情報のとなりに、列での端数と行での端数の欄を設けます。また、列と行の位置を作り上げるエリアにもニ項目を追加します。同じものですので、マクロでは後者のエリアに書き込み、後者のエリアから計算式で前者のエリアに移します。図形の位置を動かす際は、この三つの情報をもとにします。
三つの情報とは、A1形式でのセル座標、列の端数値(前者のものです)、行の端数値(前者のものです)の三つです。
変更後の図形関係のパラメータ設置エリア(いわゆる『図形作成管理表』)の構成
---------------------------------------------------------------------------
C;図形番号……エクセルで振っている図形番号
D;位 置………A1座標による図形の位置(k列とイコール)
E;列_端数 ……A1座標では表せない1セル以下の図形の横幅の端数値(Q列とイコール)
F;行_端数 ……図形のA1座標では表せない1セル以下の図形の高さの端数値(V列とイコール)
G;テキスト……図形内のテキスト
H;図形形式……エクセルでもっている図形の名前
I; ……空き
---------------------------------------------------------------------------
J;図形番号……C;図形番号と同じ
K;位 置………A1座標による図形の位置(PとUをあわせたもの)
---------------------------------------------------------------------------
L;列 ………列番号による図形の基準位置
M; 4 ………列番号による図形の調整値1。1単位で4列を示す欄
N; 2 ………列番号による図形の調整値2。1単位で2列を示す欄
O;横位置………列番号による図形の位置(L+M*4+N*2)
P; ………列記号による図形の位置
Q;端数 ………A1座標では表せない1セル以下の図形の横幅の端数値(マクロで書込む)
---------------------------------------------------------------------------
R;行 ………行番号による図形の基準位置
S; 6 ………行番号番号による図形の調整値1。1単位で6行を示す欄
T; 3 ………行番号番号による図形の調整値2。1単位で3行を示す欄
U;縦位置………列番号による図形の位置(R+S*6+T*3)
V;端数 ………A1座標では表せない1セル以下の図形の高さの端数値(マクロで書込む)
---------------------------------------------------------------------------
W;コネクタ_元図形…コネクタの元となる図形の番号
X;先図形 …コネクタの先となる図形の番号
Y;場所元 …コネクタの元となる図形にコネクタをつける位置
Z;場所先 …コネクタの先となる図形にコネクタをつける位置
使い方は、
手作業で図形を動かした時=⇒マクロの"図形の位置情報の取得"を動かし、図形作成管理表に図形の位置情報を書き込みます。
端数値を指定して図形を動かしたい時=⇒おおよその端数値を入れて、マクロの"図形の移動_場所を指定する"を動かし、図形を移動させます。端数値は、換算すると1列は54、1行は13.5なので、それを目安にだいたいのところを入れてください。
Q;微調整するには、手作業で図形を直接動かせばいいのではないのでしょうか。そうすれば、位置の取得だけ必要で、"端数値を指定して図形を動かす"ことは不要ではないでしょうか。
=⇒複数の図形を同じだけ動かすとか、図形を違う方向にいっぺんに動かしたいとかいう場合には、有益だと思います。いろいろ試した結果からは、双方向必要だという感じを持っています。
ここで問題が浮上してきます。手作業で図形を動かすとき、グループ化してから動かしたほうがいい場合があります。現時点の図形作成システムにはグループ化の機能がないことです。グループ化すと図形番号がどうなってしまうのか、いろいろと研究すべき点があると思いますが、前向きに取り組んでいきたいと思います。
続きです。
気をつけなければいけないのは、図形作成管理表のレイアウトが変わったということです。
今まで図形作成管理表に数値等を貼り付けていたマクロを点検し、修正しなければなりません。
それほど多くのマクロが対象にはならないので、一つずつ修正してください。出来るだけ簡単に修正するには、どのようなマクロにしておけばいいのかを考えるいい機会だと思います。
本論に戻ります。
実際の座標は
xx_pos(i) = ActiveSheet.Shapes(i).Left
yy_pos(i) = ActiveSheet.Shapes(i).Top
となっています。
A1座標に変換した座標は
xx_A1(i) = Int((xx_pos(i) - xx_pos(1)) / (ll838 * ll644) + lc026 + 0.5)
yy_A1(i) = Int((yy_pos(i) - yy_pos(1)) / (ll135) + lr005 + 0.5)
となっています。
ここで落とされた端数値を求めればいいことになります。
ここではすべてアンカー図形からの値が意味を持ちますので、注意してください。
xx_A1(i) - lc026 がアンカー図形からの列の偏差(セル単位)
yy_A1(i) - lr005 がアンカー図形からの行の偏差(セル単位)
↓
(xx_A1(i) - lc026)*(ll838 * ll644) がアンカー図形からの横の偏差(実距離)
(yy_A1(i) - lr005)*ll135 がアンカー図形からの縦の偏差(実距離)
↓
(xx_pos(i) - xx_pos(1)) - (xx_A1(i) - lc026)*(ll838 * ll644) が端数値
(yy_pos(i) - yy_pos(1)) - (yy_A1(i) - lr005)*ll135 が端数値
※0.25刻みの端数処理もあわせてしてください。(4倍して四捨五入して整数値を求め、それを4で割る)=⇒これをしなくても大丈夫そうでした。
これを、図形作成管理表の該当する列に書き込めばよいことになります。
列の端数値はQ、17列
行の端数値はV、22列 となります。
※位置情報のエリアにかかる定数として、lc012とlc018が定義されていますので、lc012+5とlc018+4を使ってセルに書き込んでください。
端数を算出した以降のマクロを見てみると
'端数の算出
x_hasuu(i) = (xx_pos(i) - xx_pos(1)) - (xx_A1(i) - lc033) * (ll838 * ll644)
y_hasuu(i) = (yy_pos(i) - yy_pos(1)) - (yy_A1(i) - lr005) * ll135
'書き込み
'列情報
Cells(lr005 + i, lc012 + 1) = (xx_A1(i) - Cells(lr005 + i, lc012)) / Cells(lr005, lc012 + 1)
Cells(lr005 + i, lc012 + 2) = ClearContents
Cells(lr005 + i, lc012 + 5) = x_hasuu(i)
'行情報
Cells(lr005 + i, lc018 + 1) = (yy_A1(i) - Cells(lr005 + i, lc018)) / Cells(lr005, lc018 + 1)
Cells(lr005 + i, lc018 + 2) = ClearContents
Cells(lr005 + i, lc018 + 4) = y_hasuu(i)
※今回は、本題はそれほど難しくありませんが、図形作成管理表のレイアウトが変わったことで他のマクロに影響があります。その修正のほうが作業量としては大きいです。
出来るだけ修正が簡単になるようにマクロを組むように気をつけましょう。
図形の位置、1セル以下の端数も考慮する。
前回の機能でもまだ表現できないところがあります。それはセル単位以下の位置です。
ある程度のアバウトでもともってはじめたのですが、ここまでくるとこの点に対処しないことの穴が気になって仕方ありません。
ということで、今回は位置のセル以下の端数値をフィードバックするという点を取り上げます。
原理的には、前回で情報は十分整っていますので、今回はその加工となります。
図形の位置=⇒セル単位に換算する=⇒実際の位置とセル単位での位置との差を求める=⇒それらを図形作成管理表に書き込む。
図形作成管理表はそこまで考えられていませんので、列を挿入します。
図形を動かすもととなる位置情報のとなりに、列での端数と行での端数の欄を設けます。また、列と行の位置を作り上げるエリアにもニ項目を追加します。同じものですので、マクロでは後者のエリアに書き込み、後者のエリアから計算式で前者のエリアに移します。図形の位置を動かす際は、この三つの情報をもとにします。
三つの情報とは、A1形式でのセル座標、列の端数値(前者のものです)、行の端数値(前者のものです)の三つです。
変更後の図形関係のパラメータ設置エリア(いわゆる『図形作成管理表』)の構成
---------------------------------------------------------------------------
C;図形番号……エクセルで振っている図形番号
D;位 置………A1座標による図形の位置(k列とイコール)
E;列_端数 ……A1座標では表せない1セル以下の図形の横幅の端数値(Q列とイコール)
F;行_端数 ……図形のA1座標では表せない1セル以下の図形の高さの端数値(V列とイコール)
G;テキスト……図形内のテキスト
H;図形形式……エクセルでもっている図形の名前
I; ……空き
---------------------------------------------------------------------------
J;図形番号……C;図形番号と同じ
K;位 置………A1座標による図形の位置(PとUをあわせたもの)
---------------------------------------------------------------------------
L;列 ………列番号による図形の基準位置
M; 4 ………列番号による図形の調整値1。1単位で4列を示す欄
N; 2 ………列番号による図形の調整値2。1単位で2列を示す欄
O;横位置………列番号による図形の位置(L+M*4+N*2)
P; ………列記号による図形の位置
Q;端数 ………A1座標では表せない1セル以下の図形の横幅の端数値(マクロで書込む)
---------------------------------------------------------------------------
R;行 ………行番号による図形の基準位置
S; 6 ………行番号番号による図形の調整値1。1単位で6行を示す欄
T; 3 ………行番号番号による図形の調整値2。1単位で3行を示す欄
U;縦位置………列番号による図形の位置(R+S*6+T*3)
V;端数 ………A1座標では表せない1セル以下の図形の高さの端数値(マクロで書込む)
---------------------------------------------------------------------------
W;コネクタ_元図形…コネクタの元となる図形の番号
X;先図形 …コネクタの先となる図形の番号
Y;場所元 …コネクタの元となる図形にコネクタをつける位置
Z;場所先 …コネクタの先となる図形にコネクタをつける位置
使い方は、
手作業で図形を動かした時=⇒マクロの"図形の位置情報の取得"を動かし、図形作成管理表に図形の位置情報を書き込みます。
端数値を指定して図形を動かしたい時=⇒おおよその端数値を入れて、マクロの"図形の移動_場所を指定する"を動かし、図形を移動させます。端数値は、換算すると1列は54、1行は13.5なので、それを目安にだいたいのところを入れてください。
Q;微調整するには、手作業で図形を直接動かせばいいのではないのでしょうか。そうすれば、位置の取得だけ必要で、"端数値を指定して図形を動かす"ことは不要ではないでしょうか。
=⇒複数の図形を同じだけ動かすとか、図形を違う方向にいっぺんに動かしたいとかいう場合には、有益だと思います。いろいろ試した結果からは、双方向必要だという感じを持っています。
ここで問題が浮上してきます。手作業で図形を動かすとき、グループ化してから動かしたほうがいい場合があります。現時点の図形作成システムにはグループ化の機能がないことです。グループ化すと図形番号がどうなってしまうのか、いろいろと研究すべき点があると思いますが、前向きに取り組んでいきたいと思います。
続きです。
気をつけなければいけないのは、図形作成管理表のレイアウトが変わったということです。
今まで図形作成管理表に数値等を貼り付けていたマクロを点検し、修正しなければなりません。
それほど多くのマクロが対象にはならないので、一つずつ修正してください。出来るだけ簡単に修正するには、どのようなマクロにしておけばいいのかを考えるいい機会だと思います。
本論に戻ります。
実際の座標は
xx_pos(i) = ActiveSheet.Shapes(i).Left
yy_pos(i) = ActiveSheet.Shapes(i).Top
となっています。
A1座標に変換した座標は
xx_A1(i) = Int((xx_pos(i) - xx_pos(1)) / (ll838 * ll644) + lc026 + 0.5)
yy_A1(i) = Int((yy_pos(i) - yy_pos(1)) / (ll135) + lr005 + 0.5)
となっています。
ここで落とされた端数値を求めればいいことになります。
ここではすべてアンカー図形からの値が意味を持ちますので、注意してください。
xx_A1(i) - lc026 がアンカー図形からの列の偏差(セル単位)
yy_A1(i) - lr005 がアンカー図形からの行の偏差(セル単位)
↓
(xx_A1(i) - lc026)*(ll838 * ll644) がアンカー図形からの横の偏差(実距離)
(yy_A1(i) - lr005)*ll135 がアンカー図形からの縦の偏差(実距離)
↓
(xx_pos(i) - xx_pos(1)) - (xx_A1(i) - lc026)*(ll838 * ll644) が端数値
(yy_pos(i) - yy_pos(1)) - (yy_A1(i) - lr005)*ll135 が端数値
※0.25刻みの端数処理もあわせてしてください。(4倍して四捨五入して整数値を求め、それを4で割る)=⇒これをしなくても大丈夫そうでした。
これを、図形作成管理表の該当する列に書き込めばよいことになります。
列の端数値はQ、17列
行の端数値はV、22列 となります。
※位置情報のエリアにかかる定数として、lc012とlc018が定義されていますので、lc012+5とlc018+4を使ってセルに書き込んでください。
端数を算出した以降のマクロを見てみると
'端数の算出
x_hasuu(i) = (xx_pos(i) - xx_pos(1)) - (xx_A1(i) - lc033) * (ll838 * ll644)
y_hasuu(i) = (yy_pos(i) - yy_pos(1)) - (yy_A1(i) - lr005) * ll135
'書き込み
'列情報
Cells(lr005 + i, lc012 + 1) = (xx_A1(i) - Cells(lr005 + i, lc012)) / Cells(lr005, lc012 + 1)
Cells(lr005 + i, lc012 + 2) = ClearContents
Cells(lr005 + i, lc012 + 5) = x_hasuu(i)
'行情報
Cells(lr005 + i, lc018 + 1) = (yy_A1(i) - Cells(lr005 + i, lc018)) / Cells(lr005, lc018 + 1)
Cells(lr005 + i, lc018 + 2) = ClearContents
Cells(lr005 + i, lc018 + 4) = y_hasuu(i)
※今回は、本題はそれほど難しくありませんが、図形作成管理表のレイアウトが変わったことで他のマクロに影響があります。その修正のほうが作業量としては大きいです。
出来るだけ修正が簡単になるようにマクロを組むように気をつけましょう。
2008年2月3日日曜日
第78回目 図形作成システムの完成度を求めて
○第78回目 図形作成システムの完成度を求めて
図形作成のマクロを作ろうと思ったのは、ちょっとした機能でもいいので簡単な操作で図形が描けるようにしよう。テキストも簡単に入れられるように。移動も出来ればいいな…、などとたわいもないことでしたが、作成していきますと、もっともっとと欲が出てきます。横の広がりは適当な範囲でいいのですが、深さの点は気になります。
そこで、深さの点で更に完成度と高めることにしました。
フィードバックを完成させるということです。
現在のシステムではフィードバックが出来ているのは、テキストだけです。
図形作成管理表では他に、位置の情報、コネクタの接続情報があります。この二つに変化が起きてしまうことが起きます。起すこともありますが、意図せずして起きてしまうことがあります。それは、図形の順序の変更をしたときです。図形を最背面に移動させた場合、その図形の番号は1番になり、図形の番号全体が変わってしまうのです。
すると図形作成管理表の位置情報等が実際のものと異なっしまいます。
そこで、位置情報とコネクタ情報を図形作成管理表のしかるべき場所にフィードバックし、そこを調整することで図形の全体情報を実際のものにあわせようということです。
1.実際の図形の位置から、図形作成管理表の位置情報を更新する
2.実際の図形のコネクトの状況から、図形作成管理表のコネクタ情報を更新する
1.実際の図形の位置から、図形作成管理表の位置情報を更新する
図形を作成するエクセルのワークシートの体系は、Z列までに図形作成管理表があり、図形の描画エリアは、AA列からとしています。
したがって、A列からZ列までは任意に使うことになるので、桁数が異なります。位置を考える時、その点が問題となります。そこでアンカー図形を設けました。アンカー図形は、そこをもとに図形の位置を図るという目的のものであり、それ以降の列、行は一定値とします。
Z5にアンカー図形を作ります。原則として図形番号1とします。図形の大きさを小さくしておけば気にならなくなります。大きさ、形はご髄意に。
まず、基本機能としてアンカー図形の作成を追加します。長方形かなんかで設定してください。ラインは混乱のもとなのでダメです。
図形の複数一括作成を参照すれば、簡単にマクロは出来ます。
図形の位置を測るため、まずはアンカー図形の位置を取得しておきます。
次に目的とする図形の位置を取得します。
その差を、単位あたりの定数で除すことによって、アンカー図形から列数単位でどのくらいはなれているのかがわかります。この場合、手作業による移動もありうり割り切れませんので、計算結果は列単位、または行単位となりますので、必ず整数値にしてください。
これとアンカー図形の列(行も同じです。列で代表して説明していきます)から、実際の列がわかります。
図形作成管理表の位置情報は基準値と偏位1,2からなっています。
実際の列番号から基準値を引き、偏差1の基準単位で割ると、偏差1の値が出てきます。偏差2はクリアします。
例えば、アンカー図形がZ5にあり、実際の図形がAI12(AI列は35列)、図形作成管理表の基準値としては27、偏差1の基準単位としては8、が指定されているとします。
横の位置の違いから、位置を測りたい図形は、アンカー図形からみて8列離れています。そこから基準値の30を減じ、基準単位の8で割ると1となります。
そこでこの図形の偏差1の欄は1と記入されます。
図形作成管理表の中の計算で、偏差1が1、偏差2がゼロの場合は、27+8*1+4*0=35と計算され、列記号に変換しAI列となります。行番号も同様な方法で求めて、当該図形の位置がAI12となります。(行は基準値が6、基準単位が6ですので、これも偏差1は1となります)
これにより、図形番号と実際の図形の位置が、図形作成管理表の上で繋がります。図形を手作業で勝手に動かしても、この位置情報により、もとどおりになります(列未満の微妙な位置はだめですが)。
列幅8.38、行高さ13.5の場合、位置を求める際の一列当りの定数は54、一行当りの定数は13.5となっていました(コネクタの場合は異なるようです。不明)。
これらをもとにしてマクロを組むことが出来ます。
まず、図形の位置を所得します。
i=1はアンカー図形です。
'座標の取得
xx_pos(i) = ActiveSheet.Shapes(i).Left
yy_pos(i) = ActiveSheet.Shapes(i).Top
これを、A1形式の座標に変換します。
llがついたのは定数で、出てくる順から8.38、6.44、26,13.5、1となっています。
8.38*6.44は54となります。
アンカーからの図形の偏差を基準値で割って、26を足し、四捨五入をします。
'セル単位の座標に変換
xx_A1(i) = Int((xx_pos(i) - xx_pos(1)) / (ll838 * ll644) + lc026 + 0.5)
yy_A1(i) = Int((yy_pos(i) - yy_pos(1)) / (ll135) + lr005 + 0.5)
図形作成管理表への書き込みです。
ここでもまた数値を加工します。基準値が決まっていますので、それからの偏差にします。lc012列(12列)に基準値が入っています。列の偏差の基本単位は、(5,13)にはっています。行の場合は、18列、(5,19)にはいっています。
偏差2は算定の根拠から抜かしていますのでクリアしておきます。
偏差1 =(列番号-列の基準値)/偏差1の基本単位
偏差1を書きこむ場所は、12列と19列です。
'書き込み
'列情報
Cells(lr005 + i, lc012 + 1) = (xx_A1(i) - Cells(lr005 + i, lc012)) / Cells(lr005, lc012 + 1)
Cells(lr005 + i, lc012 + 2) = ClearContents
'行情報
Cells(lr005 + i, lc018 + 1) = (yy_A1(i) - Cells(lr005 + i, lc018)) / Cells(lr005, lc018 + 1)
Cells(lr005 + i, lc018 + 2) = ClearContents
【参考図 図形位置情報_取得前と後】
※端数の欄がありますが、これはセル単位では表現できない値です。これを考慮することにより正確な位置情報となります。具体的な端数値取得の説明は省略します。
図形位置情報_取得前

図形位置情報_取得後

※コネクタの位置もでてくるのですが、その意味するところはよくわかりません。
コネクタを引き直す時は、マクロの"コネクタの削除"で削除してから"図形をコネクタで結ぶ"で処理してください。
今回はここまで。
図形作成のマクロを作ろうと思ったのは、ちょっとした機能でもいいので簡単な操作で図形が描けるようにしよう。テキストも簡単に入れられるように。移動も出来ればいいな…、などとたわいもないことでしたが、作成していきますと、もっともっとと欲が出てきます。横の広がりは適当な範囲でいいのですが、深さの点は気になります。
そこで、深さの点で更に完成度と高めることにしました。
フィードバックを完成させるということです。
現在のシステムではフィードバックが出来ているのは、テキストだけです。
図形作成管理表では他に、位置の情報、コネクタの接続情報があります。この二つに変化が起きてしまうことが起きます。起すこともありますが、意図せずして起きてしまうことがあります。それは、図形の順序の変更をしたときです。図形を最背面に移動させた場合、その図形の番号は1番になり、図形の番号全体が変わってしまうのです。
すると図形作成管理表の位置情報等が実際のものと異なっしまいます。
そこで、位置情報とコネクタ情報を図形作成管理表のしかるべき場所にフィードバックし、そこを調整することで図形の全体情報を実際のものにあわせようということです。
1.実際の図形の位置から、図形作成管理表の位置情報を更新する
2.実際の図形のコネクトの状況から、図形作成管理表のコネクタ情報を更新する
1.実際の図形の位置から、図形作成管理表の位置情報を更新する
図形を作成するエクセルのワークシートの体系は、Z列までに図形作成管理表があり、図形の描画エリアは、AA列からとしています。
したがって、A列からZ列までは任意に使うことになるので、桁数が異なります。位置を考える時、その点が問題となります。そこでアンカー図形を設けました。アンカー図形は、そこをもとに図形の位置を図るという目的のものであり、それ以降の列、行は一定値とします。
Z5にアンカー図形を作ります。原則として図形番号1とします。図形の大きさを小さくしておけば気にならなくなります。大きさ、形はご髄意に。
まず、基本機能としてアンカー図形の作成を追加します。長方形かなんかで設定してください。ラインは混乱のもとなのでダメです。
図形の複数一括作成を参照すれば、簡単にマクロは出来ます。
図形の位置を測るため、まずはアンカー図形の位置を取得しておきます。
次に目的とする図形の位置を取得します。
その差を、単位あたりの定数で除すことによって、アンカー図形から列数単位でどのくらいはなれているのかがわかります。この場合、手作業による移動もありうり割り切れませんので、計算結果は列単位、または行単位となりますので、必ず整数値にしてください。
これとアンカー図形の列(行も同じです。列で代表して説明していきます)から、実際の列がわかります。
図形作成管理表の位置情報は基準値と偏位1,2からなっています。
実際の列番号から基準値を引き、偏差1の基準単位で割ると、偏差1の値が出てきます。偏差2はクリアします。
例えば、アンカー図形がZ5にあり、実際の図形がAI12(AI列は35列)、図形作成管理表の基準値としては27、偏差1の基準単位としては8、が指定されているとします。
横の位置の違いから、位置を測りたい図形は、アンカー図形からみて8列離れています。そこから基準値の30を減じ、基準単位の8で割ると1となります。
そこでこの図形の偏差1の欄は1と記入されます。
図形作成管理表の中の計算で、偏差1が1、偏差2がゼロの場合は、27+8*1+4*0=35と計算され、列記号に変換しAI列となります。行番号も同様な方法で求めて、当該図形の位置がAI12となります。(行は基準値が6、基準単位が6ですので、これも偏差1は1となります)
これにより、図形番号と実際の図形の位置が、図形作成管理表の上で繋がります。図形を手作業で勝手に動かしても、この位置情報により、もとどおりになります(列未満の微妙な位置はだめですが)。
列幅8.38、行高さ13.5の場合、位置を求める際の一列当りの定数は54、一行当りの定数は13.5となっていました(コネクタの場合は異なるようです。不明)。
これらをもとにしてマクロを組むことが出来ます。
まず、図形の位置を所得します。
i=1はアンカー図形です。
'座標の取得
xx_pos(i) = ActiveSheet.Shapes(i).Left
yy_pos(i) = ActiveSheet.Shapes(i).Top
これを、A1形式の座標に変換します。
llがついたのは定数で、出てくる順から8.38、6.44、26,13.5、1となっています。
8.38*6.44は54となります。
アンカーからの図形の偏差を基準値で割って、26を足し、四捨五入をします。
'セル単位の座標に変換
xx_A1(i) = Int((xx_pos(i) - xx_pos(1)) / (ll838 * ll644) + lc026 + 0.5)
yy_A1(i) = Int((yy_pos(i) - yy_pos(1)) / (ll135) + lr005 + 0.5)
図形作成管理表への書き込みです。
ここでもまた数値を加工します。基準値が決まっていますので、それからの偏差にします。lc012列(12列)に基準値が入っています。列の偏差の基本単位は、(5,13)にはっています。行の場合は、18列、(5,19)にはいっています。
偏差2は算定の根拠から抜かしていますのでクリアしておきます。
偏差1 =(列番号-列の基準値)/偏差1の基本単位
偏差1を書きこむ場所は、12列と19列です。
'書き込み
'列情報
Cells(lr005 + i, lc012 + 1) = (xx_A1(i) - Cells(lr005 + i, lc012)) / Cells(lr005, lc012 + 1)
Cells(lr005 + i, lc012 + 2) = ClearContents
'行情報
Cells(lr005 + i, lc018 + 1) = (yy_A1(i) - Cells(lr005 + i, lc018)) / Cells(lr005, lc018 + 1)
Cells(lr005 + i, lc018 + 2) = ClearContents
【参考図 図形位置情報_取得前と後】
※端数の欄がありますが、これはセル単位では表現できない値です。これを考慮することにより正確な位置情報となります。具体的な端数値取得の説明は省略します。
図形位置情報_取得前

図形位置情報_取得後

※コネクタの位置もでてくるのですが、その意味するところはよくわかりません。
コネクタを引き直す時は、マクロの"コネクタの削除"で削除してから"図形をコネクタで結ぶ"で処理してください。
今回はここまで。
登録:
コメント (Atom)
