【入門編】【上級者向け】SQL Serverから取得したデータに基づき、テンプレートから動的に図面を生成・保存する – Visio VBA解析バイブル

スポンサーリンク

こんにちは! Visio VBAの深淵なる世界へようこそ。
今日は、マクロの記録をポチポチ押すだけの世界から完全に脱却し、「SQL Serverからデータを引き抜き、Visio図面を全自動で爆速生成するエンタープライズ・パイプライン」の作り方を伝授します。

「データベースの情報を元に、何百枚ものネットワーク図やフロアマップを自動生成したい」
実務でそんな無茶振りを受け、途方に暮れていませんか? 大丈夫。ここをクリアすれば、あなたのVisio VBAスキルは間違いなくプロフェッショナル領域に到達します。

今回は、優しく、かつ妥協のないプロの作法でお伝えしていきますね。最後までしっかりとついてきてください!

—

1. 現場で戦うための全体アーキテクチャ

今回構築するのは、以下のデータ駆動型パイプラインです。

[ SQL Server ] –(ADO: 接続・クエリ実行)–> [ VBAメモリ空間 ]
│
(動的シェイプ生成)
▼
[ テンプレートVSDX ]
│
(サイレント保存)
▼
[ PDF自動出力 ]

ただ図形を描くだけのコードはゴミです。実務では「エラーハンドリング」「メモリの確実な解放」「トランザクションの意識」が命取りになります。まずは、その土台となる堅牢なコードの全貌をお見せしましょう。

—

2. 実装コード:データ駆動型図面自動生成エンジン

以下のコードを、VisioのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けてください。

Option Explicit

‘ ==============================================================================
‘ 処理名: SQL Server連携・動的図面生成パイプライン
‘ 概要 : DBから取得したマスターデータをもとに、テンプレートから図面を生成しPDF化する
‘ ==============================================================================
Public Sub GenerateDrawingsFromDatabase()

‘ — 1. 変数の宣言 (遅延バインディングとADO/Visioオブジェクト) —
Dim conn As Object W ‘ ADODB.Connection
Dim rs As Object ‘ ADODB.Recordset
Dim strConn As String ‘ 接続文字列
Dim strSQL As String ‘ 実行するSQL

Dim vsoApp As Visio.Application
Dim vsoDoc As Visio.Document
Dim vsoPage As Visio.Page
Dim vsoMaster As Visio.Master
Dim vsoShape As Visio.Shape

Dim templatePath As String
Dim outputPdfPath As String

‘ エラーハンドリングの準備
On Error GoTo ErrorHandler

‘ 画面描画を停止してパフォーマンスを極限まで引き上げる (重要!)
Set vsoApp = Application
vsoApp.ScreenUpdating = False
vsoApp.ShowAlerts = False

‘ — 2. 接続設定とADOによるデータ取得 —
‘ ※実際の環境に合わせてサーバー名やDB名を書き換えてください
strConn = “Provider=SQLOLEDB;Server=YOUR_SERVER_NAME;Database=YOUR_DB_NAME;” & _
“Trusted_Connection=yes;”

strSQL = “SELECT NodeName, NodeType, PosX, PosY FROM M_NetworkNodes WHERE IsActive = 1;”

Set conn = CreateObject(“ADODB.Connection”)
Set rs = CreateObject(“ADODB.Recordset”)

conn.Open strConn
rs.Open strSQL, conn, 1, 1 ‘ adOpenKeyset, adLockReadOnly

If rs.EOF Then
MsgBox “処理対象のデータが存在しませんでした。”, vbExclamation, “データなし”
GoTo Cleanup
End If

‘ — 3. テンプレート図面のオープン —
templatePath = “C:\VisioTemplates\NetworkBaseTemplate.vsdx”
Set vsoDoc = vsoApp.Documents.Open(templatePath)
Set vsoPage = vsoDoc.Pages(1) ‘ 1ページ目を対象とする

‘ シェイプのマスターを取得(例:ステンシル名「Basic Shapes.vssx」の「Rectangle」)
‘ ※あらかじめテンプレート側でマスターを読み込んでおくのがセオリーです
Set vsoMaster = vsoApp.Documents(“Basic Shapes.vssx”).Masters.ItemU(“Rectangle”)

‘ — 4. データ駆動型の動的シェイプ生成ループ —
Do While Not rs.EOF
‘ 座標とテキストをDBから取得して配置
‘ ※Visioのデフォルト単位はインチなので必要に応じて mmToInch 等で変換
Dim posX As Double, posY As Double
posX = rs.Fields(“PosX”).Value / 25.4 ‘ mmからインチへ変換
posY = rs.Fields(“PosY”).Value / 25.4

‘ マスターから図形をドロップ
Set vsoShape = vsoPage.Drop(vsoMaster, posX, posY)

