Visio VBA基礎知識

Visio VBA基礎知識

と、表題しているが、何が、どこまでが基礎知識かわからない。
なので、ずらずら調べたそばからメモしていく。



最初にやっておくべきこと

VBAに手を出す際にまずやっておくべきことというものがある。
と言ってもVBAの基本ができているなら、やることはたった1.5個しかない。

それは『変数の宣言を強制する』チェックボックスをONにする事だ。
場所はVBEのメニューバーから、"ツール" => "オプション" => "編集"タブにある。

次に、既存のモジュールの冒頭に
Option Explicit

を追加する事も忘れてはいけない。
『変数の宣言を強制する』チェックボックスをONにすると、新規作成したモジュール等の冒頭に"Option Explicit"が自動で挿入されるようになるが、既に存在するモジュールには追加されない。
忘れずに挿入しておくようにしよう。



構成要素の捉え方(概念)

人間から見れば、Visioの操作とは、あたかも画用紙の上にシールを張り付けたり、スクラップを糊付けしたり、マーカーやサインペンで装飾、メモを書き記すようなものである。
その配置できるパーツの数々がデジタル情報となったことで汎用性や拡張性、種類や色彩が豊富になったこと、そのパーツへのアクセスにマウスやキーボードなどのインターフェースを介する必要があることなどを除けば、両者の差異はそれほど大きくない。
無論、それはコンピューターソフトウェアが現実を模倣し、その代用にならんとする発展の結果もたらされたのであるから、その進歩のめまぐるしさに目をつぶれば当然の結果である。

デジタルネイティブな世代であれば、それらは直感的にマウスやキーボードによって操作されてしかるべきだし、そうではないデジタルイミグラントな世代であっても、マウスが机の端まで行ってしまいそれ以上動かせない、などという状況に陥る輩は少数派となって久しい。

実際、Visioを使用している方の多くは、描画における諸操作のうち、基礎的な部分(図形の移動、サイズ変更、文字列挿入)をほぼ無意識に行っているだろうし、その背景でどのような事が行われているかなど意識する必要はない。

しかし、我々がこれからやろうとしていうのはVBA、すなわちプログラムから、図形を操作しようという試みである。
であるのなら、無意識の中でマウスを動かしてクリックしている"ソレ"を、文字列で表現する術を知らなくてはならない。

まずは以下のリストを眺めてほしい。
  • Application - Visioソフト(動作中のインスタンス)
    • Document - Visioファイル
      • Master - シェイプのコピー元
        • Connect - 接続ポイント
        • Layer - レイヤー
        • Shape - シェイプ
      • Page - Excelで言うところのシート
        • Connect - 接続ポイント
        • Layer - レイヤー
        • Shape - シェイプ
          • Hyperlink - ハイパーリンク
          • Characters - テキスト
          • Cell - シェイプシート上のセル

ご覧のように、ある要素の配下に子要素がぶら下がっている様子がわかると思う。
Visioでは各構成要素がディレクトリ構造を成している。ツリー状構造と言い換えてもいい。

ここまでくれば察しの良い方なら気づかれるだろうが、Visioにおける構成要素の指定は、コンピューターにおけるパス指定や、WEBのURLと同じく、最上位の構成要素から子要素に向かって順にその経路を記述していく事で実現する。
上の例でいうと、ShapeはDocument.Master.Shapeの位置と、Document.Page.Shapeの位置に存在する。両者の違いについては追々調べていくとして、ここではVisioで描画した各パーツが文字列ではどのように表現されるかを掴んでおきたい。

尚、既に断りなく記述しているが、各要素間を区切る文字は".(ピリオド)"を使用する。
ここで適当にマクロを記録してみてほしい。
Sub Macro1()

    Application.Windows.ItemEx("図面1").Activate
    Application.ActiveWindow.Page.Drop Application.Documents.Item("BASFLO_M.VSS").Masters.ItemU("Process"), 2.46063, 10.826772

End Sub

どうだろうか?
それぞれの単語の意味はわからなくとも、そこかしこに階層構造が存在する事は見て取れるのではないだろうか。


要素だけでなく命令も階層の中に

ここで初心者にとってVisio VBAをわかりにくくしている要素として、メソッドやプロパティも同様の表現によって定義されている。という点が考えられる。
例えば、
Application.ActiveWindow.Selection.Move -1.84685, 0.035827

