2008年3月22日土曜日

第86回目 図形作成システムの更なる完成度を求めて(その3)

○第86回目 図形作成システムの更なる完成度を求めて(その3)

 今回は
 4.図形のその他の属性の取得
 5.図形のその他の属性により図形を修正
 6.図形情報の一括取得(コネクタ情報は除く)
 です。

 ある時、"図形のサイズ等を合わせる"処理をしていました。
 ほとんど気にせずにパラメータを指定していたのですが、何かの関係で、全部の図形をという指定になっていたようです。それで実行させたものですから、すべての図形が皆同じになってしまいます。せっかく、作り上げたのに、位置関係、コネクタは大丈夫ですが、大体の部分の作成処理は無駄になってしまいました。おそらく、IMEのオンオフ状態が関係していたのでしょう。
 そんな失敗から、4,5番の機能を考えました。
 これは、第84回の"図形のサイズ等を合わせる"をもとにするものです。
 すべての図形のその他の情報を取得してセルに書き込むというものです。この機能と、5の逆の機能を組み合わせれば、原状の復帰が可能となるのです。
 その他の情報としては、次のものです。

AA;図形の種類
AB;サイズ_幅
AC;サイズ_高さ
AD;ラインの太さ  ライン及びコネクタのみ
AE;実線・点線か  ライン及びコネクタのみ
AF;矢印_先頭    ライン及びコネクタのみ
AG;矢印_最後    ライン及びコネクタのみ
AH;内部の色    画像、ライン及びコネクタは除く
AI;透明度     画像、ライン及びコネクタは除く
AJ;フォント_種類  画像、ライン及びコネクタは除く
AK;フォント_サイズ 画像、ライン及びコネクタは除く
AL;文字配置_縦   画像、ライン及びコネクタは除く
AM;文字配置_横   画像、ライン及びコネクタは除く
AN;外枠有無     画像、ライン及びコネクタは除く
AO;回転       コネクタは除く
AP;パスネーム   対象外

 最後のパスネームは画像を張り付けた時の元の画像のあり場所です。しかしながら、この情報の取得はうまくいかないので、現在では対象外としています。
 (画像はエクセル内の取り込まれてしまうので、もとの場所が不要となることから、取得ができないのではないかと思います。この情報は別のところに、例えば欄外に保管すべきものなのでしょう)
 これらの情報は、図形のサイズ等と同じく、設定と取得が逆の関係になっています。
 また、取得は内部コードとなりますので、そのままセルに書き込みます。設定の時はその内部コードを記述すれば、図形に反映されます。
 注意すべきは、すべての図形にすべての情報があるとか限らないことです。情報が取得できなくて、エラーになってしまう場合があります。
 また、図形の種類はよくわからないので、図形の名前から判断しています。2003エクセルでは図形の名前が統一化されているものがありますので、取得はできません。
 更に、グループ化されている図形は一つの図形となっていまいますので、その情報からは復元できません。グループ化を解いて情報の取得をしてください。グループ化した図形に対して復元をかけるとエラーになります。回避する手段をしてください。何回か試行錯誤すればわかります。

 図形の種類
 これは困りました。つまり、図形の名前で、図形の種類がわかるものなのか、ということです。
 エクセル2003の場合は、多くの種類の図形名前がAutoshapeとなっていますので、これからは図形の種類の取得は出来ません。(他の手段がわからないので、現時点ではそう思っていますというという意味です)
 2007を優先にし、図形の名前の中に該当する文字列があるかで決めます。

 ※mm2(i)は図形の名前
