Visio VBAの「鉄壁」を築く:パスワードとロックを華麗に捌く極限の例外処理
こんにちは。自動化の世界へようこそ。
マクロの記録ボタンを押して満足している段階は、もう卒業ですね。現場で実際にVisioを操っていると、必ずぶつかる壁があります。「パスワードがかかって開けない」「誰かが編集中で書き込み権限がない」。
これらはエラーではありません。「業務運用上の必然」です。
今日は、Visio VBAのオブジェクトモデルを深く理解し、どんな状況でもアプリケーションをクラッシュさせない「堅牢なドキュメントハンドリング」の極意を伝授します。ここをクリアすれば、あなたはもうただの「コードを書く人」ではなく「システムを制御するエンジニア」です。
—
1. Visioオブジェクトモデルの「階層」を理解する
VisioのVBAは、ドキュメントを開く際に以下の順序でオブジェクトを生成します。
1. Application: Visioそのもの。
2. Documents: 開いているドキュメントのコレクション。
3. Document: 個別のファイル。
ここで重要なのは、`Documents.Open` メソッドを実行した瞬間、Visioは「ファイルを開こう」と全力を尽くします。しかし、そこにパスワードや読み取り専用の壁があれば、Visioは容赦なく「実行時エラー」を投げてプログラムを停止させます。
私たちの仕事は、この「Visioの悲鳴(エラー)」を先回りして受け止め、静かにログに記録し、次の仕事へ向かわせることです。
—
2. 現場で使える「鉄壁のオープン処理」コード
以下のコードは、単にファイルを開くのではなく、エラーを制御下におくための「防御的プログラミング」のテンプレートです。
Sub OpenVisioDocumentSafely(strFilePath As String)
Dim vsoApp As Visio.Application
Dim vsoDoc As Visio.Document
Set vsoApp = Application
‘ エラーが発生しても停止させない(これが鉄則)
On Error Resume Next
‘ ドキュメントを開く
‘ 読み取り専用で開くフラグ(visOpenRO)を組み合わせるのがコツ
Set vsoDoc = vsoApp.Documents.OpenEx(strFilePath, visOpenRO)
‘ エラーを判定
If Err.Number <> 0 Then
‘ ここにログ出力処理を記述(テキストファイルやイミディエイトウィンドウ)
Debug.Print “【エラー検知】ファイルが開けません: ” & strFilePath
Debug.Print “エラー内容: ” & Err.Description
‘ 発生したエラーをクリアして運用を続行
Err.Clear
Exit Sub
End If
‘ — 以下、正常に開けた場合の処理 —
On Error GoTo 0 ‘ エラー制御を元に戻す
Debug.Print “成功: ” & vsoDoc.Name
‘ 処理が終わったら適切に閉じる(メモリリークを防ぐ)
vsoDoc.Close
End Sub
コードの重要ポイント解説
- `On Error Resume Next`: これを宣言した直後のコードでエラーが発生しても、VBAは止まらずに次の行へ進みます。これが「例外ハンドリング」の第一歩です。
- `visOpenRO`: `Open`メソッドの代わりに`OpenEx`を使い、読み取り専用(ReadOnly)を明示的に指定することで、他ユーザーの編集中による書き込みロックを防ぎます。
- `Err.Clear`: エラーを処理した後は、必ずクリアしてください。これを忘れると、後続の無関係な処理まで「エラーが発生している」と誤認されます。
—
3. なぜ「記録」と「スキップ」が重要なのか?
初心者のうちは、「エラーが出たらプログラムを直そう」と考えがちです。しかし、業務自動化の世界では「エラーは発生するもの」という前提で設計します。
- パスワード保護: 権限のないファイルに遭遇したとき、プログラムが止まるとその後の100個の処理がすべてストップします。
- 読み取り専用: 誰かが開いているファイルに対して「書き込み」を試みるとクラッシュしますが、「読み取り」なら共存可能です。
これらを「ログ」という形で記録しておけば、翌朝、あなたは「どのファイルが開けなかったのか」だけを確認して、個別に対処すればいいのです。これが「運用に耐えうる自動化」です。
—
4. 最後に:エンジニアとしての心構え
Visio VBAは、オブジェクトの生成・破棄にリソースを大きく消費します。
今回紹介したように、ドキュメントを `Set` して、終わったら `Close` する。このライフサイクルを意識するだけで、あなたのマクロは劇的に安定します。
「動けばいい」コードから「止まらない」コードへ。
この例外処理の技術をマスターしたあなたは、もう現場で頼られる自動化エンジニアの一員です。
次は、開いたドキュメント内の `Page` や `Shape` をトラバース(探索)して情報を抽出する方法を一緒に見ていきましょう。Visioの世界はまだまだ深いですから。
何か不明な点があれば、いつでも聞いてくださいね。一緒に最高峰の自動化を構築していきましょう。
