【入門編】【初心者向け】全ページのレイヤー名一覧をExcelへ書き出し、ドキュメント構成を可視化するツール – Visio VBA解析バイブル

スポンサーリンク
スポンサーリンク

複雑な図面の「正体」を暴く。Visio VBAで全ページのレイヤー構造をExcelへ一括可視化する技術

こんにちは。Visioの深淵へようこそ。

「マクロの記録」を使って、なんとか自動化の第一歩を踏み出した。そんなあなた。素晴らしい一歩です。しかし、今のあなたは、いわば「決められたレールの上を走る列車」のようなもの。次にどこへ曲がればいいのか、線路がどこまで続いているのか、自分ではコントロールできていないはずです。

今日、あなたが手にするのは、そのレールを自ら敷き、設計図(オブジェクトモデル)を自在に操るための「操縦桿」です。

今回扱うテーマは、「複雑に絡み合ったVisio図面から、全ページのレイヤー情報を抽出し、Excelへ書き出す」というものです。

「たかがレイヤーの名前を出すだけでしょ?」と思うかもしれません。しかし、ここにはオブジェクトの階層構造(Hierarchy)を理解するという、プログラミングにおける最も重要なエッセンスが詰まっています。

ここをクリアすれば、Visio VBAの基本はバッチリですよ。さあ、一緒に見ていきましょう。

1. 構造を理解する:Visioは「入れ子」の宇宙である

コードを書く前に、まず頭の中に「地図」を描いてください。プログラミングが苦手な人の多くは、いきなりコードを書き始めますが、一流のエンジニアは必ず「オブジェクトの親子関係」をイメージします。

Visioのデータ構造は、以下のような階層(ツリー構造)になっています。

[Document] (ファイル全体)
  └── [Page] (ページ1)
        ├── [Shape] (図形A)
        └── [Layer] (レイヤーα)  <-- 今回、ここを狙い撃ちします
  └── [Page] (ページ2)
        ├── [Shape] (図形B)
        └── [Layer] (レイヤーβ)

私たちがやりたいことは、このツリーを上から順番に降りていき、「ページ」を見つけたら、その中にある「レイヤー」をすべて拾い集める、という作業です。これをプログラミング用語で「ループ処理(反復処理)」と呼びます。

2. 実装:全レイヤー抽出エクスポート・ツール

それでは、魂を込めたコードを紹介します。このコードは、VisioからExcelを呼び出し、情報を流し込む「二刀流」のプログラムです。

以下のコードを、VisioのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けてください。

Option Explicit

