【入門編】【全対象】Visio VBAにおける「ファイルが見つかりません」エラーを未然に防ぐパスバリデーション – Visio VBA解析バイブル

スポンサーリンク

こんにちは! Visioの自動化の世界へようこそ。
マクロの記録ボタンを押すだけの日常から一歩抜け出し、「自分の手でVisioを意のままに操りたい」と願うあなたを、私は心から歓迎します。

さて、業務効率化のVBAを書いているとき、最もテンションが下がり、かつ最も頻発するエラーは何だと思いますか?
そう、「実行時エラー ’53’: ファイルが見つかりません」 です。

せっかく組んだ自動化スクリプトが、ファイルパスの打ち間違いや、共有サーバーの切断といった些細な理由で途中でプツンと止まってしまう……。これでは、安心して「自動化できた!」とは言えませんよね。

今回は、Visio VBAの現場でプロが必ず実装している、「ファイル操作エラーを未然に鉄壁のガードで防ぐパスバリデーション(妥当性検証)」の極意を、優しく、そして本質的なところまで徹底的に解説します。ここをクリアすれば、あなたのVBAスキルは確実にワンランク上のステージに到達しますよ!

—

なぜ、Visio VBAのファイル操作はエラーになりやすいのか?

Visioで既存の図面ファイル(.vsdx)を開いたり、別名で保存したりするとき、私たちは当たり前のように `Documents.Open` や `Document.SaveAs` といったメソッドを使います。

‘ 【危険なコードの例】
Dim vsoDoc As Visio.Document
‘ もしここにファイルがなかったら…?即座にクラッシュします!
Set vsoDoc = Application.Documents.Open(“C:\Work\MyDrawing.vsdx”)

初心者のうちは、ファイルがあるのが「前提」でコードを書きがちです。しかし、現実のビジネス環境はどうでしょう?

  • 前工程のシステムがまだファイルを出力していなかった
  • フォルダ名が「2023年度」から「2024年度」に変わっていた
  • ネットワークドライブ(共有フォルダ)の接続が一時的に切れていた

こうした「想定外の環境変化」に対して、丸腰のコードは無力です。エラーが起きてVBAのデバッグ画面が立ち上がり、ユーザーを絶望させます。これを防ぐのが「事前バリデーション(検証)」というアプローチです。

—

解決の切り札:FSO(FileSystemObject)の圧倒的な安心感

ファイルが存在するかどうかを調べるために、VBAには古い `Dir` 関数というものもありますが、私たちプロは使いません。癖が強く、予期せぬ挙動をすることがあるからです。

代わりに使うのが、Windowsのファイルシステムを自在に統べる `FileSystemObject`(通称:FSO) です。

FSOの `FileExists` メソッドを使えば、「そのパスにファイルが本当に存在するかどうか」を、操作の「前」に、1行の真偽値(True / False)で確実に判定できます。

準備:参照設定のすすめ

FSOを使うには、VBAの編集画面(VBE)のメニューから [ツール] > [参照設定] を開き、「Microsoft Scripting Runtime」 にチェックを入れておくのが王道です(これをしておくと、入力補完(IntelliSense)が効くようになって劇的にコードが書きやすくなります!)。

—

【実践】ファイルを開く前の「鉄壁のパスバリデーション」コード

それでは、実際に現場でそのままコピペして使える、堅牢なプロシージャを見ていきましょう。
図面ファイルを安全に開き、必要であればPDF出力までをスマートにこなす実用サンプルです。

Sub SafeOpenAndExportVisio()
‘ 1. 変数の定義
Dim fso As Object
Dim targetPath As String
Dim exportPath As String
Dim vsoDoc As Visio.Document

‘ 2. パスの指定(※ご自身の環境に合わせて書き換えてください)
targetPath = “C:\WorkSpace\MasterLayout.vsdx”
exportPath = “C:\WorkSpace\Output\MasterLayout.pdf”

‘ 3. FSOのインスタンス生成
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ ==========================================
‘ 4. 【最重要】ファイル存在チェック(バリデーション)
‘ ==========================================
If Not fso.FileExists(targetPath) Then
‘ エラーで止めるのではなく、優しくメッセージを出して処理を安全に抜ける
MsgBox “指定された図面ファイルが見つかりません。” & vbCrLf & _
“パスを確認してください:” & vbCrLf & targetPath, _
vbCritical, “ファイルエラー”
GoTo CleanUp
End If

‘ 5. 安全が確認されたので、堂々とファイルを開く
Set vsoDoc = Application.Documents.Open(targetPath)
MsgBox “図面を正常にオープンしました!”, vbInformation, “成功”

‘ — ここに図面の編集処理が入ります —

‘ 6. PDF出力の例(保存先フォルダの存在チェックも合わせると完璧です)
Dim parentFolder As String
parentFolder = fso.GetParentFolderName(exportPath)

If Not fso.FolderExists(parentFolder) Then
‘ 出力先フォルダすらない場合は作ってあげる優しさ
fso.CreateFolder (parentFolder)
End If

‘ PDFとして保存
vsoDoc.ExportAsFixedFormat VisFixedFormatPDF, exportPath, _
visRasterized, visPrintAll

MsgBox “PDFのエクスポートが完了しました:” & vbCrLf & exportPath, vbInformation, “完了”

CleanUp:
‘ 7. オブジェクトの解放(メモリリークを防ぐプロの作法)
Set vsoDoc = Nothing
Set fso = Nothing
End Sub

—

コードのここがポイント!エンジニアのこだわり解説

上のコードには、現場で生き残るためのテクニックがギュッと詰まっています。いくつか重要なポイントを噛み砕いて説明しますね。

① 「エラーが起きてから対処」ではなく「起きないように確認」する

初心者向けのコードは、エラーが起きたときの対処(`On Error GoTo …`)に頼りがちです。もちろんエラーハンドリングも重要ですが、「開く前にファイルがあるかチェックする」というロジック(事前バリデーション)のほうが、圧倒的に直感的でバグりにくいのです。

② 出力先フォルダの自動生成(フォルダ・バリデーション)

ファイルだけでなく、「PDFの保存先フォルダそのものが存在しない」というエラーもよくあります。
FSOの `GetParentFolderName` で親フォルダのパスを抽出し、`FolderExists` でチェック。なければ `CreateFolder` で自動作成する。ここまで作り込むと、ユーザーから「このマクロ、賢いね!」と絶賛されること間違いなしです。

③ 終わったら必ず片付ける(メモリの解放)

`Set fso = Nothing` や `Set vsoDoc = Nothing` です。VBAはプログラム終了時に自動でメモリを解放してくれますが、長時間の処理や巨大なVisio図面を扱う際、明示的にオブジェクトを空っぽにする(解放する)癖をつけておくと、Visio特有の「動作が重くなる・フリーズする」というトラブルを劇的に減らすことができます。

—

まとめ:ここをクリアすれば、Visio VBAの基本はバッチリです!

今回は、Visio VBAにおける「ファイルが見つかりません」エラーを未然に防ぐためのパスバリデーションについて解説しました。

  • ファイル操作の直前には必ずFSOの `FileExists` で存在確認をする
  • エラーで強制終了させるのではなく、親切なメッセージを出して安全に終了(または継続)させる
  • 出力先フォルダの存在確認・自動作成まで気を配る

このパターンを一度あなたの型として覚えてしまえば、どんな業務自動化案件が来ても怖くありません。

「動くだけのコード」から、「現場で壊れない堅牢なコード」へ。
今回の知見をあなたの武器にして、ぜひ明日からの開発に役立ててくださいね。応援しています!

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