temp1 = mm2(i)
If InStr(temp1, "角丸四角形") <> 0 Then z_syu = 1
If InStr(temp1, "円") <> 0 Then z_syu = 2
If InStr(temp1, "爆発") <> 0 Then z_syu = 3
If InStr(temp1, "円形吹き出し") <> 0 Then z_syu = 4
If InStr(temp1, "直線コネクタ") <> 0 Then z_syu = 5
If InStr(temp1, "Line") <> 0 Then z_syu = 5
If InStr(temp1, "右矢印") <> 0 Then z_syu = 7
If InStr(temp1, "正方形/長方形") <> 0 Then z_syu = 8
If InStr(temp1, "Rectangle") <> 0 Then z_syu = 8
If InStr(temp1, "フローチャート") <> 0 Then z_syu = 9
If InStr(temp1, "ホームベース") <> 0 Then z_syu = 10
If InStr(temp1, "山形") <> 0 Then z_syu = 11
If InStr(temp1, "右中カッコ") <> 0 Then z_syu = 121
If InStr(temp1, "左中カッコ") <> 0 Then z_syu = 131
If InStr(temp1, "右大カッコ") <> 0 Then z_syu = 122
If InStr(temp1, "左大カッコ") <> 0 Then z_syu = 132
If InStr(temp1, "中カッコ") <> 0 Then z_syu = 141
If InStr(temp1, "大カッコ") <> 0 Then z_syu = 142
If InStr(temp1, "カギ線コネクタ") <> 0 Then z_syu = 31
If InStr(temp1, "図") <> 0 Then z_syu = 32
If InStr(temp1, "Picture") <> 0 Then z_syu = 32
If InStr(temp1, "Group") <> 0 Then z_syu = 90
 ※図形の種類(番号)が12以上のものは、それだけでは図形が再現できない、または、既存の作成システムでは二段階に分けているので、アウトプットとしての図形の種類を系列化してする、という意味です。(大カッコと中カッコは後者の例です。前者の例はグループ化された図形です)

・サイズ_幅
・サイズ_高さ
・ラインの太さ  ライン及びコネクタのみ
 これは、設定と同じ内容ですので説明不要です。

・実線・点線か  ライン及びコネクタのみ
 実線の場合は、1となります(内部コード。以下同じ)
 点線の場合は、3となります

・矢印_先頭    ライン及びコネクタのみ
・矢印_最後    ライン及びコネクタのみ
 最初も最後も矢印有は2、無は1

・内部の色    画像、ライン及びコネクタは除く
 カラーコードは、ForeColor.SchemeColorでのものを取得します。

・透明度     画像、ライン及びコネクタは除く
・フォント_種類  画像、ライン及びコネクタは除く
・フォント_サイズ 画像、ライン及びコネクタは除く
 これは、設定と同じ内容ですので説明不要です。

・文字配置_縦   画像、ライン及びコネクタは除く
・文字配置_横   画像、ライン及びコネクタは除く
縦の上中下 -4160、-4108、-4107
横の左中右 -4131、-4108、-4152
 となっています。

・外枠有無     画像、ライン及びコネクタは除く
外枠有の時 -1、無の時 0
 となっています。

・回転       コネクタは除く
 角度(一周360°)が取得されます。
 2003では直線の回転はありません。
 反映はエラーになります。

・パスネーム   対象外
 図形は、エクセル内部に含まれてしまうので、元のパス名の取得は無理なようです。
 別に管理する必要があります。

 これらの情報の図形への反映は、逆のことをすればいい(これまで図形の属性として設定したことをやればいいのです)ので、それほど複雑ではないと思います。

 6.図形情報の一括取得(コネクタ情報は除く)
 これは、今までのマクロの積み上げです。サブルーチン化されているものを、次々に呼び出して処理を行うというものです。
 上のその他の情報以外にものとしては、テキストの情報、位置の情報、コネクタの情報があります。このうちコネクタに関する情報を除きました。
 コネクタの情報は、こちら側から与えるもののなので、最終的な確認など他の情報とは更新のタイミングが異なるのではないかと思っています。それゆえに一括取得からは除きました。
 この機能は、今での逆となりますが、一つだけ、"図形の種類の変更"には注意が必要です。
 しかしながら、この機能は、"図形の種類の変更"に含まれていますので、これをコピーするか、サブルーチン化して呼び出すかという。いずれかの方法となると思います。モジュールの中で同じ機能が二つ存在することになりますが、"コピーする"のほうが単純なので簡単ですね。
 "サブルーチン化して呼び出す"はできてからでもいいのではないでしょうか。まずは成果物を出すことのほうが優先ではないでしょうか。

0 件のコメント: