【入門編】【中級者向け】Excelから「ページ名・サイズ・レイヤー構成」を読み込み、一括でドキュメントを構築する自動生成ツール – Visio VBA解析バイブル

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

【中級者への扉】ExcelからVisioを操る:データ駆動型ドキュメント自動生成の極意

こんにちは。現場の最前線で自動化の設計図を描き続けている、チーフアーキテクトです。

「マクロの記録」を使って、なんとか簡単な操作を自動化できた。そんな喜びを感じているあなた。素晴らしい一歩を踏み出しましたね。でも、もしあなたが「100ページある図面構成を、Excelのリストに基づいて一瞬で作り上げたい」と願うなら、今のやり方では限界が来ます。

マクロの記録は「点」の自動化です。しかし、プロフェッショナルが求めるのは、データに基づいて構造を組み立てる「線」や「面」の自動化。つまり、データ駆動型(Data-Driven)のドキュメント構築です。

今日は、Excelを「設計図(マスターデータ)」、Visioを「施工現場」に見立てて、ページ構成、サイズ、レイヤーまでを完全にコントロールする、一歩上の自動化手法を伝授します。ここをクリアすれば、Visio VBAの基本はバッチリですよ。

1. なぜ「Excel + Visio」の連携が必要なのか?

なぜVisio単体で完結させないのか? それは、「情報の管理コスト」が違うからです。

Visioは「描画」のプロフェッショナルですが、「リスト管理」は苦手です。一方でExcelは、大量のパラメータ(ページ名、寸法、レイヤー名、色指定など)を管理するのに世界で最も優れたツールの一つです。

  • Excel: 「何を作るか」という仕様(Specification)を管理する。
  • Visio: 「どう作るか」という実行(Execution)を担当する。

この役割分担を明確にすることが、大規模な自動化プロジェクトを成功させる設計の鉄則です。

2. アーキテクチャの全体像

今回のツールがどのように動くのか、その設計図を頭に叩き込んでください。

1. Excel側: セルに「ページ名」「幅」「高さ」「レイヤー名」を書き出す。
2. Excel VBA(司令塔): ExcelからVisioアプリケーションを起動し、接続する。
3. ループ処理: Excelの行を一つずつ読み込み、Visioに対して「ページを作れ」「サイズを変えろ」「レイヤーを貼れ」と命令を飛ばす。
4. Visio側: 命令に従い、オブジェクト(Page, Layer, PageSheet)を生成・操作する。

3. 実装コード:ドキュメント自動生成エンジン

それでは、実際に動くコードを見ていきましょう。今回はExcel側からVisioを操作するスタイルで記述します。これが最も制御しやすく、実務的なアプローチです。

事前準備

ExcelのVBAエディタ(Alt + F11)を開き、メニューの [ツール] -> [参照設定] から 「Microsoft Visio 16.0 Type Library」(バージョンは環境によります)にチェックを入れてください。これで、ExcelからVisioの命令が直接書けるようになります。

Option Explicit

