図形作成のマクロを作ろうと思ったのは、ちょっとした機能でもいいので簡単な操作で図形が描けるようにしよう。テキストも簡単に入れられるように。移動も出来ればいいな…、などとたわいもないことでしたが、作成していきますと、もっともっとと欲が出てきます。横の広がりは適当な範囲でいいのですが、深さの点は気になります。
そこで、深さの点で更に完成度と高めることにしました。
フィードバックを完成させるということです。
現在のシステムではフィードバックが出来ているのは、テキストだけです。
図形作成管理表では他に、位置の情報、コネクタの接続情報があります。この二つに変化が起きてしまうことが起きます。起すこともありますが、意図せずして起きてしまうことがあります。それは、図形の順序の変更をしたときです。図形を最背面に移動させた場合、その図形の番号は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
【参考図 図形位置情報_取得前と後】
※端数の欄がありますが、これはセル単位では表現できない値です。これを考慮することにより正確な位置情報となります。具体的な端数値取得の説明は省略します。
図形位置情報_取得前

図形位置情報_取得後

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

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