【入門編】【中級者向け】ページ名に「連番」を付与し、Excelの目次と完全に同期させる自動リネーム処理 – Visio VBA解析バイブル

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

【Visio VBA極意】ページ順序の入れ替えに怯えない!Excel目次と「完全同期」する自動リネーム・アルゴリズム

こんにちは。現場の自動化を支えるチーフアーキテクトです。

Visioで大規模な構成図やフローチャートを作成していると、必ずと言っていいほど直面する「ある問題」があります。それは、「ページの順番を入れ替えた瞬間、ページ名に付けた連番と、管理用のExcel目次がバラバラになってしまう」という問題です。

「ページをドラッグして移動したあとに、一つずつ名前を手動で書き換える……」
「Excelの目次も、順番に合わせて行を入れ替える……」

もしあなたが、そんな非効率な作業に時間を溶かしているとしたら、それは非常にもったいない。マクロの記録機能で「名前を変える操作」を記録するだけでは、この「動的な変化」には対応できません。

今日は、一歩上のレベルへ進むために、「ページのインデックス(並び順)」と「外部データ(Excel)」を論理的に結合させる、プロフェッショナルな同期アルゴリズムを伝授します。

ここをクリアすれば、あなたのVisio操作は「描画」から「システム管理」へと進化しますよ。

1. なぜ「マクロの記録」では通用しないのか?

まず、初学者が陥りやすい罠についてお話ししましょう。

「マクロの記録」は、あなたがマウスで行った「操作の軌跡」を記録するものです。例えば、「ページ1の名前を『01_設計』に変更する」という操作を記録すると、コードには `ActivePage.Name = “01_設計”` と直接書き込まれます。

しかし、実務ではこうなりますよね?

  • 2番目にあったページを、1番目に持ってくる。
  • すると、もともと1番目だったページは「2番目」になるはず。

「マクロの記録」で作ったコードは、「今、何番目に何があるか」という状態(ステート)を判断できないのです。私たちが書くべきは、「操作」ではなく「ルール(論理)」です。

2. 核心となる設計思想:インデックス・ドリブン・シンクロナイゼーション

今回実装するアルゴリズムの設計図はこうです。

1. Visioの全ページを、現在の「並び順(Index)」に従ってループで走査する。
2. 各ページに対して、「現在のインデックス番号」に基づいた新しい名前を生成する。
3. 生成した名前を、Visioのページ名に適用する。
4. 同時に、その名前をExcelの管理表へ書き込む。

ここで重要なのは、「名前そのもの」を基準にするのではなく、「今、何番目に並んでいるか」を基準にするという点です。

3. 実装コード:ExcelとVisioを完全同期させる

それでは、魂を込めて書いたコードを見ていきましょう。このコードは、Excelが起動している状態でVisioから実行することを想定しています。

Option Explicit

''' <summary>
''' Visioのページ順序に基づき、ページ名を連番にリネームし、
''' 同時にExcelの目次シートを更新する。
''' </summary>
Sub SyncPagesWithExcelIndex()
    Dim vsoDoc As Visio.Document
    Dim vsoPage As Visio.Page
    Dim xlApp As Object ' Excel.Application
    Dim xlWB As Object  ' Excel.Workbook
    Dim xlSheet As Object ' Excel.Worksheet
    Dim i As Integer
    Dim newName As String
    Dim prefix As String
    
    ' --- 設定エリア ---
    prefix = "P" ' ページ名の接頭辞 (例: P01, P02...)
    ' ------------------

    On Error GoTo ErrorHandler

    Set vsoDoc = ActiveDocument
    
    ' 1. Excelへの接続を試みる
    ' 既に開いているExcelインスタンスを取得
    On Error Resume Next
    Set xlApp = GetObject(, "Excel.Application")
    On Error GoTo ErrorHandler
    
    If xlApp Is Nothing Then
        MsgBox "Excelが起動していません。Excelを開いてから実行してください。", vbCritical
        Exit Sub
    End If

    ' 2. 対象のワークブックとシートを指定 (ここではアクティブなものを対象)
    Set xlWB = xlApp.ActiveWorkbook
    Set xlSheet = xlWB.ActiveSheet ' 目次が書かれているシートを指定してください

    ' 描画停止(パフォーマンス向上と画面のチラつき防止)
    vsoDoc.Application.ScreenUpdating = False

    ' 3. 【重要】ページのリネーム処理
    ' VisioのPageコレクションは1から始まります
    ' 注意:名前の重複エラーを避けるため、一旦「一時的な名前」にする二段構えが理想ですが、
    ' ここではシンプルに、インデックスに基づいたリネームを行います。
    
    For i = 1 To vsoDoc.Pages.Count
        Set vsoPage = vsoDoc.Pages(i)
        
        ' 新しい名前の生成 (例: P01, P02...)
        ' Format関数を使って、桁数を揃えるのがプロの作法です
        newName = prefix & Format(i, "00")
        
        ' Visioのページ名を変更
        ' ※ページ名が既に同じ場合はエラーになるため、エラーをスキップする設計にします
        On Error Resume Next
        vsoPage.Name = newName
        On Error GoTo ErrorHandler
        
        ' 4. Excelへの書き込み
        ' ExcelのA列に連番、B列にVisioのページ名を書き込む例
        xlSheet.Cells(i, 1).Value = i             ' A列: 管理番号
        xlSheet.Cells(i, 2).Value = vsoPage.Name  ' B列: ページ名
    Next i

    ' 描画再開
    vsoDoc.Application.ScreenUpdating = True
    
    MsgBox "同期が完了しました!" & vbCrLf & "Visioの順序とExcelの目次を一致させました。", vbInformation

    Exit Sub

ErrorHandler:
    vsoDoc.Application.ScreenUpdating = True
    MsgBox "エラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "エラー内容: " & Err.Description, vbCritical
End Sub

4. アーキテクトの視点:陥りやすいエラーと回避策

このコードを動かす際、あるいは自分で改造する際に、必ず意識してほしい「プロの勘所」が3つあります。

① 「名前の衝突」という地雷

Visioでは、同じ名前のページを2つ作ることはできません。
例えば、ページが `P01, P02, P03` と並んでいるとき、`P02` を `P01` に変えようとすると、「既にその名前は存在します」とエラーになります。

解決策:
より堅牢なコードにするなら、「一度すべてのページ名を `TEMP_01` のように一時的な名前に変えてから、本番の名前を付ける」という、2パス(2段階)処理を行うのが定石です。

② Excelへの接続(Late Binding vs Early Binding)

上記のコードでは `Object` 型を使用する「Late Binding(遅延結合)」という手法を使っています。これは、Excelの参照設定をしていなくても動くため、配布するツールとしては非常に安全です。
しかし、開発中に「入力補完(インテリセンス)」が効かないため、少し不便です。開発時は参照設定を行い、配布時はこのコードのように書くのが、賢いエンジニアのやり方です。

③ `ScreenUpdating` の重要性

大量のページを処理する場合、画面の更新を止めない(`ScreenUpdating = False` にしない)と、処理速度が劇的に低下し、さらに画面がチカチカと激しく動いてユーザーにストレスを与えます。「ユーザーの目に触れる動きを制御する」。これも自動化エンジニアの重要な責務です。

まとめ:ここをクリアすれば、基本はバッチリです

今回のポイントを振り返りましょう。

1. 「操作」を記録するのではなく、「並び順(Index)」に基づいた「ルール」を書く。
2. `Format(i, “00”)` を使い、桁数を揃えて美しく管理する。
3. VisioとExcel、両方のオブジェクトを制御し、情報の整合性を保つ。

この「データの同期」という考え方は、Visioに限らず、あらゆる業務自動化(RPAやシステム開発)の根幹となる概念です。

最初はエラーが出るかもしれません。でも、エラーメッセージはあなたを拒絶しているのではなく、「より安全な設計にするためのヒント」をくれているのです。

さあ、このコードを自分の環境に合わせてカスタマイズしてみてください。それが、伝説のエンジニアへの第一歩です。応援していますよ!

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