- 01: 名前:mar投稿日:2007/01/24(水) 13:17
- 図面上で使われていないマスターシェイプをVBAで削除しようと考えています。
それぞれのマスターが使用されているかどうかの判別方法はどのようにすればよいのでしょうか?
宜しくお願いします。
- 03: 名前:mar投稿日:2007/01/24(水) 17:40
- yodaさん Resありがとうございます。
Deleteメソッドを使っているのですが使用中でも消えてしまいます。
ちょっと消え方が変なんですが...
[実際のコード]
Dim mst As Master
For Each mst In ActiveDocument.Masters
mst.Delete
DoEvents
Next
実行すると使用されていないマスターと使用しているマスター1個が消えます。
そのままもう一度実行すると使用されているマスターがもう1つ消えます。
Visioは2003を使用しています。
- 04: 名前:名無しさん投稿日:2007/01/24(水) 17:41
- 削除する時は後ろからです。
前から削除すると実数と総数がズレます。
- 05: 名前:yoda投稿日:2007/01/24(水) 19:20
- 私の早とちりだったようでしね。
なるほど、単純にDeleteでは、全部消えてしまいますね。
とすると、厄介です。
全シェイプを調べて、シェイプのmaster
プロパティを使って、マスターのリストを作り、
図面ステンシルのマスターが、そのリストになければ
消去する。という形に、なるのでしょうね。
- 06: 名前:yoda投稿日:2007/01/24(水) 19:32
- 以前、管理人さんの作ったマクロがあったのですが、
見つかりませんでした。
- 07: 名前:yoda投稿日:2007/01/24(水) 20:00
- CreateSeletionメソッドを使いましょう。
Dim mst As Visio.Master
Dim mySel As Visio.Selection
For Each mst In ThisDocument.Masters
Set mySel = ActivePage.CreateSelection(visSelTypeByMaster, , mst)
If mySel.Count = 0 Then
mst.Delete
End If
Next
- 08: 名前:yoda投稿日:2007/01/24(水) 20:12
- また間違えた!!こうですね。
Dim mst As Visio.Master
Dim mySel As Visio.Selection
Dim I As Long, N As Long
N = ThisDocument.Masters.Count
For I = N To 1 Step -1
Set mst = ThisDocument.Masters(I)
ActiveWindow.DeselectAll
Set mySel = ActivePage.CreateSelection(visSelTypeByMaster, , mst)
If mySel.Count = 0 Then
mst.Delete
End If
Next
- 09: 名前:mar投稿日:2007/01/25(木) 09:35
- 返事遅れてすいません。
>削除する時は後ろからです。
まさしく その通りです。修正しました。
>CreateSeletionメソッドを使いましょう。
CreateSelectionではページ単位の比較しか出来ないため 複数ページのDocumentなのでうまくいきませんでした。
全ページをスキャンして削除するようにしてみます。
- 10: 名前:yoda投稿日:2007/01/25(木) 09:58
- 図面の上で、手で消去しようとすると、使用中のマスターについては、
確認のメッセージが出るのに、Deleteメソッドでは、なぜ出ないので
しょうね。これが出れば、もっと簡単にマクロができそうな気がするの
ですがね。
- 11: 名前:mar投稿日:2007/01/25(木) 10:33
- yodaさんのコードを全ページ対象に改造してうまくいきました。
ありがとうございました。
Dim mst As Visio.Master
Dim mySel As Visio.Selection
Dim myPage As Integer, mstCnt As Integer, pgCnt As Integer, shpCnt As Integer
Dim i As Integer, j As Integer
myPage = ActivePage.Index
mstCnt = ActiveDocument.Masters.Count
pgCnt = ActiveDocument.Pages.Count
For i = mstCnt To 1 Step -1
Set mst = ActiveDocument.Masters(i)
shpCnt = 0
For j = 1 To pgCnt
ActiveWindow.Page = ActiveDocument.Pages(j)
ActiveWindow.DeselectAll
Set mySel = ActivePage.CreateSelection(visSelTypeByMaster, , mst)
shpCnt = mySel.Count
If shpCnt > 0 Then Exit For
Next
If shpCnt = 0 Then mst.Delete
Next
ActiveWindow.Page = ActiveDocument.Pages(myPage)
■トップに戻る リロード 全レスを表示
|