【入門編】【中級者向け】Visio図面を開く際、外部データソース(Excel/SQL)のリンクを更新せずに開く高速化設定 – Visio VBA解析バイブル

スポンサーリンク

こんにちは! Visio VBAの世界へようこそ。
大規模な組織図、複雑なネットワーク図、プラントの配管図……。仕事でVisioを使っていると、外部のExcelやSQLデータベースと連携させた「データ連動図面」に出会うことがよくありますよね。

さて、ここで一つ、現場のエンジニアなら誰もが一度は直面する「あの瞬間」を思い出してください。

「ちょっと中身を確認したいだけなのに、図面を開いた瞬間にExcelやSQLサーバーへデータを取りにいき、画面がフリーズしたように何十秒も固まる……」

あの待ち時間、地味にストレスですよね。しかも、今日やりたいのは「データの更新」ではなく「図形のレイアウト修正」や「テキストの微調整」だけなのに!

実は、Visio VBAのコードを一行書き換えるだけで、この無駄な待ち時間を一瞬でゼロにできる魔法のような設定があるんです。今回は、マクロの記録から一歩抜け出し、現場で即戦力となる「外部データの更新を抑制して図面を高速オープンする技術」を、優しく徹底的に解説していきますね!

ここをクリアすれば、あなたのVisio自動化スキルは間違いなく中級者の領域に到達しますよ。一緒にマスターしていきましょう!

—

なぜ、デフォルトのVisioはあんなにも遅いのか?

私たちが普段、Visioのファイル(.vsdx)をダブルクリックして開くとき、Visioの裏側では何が起きているでしょうか?

もしその図面に「外部データ(Excelやデータベース)とのリンク」が設定されていると、Visioは親切心(余計なお世話?)から、図面を開いた瞬間に自動でデータソースへ接続し、最新のデータを取得しにいこうとします。

  • ネットワーク越しにある重たいSQLサーバー
  • 共有サーバーの奥深くにある巨大なExcelファイル

これらが絡み合っていると、図面を開くだけでCPUとネットワークがフル稼働し、Visioが固まったようになります。これをVBAのプロパティでコントロールするのが今回のテーマです。

—

解決の鍵:`OpenEx` メソッドと「データ更新抑制」のフラグ

通常、VBAで図面を開くときは `Workbooks.Open` のような感覚で `Documents.Open “ファイルパス”` を使いますよね。

しかし、Visioにはもっと強力で柔軟な開き方が用意されています。それが `Documents.OpenEx` メソッド です。

この `OpenEx` を使うと、「読み取り専用で開く」「ウィンドウを表示せずに開く」といった制御に加え、今回最も重要な「外部データのリンクを更新せずに開く」という指定が可能になります。

魔法のフラグ:`visOpenDontUpdateData`

`OpenEx` メソッドの引数には、開くときの動作を決める「フラグ(定数)」を組み合わせて渡します。その中の一つが `visOpenDontUpdateData` です。

これを使うことで、Visioに対してこう命令できます。
> 「おい、データソースは見に行くな! 今あるキャッシュ(過去のデータ)のままでいいから、とにかく速く図面を開け!」

—

実践! 爆速で図面を開くVBAコード

それでは、実際に開発現場でそのままコピペして使える実用的なコードを見ていきましょう。
エラーハンドリング(もしファイルがなかったらどうするか)も考慮した、プロ仕様のコードになっています。

Sub OpenDrawingWithoutDataRefresh()
‘ 変数の宣言
Dim targetPath As String
Dim visDoc As Visio.Document

‘ 1. 開きたい図面のファイルパスを指定してください
‘ ※ご自身の環境のパスに書き換えてください
targetPath = “C:\VisioData\LargeNetworkMap.vsdx”

‘ 2. ファイルの存在チェック(基本のエラー対策)
If Dir(targetPath) = “” Then
MsgBox “指定したファイルが見つかりません: ” & vbCrLf & targetPath, vbCritical, “エラー”
Exit Sub
End If

‘ 3. 画面描画を停止してさらにパフォーマンスを向上させる
Visio.Application.ScreenUpdating = False

On Error GoTo ErrorHandler

‘ 4. 【核心】OpenExメソッドを使い、データ更新を抑制して図面を開く
‘ 第2引数に `visOpenRO` (読み取り専用) や `visOpenDontUpdateData` (データ更新なし) を指定
Set visDoc = Visio.Documents.OpenEx(targetPath, visOpenRO + visOpenDontUpdateData)

‘ 5. 開いた後の処理(例:ログ出力やメッセージ)
MsgBox “外部データの更新をスキップして、高速に図面を開きました!”, vbInformation, “完了”

CleanUp:
‘ 6. 画面描画の復元(絶対に忘れないこと!)
Visio.Application.ScreenUpdating = True
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
Resume CleanUp
End Sub

コードのここがポイント!

1. `Visio.Documents.OpenEx(パス, フラグ)`
普通の `Open` ではなく `OpenEx` を使っている点が最大のポイントです。
2. `visOpenDontUpdateData`
これが今回の主役です。外部データソースへのアクセスを完全にシャットアウトし、図面のオープン時間を劇的に短縮します。
3. `visOpenRO` との組み合わせ
「編集目的ではなく、確認・レイアウト調整目的だから読み取り専用(RO)で十分」という場合は、`+ visOpenRO` のように足し算(ビット演算)でフラグを組み合わせるのが、実務において非常にスマートなテクニックです。
4. `ScreenUpdating = False` の合わせ技
図形が多い図面を開く際、Visioが画面を再描画するコストも馬鹿になりません。VBAの冒頭で描画を止め、開き終わったら戻す。この一手間で体感速度がさらに上がります。

—

陥りやすい罠と注意点(エンジニアの知見)

ここで、現場でありがちな「やらかしポイント」を共有しておきますね。

  • 罠1:開いた後にデータを更新したくなった場合は?

このコードで開いた図面は、データが更新されていません。もし後からやっぱり最新データに更新したくなった場合は、VBAから `visDoc.UpdateAllData` メソッドを呼び出すことで、任意のタイミングでデータを再取得させることができます。

  • 罠2:フラグの定数が認識されない?

Visio VBAエディタで `visOpenDontUpdateData` と入力した際、正しく補完が出ない場合は、開発環境の参照設定([ツール] > [参照設定])で「Microsoft Visio XX.X Type Library」にチェックが入っているか確認してください。

—

まとめ

いかがでしたか?

今回は、大規模なVisio図面をストレスなく開くための「外部データ更新の抑制設定」について解説しました。

  • 重たい図面は `Documents.OpenEx` を使うべし。
  • `visOpenDontUpdateData` フラグで無駄なデータフェッチをカットする。
  • 読み取り専用(`visOpenRO`)と組み合わせれば、安全性もスピードもパーフェクト。

このテクニック一つ知っているだけで、毎日のイライラから解放され、業務の効率がグッと上がります。「マクロの記録」で作られたコードを卒業し、こうしたAPIの意図を理解したコードを書けるようになると、VBAを書くのがもっと楽しくなりますよ。

あなたのVisio自動化ライフが、より快適で知的になりますように。それではまた次の現場でお会いしましょう!

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