【入門編】【初心者】ステンシル内の特定マスターシェイプを「名前の一部」で曖昧検索してドロップする – Visio VBA解析バイブル

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

マクロの記録を卒業しよう。Visio VBAで「名前の一部」からマスターを呼び出す極意

こんにちは。Visio VBAの世界へようこそ。

「マクロの記録」機能を使って、操作を自動化することに成功したあなた。それは素晴らしい第一歩です。しかし、記録されたコードを眺めてみて、「なんだか動きが硬いな」「名前が少し変わるだけで動かなくなるな」と感じたことはありませんか?

マクロの記録は、いわば「決まった手順の録画」です。しかし、実務の現場では、図形(マスターシェイプ)の名前が微妙に違ったり、検索ワードによって動的に図形を選びたい場面が多々あります。

今日は、「ステンシルの中から、名前の一部が一致するマスターシェイプを探し出し、ページにドロップする」という、実用的かつ、プログラミングの基礎体力を養うのに最適なテクニックを伝授します。

ここをマスターすれば、あなたのVisio自動化は「記録」から「設計」へと進化しますよ。

1. Visioの階層構造を「脳内」にインストールする

コードを書く前に、まずVisioがどのようにオブジェクトを管理しているか、その「地図」を頭に入れておきましょう。ここを曖昧にすると、必ずエラーの迷宮に迷い込みます。

Visioの構造は、大きな箱から小さな箱へと続く入れ子構造になっています。

1. Application(Visioソフトそのもの)
2. Document(今開いている図面ファイル)
3. Stencil(図形のテンプレート集。左側のシェイプパネルにあるもの)
4. Master(ステンシルの中にある、図形の「設計図」)
5. Shape(設計図をもとに、ページ上に配置された「実体」)

今回私たちがやりたいのは、「Stencil」という箱を開け、「Master」たちの名前を一つずつ確認し、条件に合うものを見つけたら、それを「Document」のページに「Drop(配置)」する、という流れです。

2. 実装の核:曖昧検索のロジック

「完全一致」ではなく「名前の一部」で探すには、VBAの `Like` 演算子、あるいは `InStr` 関数を使います。今回は、より直感的で強力なワイルドカード(`*`)が使える `Like` 演算子を使った方法で解説します。

実装コード例

以下のコードは、指定したステンシルの中から、指定したキーワードを含むマスターを探して、アクティブなページに配置する関数です。

Option Explicit

