【入門編】【中級者向け】既存図面のレイヤー設定を保持したまま別名保存する際の注意点とコード実装 – Visio VBA解析バイブル

スポンサーリンク

こんにちは。自動化の現場でVisioと格闘する皆さんに、今日もお疲れ様と言いたい。

「マクロの記録」ボタンを押して、生成されたコードの羅列を見て呆然とした経験はありませんか? あのコードはあくまで「操作の断片」であり、現場で戦うための「武器」ではありません。

特に「図面を別名保存する」という一見単純な処理。ここには、Visioのメモリ管理やオブジェクトのライフサイクルが凝縮されています。今回は、レイヤー設定を死守し、メタデータを壊さずに安全に別名保存するための極意を伝授しましょう。

—

1. なぜ「SaveAs」ではなく「SaveAsEx」なのか?

初心者の方は、とりあえず `ActiveDocument.SaveAs “path.vsdx”` と書きがちです。しかし、これが地雷の入り口です。

Visioの `SaveAs` メソッドは、現在の環境設定に依存します。例えば、ユーザーのVisio設定で「以前のバージョン形式で保存する」というチェックが入っていたら、意図せずファイル形式が変わってしまうかもしれません。

ここで登場するのが `SaveAsEx` です。
このメソッドは、「保存のオプション」を明示的に指定できます。レイヤー情報やメタデータといった「図面の魂」とも言える情報を保護するために、我々プロは常にこちらを使います。

—

2. レイヤーとメタデータを守るための鉄則

レイヤー設定が飛んでしまう原因の多くは、「保存時のフィルター設定」が適切でないこと、あるいは「Visioが保存処理を完了する前に次の操作へ移ってしまう」ことによる非同期的な干渉にあります。

以下のコードは、現場で私が実際に使っている「堅牢な別名保存」の実装テンプレートです。

実装コード:安全な別名保存の実装

Public Sub SafeSaveAs(targetPath As String)
Dim doc As Visio.Document
Set doc = ActiveDocument

‘ エラーハンドリングを実装し、不測の事態に備える
On Error GoTo ErrorHandler

‘ 保存オプションの定数設定
‘ visSaveAsListByCopy : 既存のファイルに影響を与えず、コピーを作成する
‘ visSaveAsWS : ワークスペース情報を保持
Dim saveOptions As Long
saveOptions = Visio.VisSaveAsOptions.visSaveAsListByCopy

‘ SaveAsEx実行
‘ 第2引数でファイル形式(VSDXなら 0 または指定なしでOK)を制御
doc.SaveAsEx targetPath, saveOptions

Debug.Print “保存成功: ” & targetPath
Exit Sub

ErrorHandler:
MsgBox “保存に失敗しました。詳細: ” & Err.Description, vbCritical
End Sub

—

3. このコードの「賢いポイント」

1. `visSaveAsListByCopy` の活用:
単なる `SaveAs` ではなく、コピーであることを明示します。これにより、元の図面ファイル(オリジナル)がメモリ上でロックされたままの状態を回避し、データの不整合を防ぎます。
2. 型指定の徹底:
`Visio.Document` 型を明示的に宣言しています。`Object` 型で済ませることも可能ですが、それだとVBAのインテリセンス(入力補完)が効かず、メソッドの打ち間違いという初歩的なミスを誘発します。
3. エラーハンドリング:
保存先が読み取り専用だったり、パスが間違っていたりすることは日常茶飯事です。`On Error GoTo` を入れないコードは、現場では「未完成」とみなされます。

—

4. さらに上を目指す君へ:PDF出力の罠

別名保存とセットで依頼されるのが「PDF出力」です。ここで多くの人が `ExportAsFixedFormat` を使いますが、注意してください。

「保存直後にPDF出力すると、PDFの中身が空っぽになることがある」

これはVisioが保存処理をバックグラウンドで継続している間に、PDF書き出し処理が走ってしまう「レースコンディション」という現象です。

これを防ぐには、保存処理の直後に `DoEvents` を挟むか、または保存処理が完了したことを確認するループを書くのがプロの流儀です。

‘ 保存処理後…
doc.SaveAsEx targetPath, saveOptions
DoEvents ‘ Visioに「一息ついて、OSと同期してくれ」と頼む魔法のコマンド

‘ その後にPDF出力へ
doc.ExportAsFixedFormat visFixedFormatPDF, “C:\out.pdf”

—

まとめ:自動化エンジニアの心構え

Visio VBAは、オブジェクト同士が複雑に絡み合う「生き物」のような存在です。
「動けばいい」コードを書くのは簡単です。しかし、「誰が使っても、どんな環境でも、レイヤーやメタデータという図面の命を壊さない」コードを書くことこそが、中級者から上級者への登竜門です。

今回紹介した `SaveAsEx` は、そのための最初のステップです。
まずは今のプロジェクトの保存処理を `SaveAsEx` に書き換えてみてください。それだけで、あなたの書くコードは一気に現場レベルの信頼性を獲得するはずです。

何かうまくいかないことがあれば、いつでも相談してください。共に、完璧な自動化の世界を目指しましょう。

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