【入門編】【中級者向け】Visioの保存処理で「読み取り専用」属性のファイルを検知し、別名保存を促すエラーハンドリング – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの「保存の壁」を突破せよ:読み取り専用ファイルをスマートに扱う極意

こんにちは。現場で「動けばいい」コードから「壊れない」システムへと脱皮を目指す皆さんへ。

Visioでの自動化において、最も頻繁に発生し、かつユーザーの作業を中断させるのが「ファイル保存時のエラー」です。特に共有フォルダ上のファイルを扱う際、誰かが開いていたり、属性が「読み取り専用」になっていたりすると、容赦なくランタイムエラーが発生します。

今日は、マクロの記録から一歩先へ進み、「読み取り専用属性を事前に検知し、ユーザーを別名保存へとスマートに導く」ためのプロフェッショナルな実装術を伝授します。

—

なぜ「エラーハンドリング」が重要なのか

多くの初心者は、`ActiveDocument.Save` をただ書くだけです。しかし、Visioのオブジェクトモデルにおいて、保存処理は非常に「デリケート」です。

  • 共有違反: 他のユーザーが同じファイルを開いている。
  • 属性制限: ファイルのプロパティが「読み取り専用」になっている。
  • パスの欠落: そもそも保存先が存在しない。

これらを無視して強制的に保存しようとすれば、Visioは無慈悲な警告ダイアログを出し、処理を停止させます。これをスマートに制御できるかどうかが、エンジニアの力量の分かれ道です。

—

現場で使える「堅牢な保存処理」の設計図

今回は、VBAの `GetAttr` 関数を使用して、保存前にファイルの属性をチェックする手法を解説します。

実装コード

このコードを標準モジュールに貼り付けて、`SaveDocumentSmartly` プロシージャを呼び出してください。

Option Explicit

”’

”’ 読み取り専用チェックを行い、安全に保存を試みるプロシージャ
”’

Public Sub SaveDocumentSmartly()
Dim doc As Visio.Document
Set doc = ActiveDocument

‘ 1. 新規作成直後で一度も保存されていない場合
If doc.Path = “” Then
doc.SaveAsEx “C:\Temp\NewDrawing.vsdx”, visSaveAsWS
Exit Sub
End If

‘ 2. 保存前に読み取り専用属性をチェック
‘ GetAttr関数はファイルの属性をビットフラグで返す
If (GetAttr(doc.FullName) And vbReadOnly) = vbReadOnly Then
MsgBox “このファイルは読み取り専用です。” & vbCrLf & _
“別名で保存するか、プロパティを確認してください。”, vbExclamation, “保存の中断”

‘ ここでSaveAsダイアログを強制的に表示させる(ユーザー体験の向上)
Application.DoCmd visCmdFileSaveAs
Else
‘ 3. 通常保存
On Error Resume Next ‘ 予期せぬIOエラーへの保険
doc.Save
If Err.Number <> 0 Then
MsgBox “保存に失敗しました:” & Err.Description, vbCritical
End If
On Error GoTo 0
End If
End Sub

—

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

1. `GetAttr` 関数の活用

ファイルシステムに直接触れる `GetAttr` は、Visioのオブジェクトモデルの外側にいる「OSのルール」を知るための重要なツールです。`vbReadOnly` 定数とビット演算(`And`)を組み合わせることで、ファイルを開く前に「書き込み可能か?」を判定しています。

2. `Application.DoCmd` の魔法

エラーで止めるのではなく、`visCmdFileSaveAs` を呼び出すことで、ユーザー自身に「どこに保存するか」を選択させるUIを提供しています。これが「自動化」と「ユーザーの操作性」を両立させるコツです。

3. `On Error Resume Next` の正しい使い方

エラーハンドリングにおいて、これを全体に書くのは悪手ですが、保存という「外部環境に依存する処理」の直前で、一時的にエラーを無視して制御フローを自力で判定するのは、プロフェッショナルの定石です。

—

次のステップ:PDF出力という「もう一つの壁」

保存処理をマスターしたら、次は「PDF出力」です。PDF出力もまた、保存先がロックされていると平気でエラーを吐きます。

‘ PDF出力のヒント
doc.ExportAsFixedFormat visFixedFormatPDF, “C:\Export\Output.pdf”

この処理の前にも、必ず「フォルダが存在するか」「既に同じ名前のPDFが開かれていないか」をチェックするロジックを挟むようにしましょう。

—

最後に:自動化は「優しさ」である

Visio VBAで最も大切なのは、コードの短さではありません。「実行するユーザーが、エラーに遭遇したときに途方に暮れないこと」です。

今回紹介した「読み取り専用チェック」は、小さな工夫ですが、これがあるだけでツール全体の安定感と信頼性は劇的に向上します。皆さんのVisio業務が、より快適で自動化されたものになることを心から願っています。

何か分からないことがあれば、いつでも質問してくださいね。一緒に最強の自動化を目指しましょう!

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