''' <summary>
''' 全ページのレイヤー名を抽出し、Excelへ出力するメインルーチン
''' </summary>
Sub ExportAllLayersToExcel()
    ' --- 1. 変数宣言 (メモリの確保) ---
    ' Visio関連のオブジェクト
    Dim vDoc As Visio.Document
    Dim vPg As Visio.Page
    Dim vLyr As Visio.Layer
    
    ' Excel関連のオブジェクト (Late Binding: 参照設定なしでも動くように設計)
    Dim xlApp As Object
    Dim xlWB As Object
    Dim xlSheet As Object
    
    ' 管理用の変数
    Dim rowIdx As Long
    
    ' --- 2. 初期設定とエラーハンドリング ---
    On Error GoTo ErrorHandler
    Set vDoc = ActiveDocument
    
    ' Excelアプリケーションの起動
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True ' 動作を確認するためExcelを表示
    
    ' 新しいワークブックを作成
    Set xlWB = xlApp.Workbooks.Add
    Set xlSheet = xlWB.Sheets(1)
    
    ' --- 3. Excelのヘッダー作成 ---
    With xlSheet
        .Cells(1, 1).Value = "Page Name"
        .Cells(1, 2).Value = "Layer Name"
        ' 見出しを少し豪華に(エンジニアのこだわり)
        .Range("A1:B1").Font.Bold = True
        .Range("A1:B1").Interior.Color = RGB(220, 220, 220)
    End With
    
    rowIdx = 2 ' 書き出し開始行
    
    ' --- 4. メインループ (ここが心臓部) ---
    ' 全てのページを順番に巡回する
    For Each vPg In vDoc.Pages
        
        ' そのページにレイヤーが存在するか確認
        ' ※レイヤーが一つも無いページでもエラーにならないようループを回す
        If vPg.Layers.Count > 0 Then
            
            ' ページ内の全レイヤーを順番に巡回する
            For Each vLyr In vPg.Layers
                
                ' Excelに書き出し
                xlSheet.Cells(rowIdx, 1).Value = vPg.Name  ' ページ名
                xlSheet.Cells(rowIdx, 2).Value = vLyr.Name ' レイヤー名
                
                rowIdx = rowIdx + 1 ' 次の行へ
            Next vLyr
            
        Else
            ' レイヤーがないページの場合の記録(必要に応じて)
            xlSheet.Cells(rowIdx, 1).Value = vPg.Name
            xlSheet.Cells(rowIdx, 2).Value = "(No Layers Found)"
            rowIdx = rowIdx + 1
        End If
        
    Next vPg
    
    ' --- 5. 後処理 ---
    ' 列幅を自動調整して見やすくする
    xlSheet.Columns("A:B").AutoFit
    
    MsgBox "抽出が完了しました!" & vbCrLf & "合計 " & (rowIdx - 2) & " 件のレイヤーが見つかりました。", vbInformation
    
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました。内容を確認してください。" & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Description: " & Err.Description, vbCritical
    
    ' エラー時もExcelを解放するために少しケア
    If Not xlApp Is Nothing Then
        ' xlApp.Quit ' 必要に応じてExcelを閉じる設定に
    End If
End Sub

3. プロの視点:コードの「急所」を解説する

このコードをただコピペして終わりにするのは、もったいない。なぜこの書き方をしているのか、その「意図」を理解してください。

① Late Binding(遅延結合)の選択

コード内で `CreateObject(“Excel.Application”)` を使っています。これは「Late Binding」と呼ばれる手法です。
もし、`Dim xlApp As Excel.Application` と書くと、事前にVisio側で「Excelの参照設定」を行う必要があります。しかし、これを行うと、Excelのバージョンが異なるPCで動かした時に「参照不可」のエラーで止まってしまいます。
「どこでも動くツール」を作るには、このLate Bindingが鉄則です。

② 二重ループの構造

`For Each vPg In vDoc.Pages` の中に `For Each vLyr In vPg.Layers` が入っています。
これは「外側の箱(ページ)を開け、その中にある中身(レイヤー)をすべて取り出す」という動きです。この「入れ子構造」こそが、複雑なドキュメントを解析する際の基本パターンです。

③ エラーハンドリングの重要性

`On Error GoTo ErrorHandler` を入れています。
自動化ツールにおいて、エラーでプログラムが突然「強制終了」することは、ユーザーの信頼を失う最大の原因です。エラーが起きたときに「何が起きたのか」を教えてくれる仕組みを作っておくこと。これがプロの仕事です。

4. 陥りやすい罠(トラブルシューティング)

初心者がこのツールを使う際に直面するかもしれない壁を、先回りして潰しておきましょう。

1. 「Excelが立ち上がったまま、Visioが固まった!」

  • 原因:コードの途中でエラーが発生し、`xlApp`(Excel)の制御を失った状態です。
  • 対策:タスクマネージャーを開き、バックグラウンドで動いている「Excel」を強制終了してください。開発中は `xlApp.Visible = True` にしておき、動作を確認しながら進めるのが安全です。

2. 「レイヤー名が空っぽに見える」

  • 原因:レイヤー自体は存在するが、名前が設定されていない(あるいは特殊な制御がかかっている)可能性があります。
  • 対策:今回のコードでは `vLyr.Name` を取得していますが、もし特殊なプロパティが必要な場合は、`vLyr.Application.ActiveDocument.Application.Debug.Print` などで、オブジェクトの内部情報を覗き見る必要があります。

最後に:一歩先へ進むあなたへ

お疲れ様でした。これであなたは、「Visioの内部構造をスキャンして、外部(Excel)へ持ち出す」という、非常に強力な武器を手に入れました。

このコードをベースにすれば、「レイヤー名だけでなく、そのレイヤーが何色か?」「何個の図形が含まれているか?」といった情報の抽出も、ループの中に一行追加するだけで実現できます。

「マクロの記録」は、あくまで「録画」です。しかし、今回学んだ「オブジェクトモデルの操作」は、「演出(プログラミング)」です。

次は、その演出で、どんな魔法をかけたいですか?
道は続いています。楽しんで進んでくださいね。

タイトルとURLをコピーしました