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業務が、より快適で自動化されたものになることを心から願っています。
何か分からないことがあれば、いつでも質問してくださいね。一緒に最強の自動化を目指しましょう!