という指示があったとしよう。
これは選択範囲を指定座標へ移動する動作を表している。
この時、末尾の数字はどうやら座標であることがわかる。
その直前の".Move"は読んで字のごとく、何かを動かすための指示だという事もわかるだろう。
さらに察しの良い人であれば、".Move"の直前にある".Selection"が『選択された対象』であることも気づけるだろう。

つまり、少なくとも".Move"は描画された図を構成するパーツのうち、特定の操作対象を指し示すものではなく、そのパーツにどのような変化を起こすかを指示するための"命令"であることがわかる。
無論、その"命令"とは『動かしなさい』だ。
そして、その"命令"の対象は".Move"の直前に".Selection"として記述されている。
操作対象.命令

という状態だ。
なんだ簡単ではないか、と最初に見たとき私はそう思ったわけだが、実際にはそううまくいくものではない。

例えば、以下である。
Application.ActiveWindow.Page.Shapes.ItemFromID(6)

対象シェイプを補足するで解説するが、上記はすでに配置済みのパーツのうち、特定のID(上記例では"6")を持つパーツを表している。
ここまでの事例を参考に、安直な私は以下のように記述してみたわけだ。
Application.ActiveWindow.Page.Shapes.ItemFromID(6).Move -1.84685, 0.035827

これでパーツを動かせる!と喜び勇んでコードを実行すると、ご丁寧にエラーウインドウが表示され、こう言われてしまったのである。
『オブジェクトは、このプロパティまたはメソッドをサポートしていません。』

要するに、上記の書き方でパーツを指定するやり方では".Move"は使えませんという事だ。
このエラーにはかなり混乱させられた。というか、現在進行形で確たる回答には至っていない。
ただ、まだ調べていないだけで回答候補はあるので、ここでは、こういうものなのだという一例として取り上げ、詳細な調査と解説は4種の命令とプロシージャ(今考えた題名、まだ作ってない20130516⇒作った20130523)で行うものとする。





知っておくべき用語リスト

説明するにしろ、説明を読むにしろ、用語がわからないのでは効率が悪い。
そのうち用語集としてページ分割するかも。
以下にまとめておく。

自分で調べるべき用語

VBAをやろうというのに、これくらい知らないでやろうというのは甘いんじゃないの?という用語リスト。
No. 用語 意味
01 ページ これから設計図なりフローチャートなりを描こうとしているその場所の事。さまざまな構成パーツを配置するフィールド。
02 シェイプ Visioを使用して図を描画しようとする際に用いられる構成要素の一つ。特に特殊な動作や定義を内包する特殊な図の事。
03 マスターシェイプ よく使用されるシェイプや、汎用性の高いシェイプのコピー元となるシェイプ。ほかにユーザーが独自にその動作を定義し、登録されたものも含む。
04 ステンシル あるテーマにそって集められたマスターシェイプで構成されるグループの事。拡張子『.vss』を持つファイルとして保存されている。
05 ドロップ 『ステンシルに登録されたマスターシェイプから一つを選択し、ページ内にドロップする事でシェイプを生成する』という例文で理解しろ。
06 コネクタ シェイプとシェイプを接続する直線パーツの事。または、その性質を定義されたシェイプの事をそのように呼称する。
07 接続ポイント 多くのシェイプに用意されているシェイプ上の結合点の事。コネクタの両端にも存在する。マウスで操作する場合、シェイプの接続ポイントとコネクタの接続ポイントは磁石のように吸着しあい、接続が完了すると、データ的に結合される。結合状態では、例えばあるシェイプの接続ポイントに対し、コネクタの端点にある接続ポイントを結合した場合、シェイプの移動に伴いコネクタがその移動動作に従属する。一般的にシェイプの移動によるコネクタの従属は、コネクタ側の伸長・収縮変化によって行われる。
08 テキストボックス Visioを使用して図を描画しようとする際に用いられる構成要素の一つ。特にページ上にテキストのみを配置したい場合に用いる枠線の存在しない方形のパーツである。
09 編集用行 ~随時追加予定


少々難解な用語

紛らわしい用語や、難解な用語のリスト
No. 用語 意味
01 コレクション
02 インスタンス 小難しい説明を省けば、分身の術みたいなもん。本体の性質を持つ分身体がインスタンス。ある技能を持った人がもう一人いたらいいなーとか思うべ?プログラムならそれができちゃう感じ。
03 クラス ……分身の術みたいなもん。分身体に対する本体がクラス。分身体がインスタンス。
04 メンバ
05 Globalオブジェクト
06 ThisDocumentオブジェクト



以下、更新中



最終更新:2013年06月07日 10:21
添付ファイル