Visio VBAの「死」を回避せよ:パスワード・ロック・例外を制する堅牢なファイルオープン戦略
業務自動化ツールを開発する際、最も初心者が陥りやすい罠。それは、「ファイルは常に正常に開ける」という性善説に基づいたコーディングだ。
Visioのオートメーションにおいて、パスワード保護されたファイルや他者によるロックは「異常」ではない。それは、マルチユーザー環境における「日常的な仕様」である。これをハンドリングできず、VBAの実行時エラーで処理を停止させるツールは、もはや「自動化ツール」ではなく「運用上の爆弾」だ。
本稿では、Visio VBAのオブジェクトモデルを掌握し、いかなる状況でもプロセスを止めることなく、適切にスキップ・ログ出力を行うためのアーキテクチャを伝授する。
—
1. なぜ「単純なOpen」ではダメなのか
通常、`Documents.Open` メソッドを叩けばファイルは開く。しかし、パスワード付きファイルに遭遇した瞬間、Visioはモーダルダイアログを表示してユーザーの入力を待つ。
ここが地獄の入り口だ。
バックグラウンドで走らせている自動化プロセスはそこで停止し、ユーザーはダイアログの存在に気づかないまま「ツールがフリーズした」と判断する。これがシステム運用における「サイレント・デス」である。
我々が目指すべきは、「エラーを予期し、制御可能な状態に変換する」設計だ。
—
2. 堅牢なファイルオープン・ロジックの極意
この問題を解決するには、`On Error GoTo` による事後的なエラー処理ではなく、ファイルのステータスを事前(あるいは最小限のスコープ)で評価する設計が求められる。
以下のプロダクションコードは、実務でそのまま利用可能な「高耐久性ファイルオープン関数」だ。
‘ —————————————————————————–
‘ 機能: 堅牢なVisioファイルオープン処理
‘ 戻り値: 開いたDocumentオブジェクト、失敗時はNothing
‘ —————————————————————————–
Public Function SafeOpenVisioFile(ByVal filePath As String) As Visio.Document
Dim targetDoc As Visio.Document
‘ エラーハンドリングの開始
On Error Resume Next
‘ パスワード保護やRead-Onlyロックを検知し、
‘ UIを抑制した状態でファイルを開く
Set targetDoc = Application.Documents.OpenEx(filePath, _
Visio.VisOpenSaveArgs.visOpenRO + _
Visio.VisOpenSaveArgs.visOpenDontList)
‘ エラーが発生したか確認
If Err.Number <> 0 Then
‘ ログ出力の重要性: どこで何が起きたかを明確にする
Debug.Print “Error ” & Err.Number & “: ” & Err.Description & ” | Path: ” & filePath
‘ 必要に応じてログファイルへ書き出す関数を呼ぶ
Call LogErrorToFile(“Unable to open: ” & filePath & ” | Reason: ” & Err.Description)
Set SafeOpenVisioFile = Nothing
Else
Set SafeOpenVisioFile = targetDoc
End If
On Error GoTo 0
End Function
設計のポイント:
- OpenExの活用: `Documents.Open` ではなく `OpenEx` を使用し、`visOpenRO` (Read Only) フラグを付与することで、不必要な書き込み権限の要求を回避する。
- visOpenDontList: 開いたファイルが「最近使ったファイル」に溜まるのを防ぐ。これは多数のファイルをバッチ処理する際にメモリ管理を安定させるための定石だ。
- 疎結合な設計: 関数化し、成功時はDocumentオブジェクトを返し、失敗時はNothingを返す。呼び出し元は「戻り値がNothingならスキップする」という極めてシンプルなロジックだけで制御できる。
—
3. 運用を止めるな:例外ハンドリングのベストプラクティス
多くのエンジニアが「すべてのエラーをキャッチして無視する」という愚を犯す。これはデバッグを不可能にする。
ログ管理の鉄則
1. エラーコードを記録する: `Err.Number` を記録せよ。パスワード保護なら `visErrDocumentPasswordProtected` に相当するエラーが返ってくる。
2. スタックトレースを意識する: どのドキュメントで止まったのか、ファイル名だけでなくフルパスを記録する。
3. ユーザーへの通知: 自動化ツールがバックグラウンドで動いているなら、エラー時は「処理スキップリスト」を生成し、最後にユーザーへCSVで提示するのがプロの流儀だ。
—
4. 最後に:エンジニアとしてのマインドセット
Visio VBAは古い言語だが、そのオブジェクトモデルは極めて緻密に設計されている。`Application` から `Document`、`Page`、`Shape` に至る階層構造を理解していれば、ファイルが読み取り専用であろうと、パスワードがかかっていようと、それは単なる「状態」に過ぎない。
「予期せぬエラー」は存在しない。「予期していない自分がいる」だけだ。
今回紹介した実装をテンプレートとしてプロジェクトに組み込むことで、あなたの自動化ツールは「たまに落ちる不安定なスクリプト」から「深夜のサーバーでも自律稼働する堅牢なシステム」へと進化するはずだ。
さあ、コードを書き換えろ。そして、エラーを恐れる時代を終わらせよう。
