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に変換する場合は、こうは簡単にいかないでしょう。

0 件のコメント: