【入門編】【初心者向け】特定のレイヤーに属する図形を全ページから一括選択し、色を一括変更する便利ツール – Visio VBA解析バイブル

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

【Visio VBA 掌握術】レイヤーを操り、全ページの色を一括変更する——「マクロ記録」の先へ行くための第一歩

こんにちは。Visioの自動化の世界へようこそ。

「マクロの記録」ボタンを押して、自分の操作をコードに変換してみた。でも、出来上がったコードを見て「これ、どうやって応用すればいいんだろう?」と立ち止まってしまったことはありませんか?

もしそうなら、おめでとうございます。あなたは今、「単なる操作の記録」から「ロジックによる制御」へとステップアップする境界線に立っています。

今日は、Visio VBAにおける最も基本的かつ強力な武器の一つである「オブジェクトの走査(ループ処理)」をマスターしましょう。テーマは、「特定のレイヤーに属する図形だけを全ページから探し出し、その色を一括で変更する」というものです。

これができるようになれば、あなたはもう「手作業で図形を一つずつクリックして色を変える」という苦行から解放されます。さあ、一緒にプログラミングの本質に触れていきましょう。

1. 構造を理解する:Visioの「階層(オブジェクトモデル)」

コードを書く前に、まずVisioがどのような「家系図」を持っているかを理解する必要があります。ここを飛ばすと、エラーの迷宮に迷い込むことになります。

Visioの構造は、大きく分けて以下のような入れ子構造になっています。

1. Application(Visioソフトそのもの)
2. Document(開いているファイル)
3. Page(ファイルの中にある個々のページ)
4. Shape(ページに配置された図形)
5. Layer(図形に付与された属性・グループ)

今回のミッションは、「Document」の中にある「Page」をすべて巡回し、その中の「Shape」を一つずつチェックして、特定の「Layer」に所属しているものだけを見つけ出すことです。

2. 実践:全ページ一括色変更マクロ

それでは、実際に動くコードを見てみましょう。まずはコードを眺めて、その後に「なぜこう書くのか」を丁寧に解説します。

Option Explicit

''' <summary>
''' 指定したレイヤーに属する全ページの図形の色を一括変更する
''' </summary>
''' <param name="targetLayerName">対象とするレイヤーの名前</param>
''' <param name="newR">新しい色の赤(0-255)</param>
''' <param name="newG">新しい色の緑(0-255)</param>
''' <param name="newB">新しい色の青(0-255)</param>
Sub ChangeColorByLayerName(targetLayerName As String, newR As Integer, newG As Integer, newB As Integer)
    Dim pg As Visio.Page          ' ページを格納する変数
    Dim shp As Visio.Shape        ' 図形を格納する変数
    Dim layerExists As Boolean    ' レイヤーが存在するかどうかの判定用
    
    ' 1. 画面更新を停止してパフォーマンスを向上させる(プロの嗜み)
    Application.ScreenUpdating = False
    
    On Error GoTo ErrorHandler ' エラーが発生した場合の飛び先を指定

    ' 2. Document内のすべてのページを順番に見ていく(外側のループ)
    For Each pg In ActiveDocument.Pages
        
        ' 3. そのページ内のすべての図形を順番に見ていく(内側のループ)
        For Each shp In pg.Shapes
            
            ' 4. その図形が「目的のレイヤー」を持っているか判定
            ' Shape.LayerExists メソッドを使うのが最も効率的です
            If shp.LayerExists(targetLayerName) Then
                
                ' 5. 図形の色を変更する
                ' Visioの図形の色は「ShapeSheet」というセル管理されているため、
                ' Cells("FillForeColor") に対してRGB値を書き込みます
                shp.Cells("FillForeColor").Formula = "RGB(" & newR & "," & newG & "," & newB & ")"
                
            End If
            
        Next shp ' 次の図形へ
        
    Next pg ' 次のページへ

    ' 6. 終了処理
    Application.ScreenUpdating = True
    MsgBox "処理が完了しました!", vbInformation
    Exit Sub

ErrorHandler:
    Application.ScreenUpdating = True
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub

''' <summary>
''' 実行用のメインルーチン
''' </summary>
Sub RunMyColorTool()
    ' 例: "重要" という名前のレイヤーに属する図形を、赤色(255, 0, 0)に変える
    Call ChangeColorByLayerName("重要", 255, 0, 0)
End Sub

3. ここが肝心!エンジニアの視点による解説

コードの書き方に慣れてきたら、「なぜこう書くのか」という設計思想に目を向けてください。

なぜ `For Each` を使うのか?

初心者の方は `For i = 1 To PageCount` のような、数字を使ったループを使いがちです。しかし、オブジェクト(PageやShape)を扱う場合は、`For Each` を使うのがベストプラクティスです。

  • 理由: `For Each` は「中身が何個あるか」をVisioが自動で判断してくれます。インデックス番号(何番目か)を管理する必要がないため、コードが読みやすく、かつ「存在しない番号を指定してエラーになる」というミスを防げます。

`shp.LayerExists` の重要性

図形が特定のレイヤーに属しているかどうかを確認する際、初学者は「図形のレイヤー名を取得して、文字列比較する」という方法を思いつきがちです。

しかし、図形は複数のレイヤーに同時に所属できるという性質を持っています。そのため、単なる文字列比較では不十分な場合があります。`shp.LayerExists(“レイヤー名”)` という専用のメソッドを使うことで、その図形がそのレイヤーのメンバーであるかどうかを、最も確実かつ高速に判定できるのです。

ShapeSheet(シェイプシート)へのアクセス

ここがVisio VBAの真髄です。
`shp.Color = RGB(255,0,0)` のような書き方をしたくなるかもしれませんが、Visioのプロパティの多くは、ShapeSheetというExcelのようなセル形式のデータベースで管理されています。
コード内の `shp.Cells(“FillForeColor”).Formula = …` という記述は、「図形の『塗りつぶし色』という名前のセルに、RGBの計算式を書き込む」という操作を行っています。これを理解すると、サイズ、位置、線の太さなど、Visioのあらゆる要素を自在に操れるようになります。

4. 陥りやすいエラーと回避策

このツールを使う際に、初心者がハマりやすいポイントが2つあります。

1. 「指定したレイヤー名が存在しない」エラー
もし、コードに `”重要”` と書いたのに、Visio側に `”重要”` というレイヤーが一つも作られていない場合、処理が混乱することがあります。実行前に、必ずレイヤー名が正確か(全角・半角の違いも含めて)確認しましょう。
2. 処理が重くなる(パフォーマンス問題)
図形が数千個ある巨大なファイルでこれを実行すると、画面が固まったように見えることがあります。これを防ぐために、コードの冒頭に `Application.ScreenUpdating = False` を入れています。これは「処理中に画面を書き換えるな」という命令で、これを入れるだけで処理速度が劇的に向上します。

最後に:一歩踏み出したあなたへ

「マクロの記録」は、いわば「カンニングペーパー」です。それを使って基本を覚えるのは素晴らしいことです。
しかし、今日学んだ `For Each` や `LayerExists`、そして `Cells` へのアクセスといった「ロジックの組み立て方」を知ることで、あなたはカンニングペーパーなしで、自分だけの強力なツールを設計できるエンジニアへと進化しました。

次は、色を変えるのではなく「特定のレイヤーの図形だけを、一括で別のページに移動させる」といった改造にも挑戦してみてください。

ここをクリアすれば、Visio VBAの基本はバッチリですよ。自信を持って、次のコードを書き進めてくださいね。応援しています!

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