''' <summary>
''' Excelのリストに基づき、Visioドキュメントを自動構築するメインルーチン
''' </summary>
Sub GenerateVisioDocument()
    Dim visApp As Visio.Application
    Dim visDoc As Visio.Document
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    
    ' --- 設定エリア ---
    Set ws = ThisWorkbook.Sheets("Sheet1") ' データが入っているシート名
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' A列の最終行を取得
    
    On Error GoTo ErrorHandler
    
    ' 1. Visioアプリケーションの起動
    ' 既に開いているVisioがあればそれを使う、なければ新しく作る
    On Error Resume Next
    Set visApp = GetObject(, "Visio.Application")
    If visApp Is Nothing Then
        Set visApp = New Visio.Application
    End If
    On Error GoTo ErrorHandler
    
    visApp.Visible = True ' 動作を確認するために可視化
    
    ' 2. 新規ドキュメントの作成(テンプレートを指定する場合はここを変更)
    Set visDoc = visApp.Documents.Add("") 
    
    ' 3. Excelのデータに基づいてループ処理
    ' 2行目から開始(1行目はヘッダー想定)
    For i = 2 To lastRow
        Dim pName As String: pName = ws.Cells(i, 1).Value    ' A列: ページ名
        Dim pWidth As Double: pWidth = ws.Cells(i, 2).Value ' B列: 幅(インチ)
        Dim pHeight As Double: pHeight = ws.Cells(i, 3).Value ' C列: 高さ(インチ)
        Dim lName As String: lName = ws.Cells(i, 4).Value    ' D列: 追加するレイヤー名
        
        ' --- Visio操作の核心部 ---
        
        ' A. ページの追加
        Dim vPage As Visio.Page
        Set vPage = visDoc.AddPage2(pName) ' 名前を指定してページ追加
        
        ' B. ページサイズの設定
        ' ここがプロの技。PageSheetのCellを直接操作して寸法を変える
        ' Visioの内部単位はインチやメートル。ここでは入力値をそのまま適用。
        vPage.PageSheet.CellsU("PageWidth.Width").FormulaU = pWidth & " in"
        vPage.PageSheet.CellsU("PageHeight.Height").FormulaU = pHeight & " in"
        
        ' C. レイヤーの追加
        ' レイヤーが存在しない場合のみ追加する処理を入れるのが「壊れないコード」のコツ
        If lName <> "" Then
            Dim vLayer As Visio.Layer
            Dim layerExists As Boolean: layerExists = False
            
            ' 既存レイヤーのチェック
            Dim j As Integer
            For j = 1 To vPage.Layers.Count
                If vPage.Layers(j).Name = lName Then
                    layerExists = True
                    Exit For
                End If
            Next j
            
            ' なければ追加
            If Not layerExists Then
                vPage.Layers.Add lName
            End If
        End If
        
        Debug.Print "作成完了: " & pName
    Next i
    
    MsgBox "ドキュメントの構築が完了しました!", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "エラー内容: " & Err.Description, vbCritical
    If Not visApp Is Nothing Then visApp.Visible = True
End Sub

4. チーフアーキテクトの「極限の知見」:ここが重要だ!

コードをただコピーするだけでは、あなたはまだ「初級者」です。このコードの裏側にある、実戦で差がつくポイントを解説します。

① `PageSheet` を使いこなせ

多くの初心者は、ページのサイズを変えようとして「マクロの記録」を使い、複雑なコマンドを生成してしまいます。しかし、Visioのページ設定は、実は「PageSheet」という巨大な設定シート(プロパティの集合体)に格納されています。
`vPage.PageSheet.CellsU(“PageWidth.Width”).FormulaU`
このように、ユニバーサル名(CellsU)を使って直接式(FormulaU)を書き込む。これが最も確実で、かつ高速な制御方法です。

② オブジェクトの存在確認(防御的プログラミング)

コードの中に `If Not layerExists Then` という判定を入れましたね?
自動化ツールが最も恐れるのは「二重エラー」です。既に存在するレイヤーを再度 `Add` しようとすると、プログラムは即座に停止します。実務用のツールを作る際は、「そのオブジェクトは既に存在するか?」という確認を常にセットで行う癖をつけてください。

③ 単位の扱い(型と単位の罠)

Visioの内部では、寸法は「インチ」や「メートル」といった単位を持っています。Excelから数値を渡す際、単なる `pWidth` ではなく、`pWidth & ” in”` のように単位文字列を明示的に結合して渡すことで、計算ミスや意図しないサイズ変更を防ぐことができます。

5. さあ、次のステップへ

今回のコードを使えば、Excelのリストを書き換えるだけで、10ページでも100ページでも、瞬時に「設計通りのVisioドキュメント」が立ち上がります。

もし、さらに高度なことをしたくなったら、次は「シェイプ(図形)の自動配置」や「コネクタによる接続の自動化」に挑戦してみてください。その時も、今回学んだ「Excelで定義し、Visioで実行する」というアーキテクチャは、あなたの強力な武器であり続けるはずです。

一歩ずつ、確実に。
コードの向こう側にある「自動化による自由な時間」を、ぜひ手に入れてください。応援していますよ!

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