LoginSignup
5
12

More than 3 years have passed since last update.

Visioファイル内の図形を列挙する。Excel VBAを使って。

Last updated at Posted at 2015-06-08

概要

Visioでぺたぺた設計書を作りました。
見積り根拠とするために、設計書内の図形を数えたくなりました。1

VBAでできそうだったので、Excelを使ってやってみました。

ソース

メインルーチン

本体部分です。

ファイルを選択し、Visioを起動し、図形を列挙してワークシートに記録します。

例外処理とかエラー処理とか抜けてますが、とりあえずということで。 :smile:

CountVisioShapes.bas
Option Explicit

Public Sub CountVisioShapes()
    Dim fn As Variant

    Dim visioApp As visio.Application
    Dim visioDoc As visio.Document
    Dim visioPag As visio.Page
    Dim visioShp As visio.Shape

    Dim rs As New ResultSheet

    fn = Application.GetOpenFilename(FileFilter:="Visioファイル,*.vsdx", MultiSelect:=False)

    Set visioApp = CreateObject("Visio.Application")

    visioApp.Documents.OpenEx fn, visOpenRO + visOpenHidden

    Set visioDoc = visioApp.Documents.Item(1)

    For Each visioPag In visioDoc.Pages
        For Each visioShp In visioPag.Shapes
            rs.putPageName visioPag.Name
            rs.putShapeName visioShp.Name
            rs.putShapeText visioShp.Text
            rs.putMasterShape visioShp.MasterShape.Text
            rs.nextRow

        Next
    Next

    visioDoc.Close
    visioApp.Quit

    Set visioDoc = Nothing
    Set visioApp = Nothing
End Sub

ワークシートのラッパ

ワークシートへ値を格納するのを簡単にするためのクラスです。

ResultSheet.cls
Option Explicit

Private currentRow As Long
Private startCol As Long
Private mySheet As Worksheet

Private Sub Class_Initialize()
    With Application.ActiveCell
        currentRow = .Row
        startCol = .Column
    End With

    Set mySheet = Application.ActiveSheet

    putHeaderRow
End Sub

Private Sub putHeaderRow()
    putCommon 0, "ページ名"
    putCommon 1, "シェイプ名"
    putCommon 2, "シェイプテキスト"
    putCommon 3, "マスターシェイプテキスト"
    nextRow
End Sub

Public Sub nextRow()
    currentRow = currentRow + 1
End Sub

Public Sub putPageName(s As String)
    putCommon 0, s
End Sub

Public Sub putShapeName(s As String)
    putCommon 1, s
End Sub

Public Sub putShapeText(s As String)
    putCommon 2, s
End Sub

Public Sub putMasterShape(s As String)
    putCommon 3, s
End Sub

Private Sub putCommon(sft As Integer, s As String)
    mySheet.Cells(currentRow, startCol + sft).Value = s
End Sub

起動ボタン

メインルーチンを起動するためのボタンを作りました。

excel-button.PNG

ボタンクリック時にメインルーチンを呼ぶようにします。

Option Explicit

Private Sub SelectVisioFileButton_Click()
    Call CountVisioShapes.CountVisioShapes
End Sub

実行結果

作成したボタンを押すとファイル選択ダイアログが表示されますので、ファイルを選択するとアクティブセルに結果が出力されます。

countvisioshapes.PNG

保存

作成したファイルは「マクロ有効テンプレート」として保存しておくと便利です。


  1. ほんとは、先に一覧ファイルを作ってからVisioに接続するのが美しいやりかた。 :sweat_smile:  

5
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
12