‘ シェイプにテキスト(ノード名)を流し込む
vsoShape.Text = rs.Fields(“NodeName”).Value

‘ シェイプのシェイプシート(カスタムプロパティ等)にメタデータを埋め込むことも可能
‘ vsoShape.CellsU(“Prop.NodeType”).FormulaU = “””” & rs.Fields(“NodeType”).Value & “”””

rs.MoveNext
Loop

‘ — 5. 保存とPDF出力制御 —
outputPdfPath = “C:\VisioOutput\GeneratedNetwork_” & Format(Now, “yyyymmdd_hhnnss”) & “.pdf”

‘ PDFとしてエクスポート (Visioの標準機能)
vsoDoc.ExportAsFixedFormat visFixedFormatPDF, outputPdfPath, visStandardPrint, visHoldAllPages

‘ 作業用VSDXも別名で保存(変更を保持したい場合)
‘ vsoDoc.SaveAs “C:\VisioOutput\SavedDrawing.vsdx”

‘ 変更を保存せずに閉じる(テンプレートを汚さないため)
vsoDoc.Saved = True
vsoDoc.Close

‘ — 6. 正常終了処理 —
MsgBox “図面の自動生成およびPDF出力が完了しました!”, vbInformation, “成功”
GoTo Cleanup

ErrorHandler:
‘ 予期せぬエラーが発生した場合の緊急避難
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”

Cleanup:
‘ — 7. リソースの確実な解放 (メモリリーク防止) —
On Error Resume Next
If Not rs Is Nothing Then
If rs.State = 1 Then rs.Close
Set rs = Nothing
End If
If Not conn Is Nothing Then
If conn.State = 1 Then conn.Close
Set conn = Nothing
End If

‘ 画面描画の復元
If Not vsoApp Is Nothing Then
vsoApp.ScreenUpdating = True
vsoApp.ShowAlerts = True
End If
Set vsoDoc = Nothing
Set vsoPage = Nothing
Set vsoMaster = Nothing
Set vsoShape = Nothing
Set vsoApp = In_Nothing ‘ 誤記防止のため直書きは避け変数解放へ

End Sub

—

3. チーフアーキテクトが教える、コードの核心と極意

初心者から一歩抜け出すために、上記のコードで絶対に押さべき「3つのポイント」を解説します。

① `ScreenUpdating = False` による爆速化

何百個もの図形を画面上で1つずつ描画していくと、Visioは都度画面を再描画するため、処理が激重(カクカク)になります。
処理の最初に `vsoApp.ScreenUpdating = False` を挟み、最後に `True` に戻す。これだけで実行速度が10倍以上変わることもあります。プロのエンジニアなら常識のテクニックです。

② 単位系の罠(インチとミリメートル)

Visioの内部座標系は「インチ(Inches)」が基準です。しかし、私たちがデータベースに保存する座標(X, Y)は大抵ミリメートル(mm)単位でしょう。
コード内で行っているように、`X / 25.4` のようにミリをインチに換算するロジックを必ず挟んでください。これを忘れると、図形がキャンバスからはみ出るほど巨大に描画されてパニックになります。

③ 容赦ないメモリ解放とエラーハンドリング

ADOのコネクションやRecordset、Visioのドキュメントオブジェクトは、放置するとメモリリークを引き起こし、最悪の場合ExcelやVisio全体を巻き込んでフリーズします。
`On Error GoTo ErrorHandler` を仕掛け、エラーが起なかろうが成功しようが、必ず `Cleanup` ラベルを通ってオブジェクトを `Nothing` に代入する。この「後始作の美学」を体に叩き込んでください。

—

4. 陥りやすい罠とトラブルシューティング

  • Q. 「コンパイルエラー: ユーザー定義型が定義されていません」と言われます。
  • A. VBAエディタのメニューから `ツール` > `参照設定` を開き、「Microsoft ActiveX Data Objects x.x Library」 にチェックを入れてください。ADOを使うための必須手順です。
  • Q. テンプレートのマスターが見つかりませんというエラーが出ます。
  • A. コード内では `Basic Shapes.vssx` を例に出しましたが、お使いの環境やVisioのバージョンによってステンシルのファイル名やマスター名(`ItemU`に指定する名前)が異なります。あらかじめマクロの記録などを使って、正しいマスター名を確認しておきましょう。

—

まとめ

お疲れ様でした!
ここまで理解できたあなたは、単なる「VBAユーザー」ではなく、立派な「業務自動化エンジニア」です。

データベースのデータを自由自在に料理し、Visioを操ってドキュメントを自動生成する仕組みは、日々の定型業務を劇的に削減する強力な武器になります。ぜひ実際の業務データやテスト環境で試してみてください。

ここをクリアすれば、Visio VBAの基本はバッチリです。あなたの自動化ライフの成功を心から応援しています!

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