このページ内のシェイプがねっステンシルから持ってきたやつなんだけど、どこから持ってきたか一覧にしたいのさ。
あ~分かった分かった!元のマスタシェイプ&ステンシルを調べたいのね~
ステンシルに保存してある図形を使って、図を描くことは多いと思います。元のマスタシェイプやステンシルがどれだったか保存しておきたい、なんてこともあるのではないでしょうか?今回はVBAを使って図形の元となったマスタシェイプ&保存されているステンシルを取得する方法をご紹介します。
ステンシルから図形を描く?!コピーする?!方法については以下を参照ください。
図形の元となったマスタシェイプ&ステンシルを知りたい!
これこれ!この元のマスターシェイプが知りたいのよ
あるマスタシェイプを使用中のVisioページにドラックしたとします。
このとき、ページ上にあるシェイプ①から、元になったマスタシェイプ②、およびマスタシェイプが保存されているステンシル③を知りたいのである。
図形の元となったマスタシェイプを取得する方法
構文
図形の元となったマスタシェイプを取得します。
図形.Master
※マスターシェイプがない図形の場合には”Nothing”を返します。
コード
Sub test1()
'選択した図形
Set shp = ActiveWindow.Selection(1)
MsgBox ("マスターシェイプの名前" & shp.Master)
End Sub
選択した図形のマスターシェイプ名を表示させるよ
実行結果
マスターシェイプの名前、Sampleでは「HTML」がメッセージボックスに表示されたと思います。
マスタシェイプが保存されているステンシルを特定する方法
例えばこんな感じにステンシルを5個くらい開いて、そこからこんな感じに図形をドロップしました。
そしてそれぞれの図形のマスターシェイプと、そのマスターシェイプが保存されているステンシルを
バックウインドウに出力してみます。
Sample
コード
Sub test2()
Dim doc As Document
Dim shp_mst
Dim docs
Dim shps
'開いているドキュメント全部(ステンシルを含む)
Set docs = Visio.Documents
'いま開いているページにある図形
Set shps = ActivePage.Shapes
'いま開いている全ての図形を1こづつチェック -①-
For Each shp In shps
'図形のマスターシェイプ
Set shp_mst = shp.Master
'マスターシェイプがあるものだけが対象 -②-
If Not (shp_mst Is Nothing) Then
'いま開いている全てのドキュメント -③-
For Each doc In docs
'ステンシルだけを調べる -④-
If (Right(doc.Name, 4) = "vssx") Then
'ドキュメントの中のマスター -⑤-
For Each mst In doc.Masters
'マスターシェイプの名前
If mst.Name = shp_mst Then -⑥-
Debug.Print shp & vbTab & doc.Name & vbTab & mst.Name
End If
Next
End If
Next
End If
Next
End Sub
①いま開いているページの全ての図形について調べます。
②マスターシェイプのある図形だけを対象にします。
③いま開いている全てのドキュメントについて調べます。
④ステンシル以外にも開いているドキュメントもあるかと思うので、vssxファイルだけをターゲットとします。
⑤今度はステンシル(ドキュメント)の中にあるマスターシェイプ1つづつについて調べていきます。
⑥①で調べようといていた図形の名前が、マスタシェイプと一致したら「図形名」「ステンシル名」「マスターシェイプ名」を出力間にTabを入れます。
実行結果
イミディエイトウインドウに「図形名」 「ステンシル名」 「マスターシェイプ名」 の順番に出力されたのではないでしょうか?
※ただし同じマスターシェイプ名のものがあると正しく出力できないので、ご注意下さい。
おおお!元のマスターシェイプとステンシルが出たじゃん!
意外と便利なきがするよね~