''' <summary>
''' ステンシル内から名前の一部が一致するマスターを検索し、ページに配置する
''' </summary>
''' <param name="stencilName">ステンシルの名前 (例: "Basic Shapes.vssx")</param>
''' <param name="searchKeyword">検索したい文字列 (例: "円")</param>
Sub SearchAndDropMaster(stencilName As String, searchKeyword As String)
    Dim vsoApplication As Visio.Application
    Dim vsoDocument As Visio.Document
    Dim vsoStencil As Visio.Stencil
    Dim vsoMaster As Visio.Master
    Dim vsoPage As Visio.Page
    Dim foundMaster As Visio.Master
    Dim dropPoint As Visio.Point
    
    Set vsoApplication = Visio.Application
    Set vsoDocument = vsoApplication.ActiveDocument
    Set vsoPage = vsoApplication.ActivePage
    
    ' 1. 配置する座標を指定 (ここではとりあえず中央付近)
    Set dropPoint = vsoApplication.NewPoint(4, 4)
    
    On Error Resume Next
    ' 2. ステンシルを開く
    ' ※ すでに開いている場合はそのものを取得、開いていない場合は開く
    Set vsoStencil = vsoApplication.Documents.Item(stencilName)
    
    If vsoStencil Is Nothing Then
        ' ステンシルが開いていない場合は、ファイルから開く試行
        ' (環境に合わせてフルパスを指定するか、標準ステンシル名を指定)
        Set vsoStencil = vsoApplication.Documents.Add(stencilName)
    End If
    On Error GoTo 0

    ' ステンシルが見つからなかった場合の安全策
    If vsoStencil Is Nothing Then
        MsgBox "ステンシル '" & stencilName & "' が見つかりませんでした。", vbCritical
        Exit Sub
    End If

    ' 3. ステンシル内のマスターを一つずつループして検索
    ' ここが「曖昧検索」の核心部です
    For Each vsoMaster In vsoStencil.Masters
        ' Like演算子とワイルドカード(*)を使って部分一致を判定
        ' UCaseを使うことで、大文字・小文字の区別を無視して検索できる(プロの知恵!)
        If UCase(vsoMaster.Name) Like "*" & UCase(searchKeyword) & "*" Then
            Set foundMaster = vsoMaster
            Exit For ' 最初に見つかったものを取り出す
        End If
    Next vsoMaster

    ' 4. 結果の判定とドロップ処理
    If Not foundMaster Is Nothing Then
        ' 見つかったマスターをページにドロップ
        vsoPage.Drop foundMaster, dropPoint.X, dropPoint.Y
        MsgBox "マスター '" & foundMaster.Name & "' を配置しました。", vbInformation
    Else
        MsgBox "キーワード '" & searchKeyword & "' に一致するマスターは見つかりませんでした。", vbExclamation
    End If

End Sub

''' <summary>
''' テスト実行用プロシージャ
''' </summary>
Sub TestSearch()
    ' 例:Basic Shapesステンシルから "Circle" という文字を含むものを探す
    ' ※ステンシル名は環境によって異なる場合があります
    Call SearchAndDropMaster("Basic Shapes.vssx", "Circle")
End Sub

3. ここが「プロ」の視点:ハマりどころと回避策

コードを書いて動いた、それだけで終わってはもったいない。実務でこのコードを運用する際に直面する「壁」をあらかじめ教えておきましょう。

① 大文字・小文字の罠(Case Sensitivity)

VBAの文字列比較は、デフォルトの設定によって大文字と小文字を厳格に区別することがあります。ユーザーが「circle」と入力しても、マスターの名前が「Circle」だったら一致しない……これでは使い勝手が悪すぎます。
コード内で `UCase(vsoMaster.Name) Like “*” & UCase(searchKeyword) & “*”` としているのは、両方を強制的に大文字に変換してから比較することで、この問題を完璧に回避するためです。

② 「どれも一致しない」場合の例外処理

`For Each` ループで何も見つからなかった場合、`foundMaster` は `Nothing` のままになります。これに対してそのまま `.Drop` メソッドを呼び出すと、「オブジェクト変数または With ブロック変数が設定されていません」という、初心者泣かせのエラーが発生します。
必ず `If Not foundMaster Is Nothing Then` というガード条件(防衛策)を入れましょう。

③ ステンシルの「ライフサイクル」管理

今回のコードでは、ステンシルが既に開いているかをチェックしています。もし、マクロの中で大量のステンシルを次々に開くような処理を書く場合、開いたままにするとメモリを圧迫します。
「使うときは開き、使い終わったら閉じる(または共有する)」という意識を持つことが、安定した自動化ツールを作るエンジニアの嗜みです。

4. 次のステップへ

お疲れ様でした!これであなたは「名前が分からないけれど、なんとなく分かっている」という曖昧な情報から、Visioを自在に操る術を手に入れました。

このロジックを応用すれば、例えば:

  • 「ユーザーに入力させたキーワードで、自動的に構成図の部品を並べる」
  • 「特定のルールに基づいて、大量の図形を自動生成する」

といった、より高度なアプリケーション開発へとステップアップできます。

プログラミングは、一度に全てを理解しようとしなくて大丈夫です。一つ一つの「なぜ?」を大切に、このコードを自分なりに改造してみてください。

「コードは書くものではなく、組み立てるもの」

その感覚が掴めたとき、あなたはもう、単なるユーザーではなく、エンジニアの入り口に立っていますよ。応援しています!

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