こんにちは!Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して、生成された呪文のようなコードを眺めて「どうして動くのか分からない……」と途方に暮れていませんか?
大丈夫です。ここをクリアすれば、Visio VBAの基本はバッチリですよ。
今回は、実務で最もよく使われる「テンプレート(.vstx)からの新規図面生成」と、「生成直後のレイヤー初期化処理」を、プロの現場でも通用する作法とともに優しく紐解いていきます。
単なるコードのコピペではなく、「なぜその記述が必要なのか」「Visioの裏側で何が起きているのか」という本質を一緒に理解していきましょう。
—
1. なぜ「テンプレートからの新規作成」が重要なのか?
業務で図面を描くとき、毎回ゼロから用紙サイズを選び、グリッド線を引いて……なんてやっていませんよね? 企業やプロジェクトごとの「お作法」が詰まったテンプレートファイル(`.vstx`)をベースにするのが鉄則です。
しかし、初心者がやりがちな間違いがこれです。
> ❌ やりがちなミス
> `Workbooks.Open` や `Documents.Open` を使って、テンプレートファイルを直接「上書き保存」しそうになってしまう。
テンプレート(.vstx)は、あくまで「ひな形」です。これを直接開いて編集してしまうと、うっかり上書き保存したときに元ネタが破壊されてしまいます。
正しくは、「テンプレートを『新規図面(.vsdx)』の種として読み込ませる」というアプローチを取ります。
—
2. 実装コード:テンプレート読込とレイヤー初期化の全貌
それでは、実際のコードを見てみましょう。
そのままVBE(Visual Basic Editor)の標準モジュールに貼り付けて実行できる、実用的なコードです。
Option Explicit
‘ ==============================================================================
‘ 処理名: テンプレートから新規図面を作成し、レイヤーを初期化する
‘ 解説 : 指定した.vstxから新しいドキュメントを起こし、図面内のレイヤーを
‘ 安全に制御するプロフェッショナルな基本パターン
‘ ==============================================================================
Sub CreateNewDrawingFromTemplate()
‘ 1. 変数の宣言(型を明確に指定するのがVisio VBAの第一歩です)
Dim targetTemplatePath As String
Dim targetSavePath As String
Dim docNew As Visio.Document
Dim vsoPage As Visio.Page
Dim vsoLayer As Visio.Layer
Dim layerFound As Boolean
‘ エラーハンドリングの準備
On Error GoTo ErrorHandler
‘ 2. パスの設定(環境に合わせて書き換えてください)
‘ 例: C:\VisioTemplates\Network_Template.vstx
targetTemplatePath = “C:\YourFolder\YourTemplate.vstx”
targetSavePath = “C:\YourFolder\OutputDrawing_” & Format(Now, “yyyymmdd_HHMMSS”) & “.vsdx”
‘ 3. 【最重要】テンプレートを指定して新しいドキュメントを作成する
‘ Documents.Add メソッドの引数にテンプレートのパスを渡します。
‘ これにより、テンプレートを元にした「無題(Document1など)」の新規図面が立ち上がります。
Set docNew = Application.Documents.Add(targetTemplatePath)
‘ 4. 操作対象のページを取得する(通常はアクティブページの1ページ目)
Set vsoPage = docNew.Pages(1)
‘ ==============================================================================
‘ 5. レイヤーの初期化処理
‘ ==============================================================================
‘ 図面内に特定のレイヤー(例:「非表示メモ」レイヤー)が存在するかチェックし、
‘ なければ新規作成、あれば設定を整えます。
layerFound = False
For Each vsoLayer In vsoPage.Layers
If vsoLayer.Name = “非表示メモ” Then
layerFound = True
Exit For
End If
Next vsoLayer
‘ レイヤーが存在しない場合は新しく作成する
If layerFound = False Then
Set vsoLayer = vsoPage.Layers.Add(“非表示メモ”)
Debug.Print “「非表示メモ」レイヤーを新しく作成しました。”
Else
Debug.Print “「非表示メモ」レイヤーは既に存在します。”
End If
‘ レイヤーの特性を設定する(例:印刷不可・ロック状態にするなど)
‘ visLayerColor など、Visio特有の定数をここで活用します。
‘ 今回は「印刷されない設定(visLayerPrint = False)」を例示します。
vsoLayer.CellsC(visLayerPrint).FormulaU = False
‘ 6. 生成した図面を新規ファイルとして保存する
docNew.SaveAs targetSavePath
MsgBox “図面の初期化が完了しました!” & vbCrLf & “保存先: ” & targetSavePath, vbInformation, “成功”
‘ 7. オブジェクトの解放(メモリ管理の美学)
Set vsoLayer = Nothing
Set vsoPage = Nothing
Set docNew = Nothing
Exit Sub
ErrorHandler:
‘ 予期せぬエラーが発生した場合の安全装置
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”
‘ エラー時もオブジェクトを解放
Set vsoLayer = Nothing
Set vsoPage = Nothing
Set docNew = Nothing
End Sub
—
3. コードの急所をエンジニア目線で解説!
初心者の壁をスルスルと超えるために、上記のコードで絶対に押さえておくべきポイントを3つに絞って解説します。
① `Documents.Add` と `Documents.Open` の違い
- `Documents.Open(“path.vsdx”)` :既存のファイルを「そのまま」開きます。上書き保存に注意。
- `Documents.Add(“path.vstx”)` :テンプレートを「元ネタ」にして、新しい独立した図面を生成します。
今回はテンプレートから新しい世界(図面)を生み出したいので、必ず `Documents.Add` を使います。ここを間違えると実務で大事故(テンプレートの上書き破壊)に繋がるので注意してくださいね。
② Visio固有の「コレクション走査」
レイヤーを操作するとき、`vsoPage.Layers(“レイヤー名”)` と直接指定することもできますが、もしその名前のレイヤーがテンプレート側に存在しなかった場合、容赦なく実行時エラー(VBAが強制終了する現象)が発生します。
そのため、今回のコードでは `For Each` を使って、
> 「お、その名前のレイヤーはあるかい? ないなら新しく作っちゃおうね」
という安全確認(ディフェンシブ・プログラミング)を行っています。現場で動くマクロには、こうした泥臭い優しさが不可欠です。
③ シェイプシートの扉を叩く `.FormulaU`
`vsoLayer.CellsC(visLayerPrint).FormulaU = False`
なにやら呪文のようなプロパティが出てきましたね。
Visio VBAの最大の特徴であり、少しとっつきにくい部分がこの シェイプシート(ShapeSheet)構造 です。「レイヤーが印刷されるかどうか」というプロパティも、内部のセルの数式(Formula)として管理されています。
末尾の `U` は Universal(普遍的) の略で、言語環境(日本語版や英語版など)に依存しない世界共通の数式を書き込むお約束のお呪いだと覚えておいてください。
—
4. 陥りがちなエラーと対処法
最後に、このコードを動かすときによくある「つまずきポイント」を先回りして解決しておきます。
- エラー:「ファイルが見つかりません」
- 原因:`targetTemplatePath` で指定したパスに `.vstx` が存在しない、またはファイル名や拡張子が間違っている。
- 対策:エクスプローラーからファイルの「パスのコピー」を行い、コードに貼り付けて確認しましょう。
- エラー:「オートメーション エラーです」または「オブジェクト変数が見つかりません」
- 原因:Visioがまだ完全に立ち上がっていない状態や、すでに閉じられたオブジェクトを操作しようとした。
- 対策:処理の最初に `Option Explicit` を書き、変数の宣言漏れを防ぐとともに、コードの最後で `Set xxx = Nothing` とメモリを綺麗に掃除する癖をつけましょう。
—
まとめ
お疲れ様でした!
今回は「テンプレートからの新規図面生成」と「レイヤーの安全な初期化」という、自動化の第一歩であり、最も重要な土台を学びました。
ここさえマスターしてしまえば、あとは形状(シェイプ)を配置したり、データを流し込んだりする応用編へスムーズに進むことができます。
「マクロの記録」を卒業し、自分の手でロジックをコントロールする楽しさを、ぜひ次の自動化でも味わってみてくださいね。
あなたのVisio自動化ライフが、よりスマートで快適なものになりますように!
