【入門編】【全対象】Visioのバージョン差異を吸収し、古いVSD形式と新しいVSDX形式を判別して保存する – Visio VBA解析バイブル

スポンサーリンク

こんにちは! Visio VBAの迷宮へようこそ。
マクロの記録ボタンを押したはいいものの、生成されたコードのグニャグニャした記述に頭を抱えていませんか?「もっとスマートに、現場で使える堅牢なコードを書きたい!」――そう思っているあなたへ。

今回は、Visio VBAにおいて多くのエンジニアが一度はハマる「ファイル形式の罠(VSDとVSDXの壁)」を華麗に突破する極意を伝授します。

ここをクリアすれば、あなたも単なる「マクロ記録の使用者」から、環境差異をコントロールする「優秀な自動化エンジニア」への階段を一つ登ることができますよ。しっかりついてきてくださいね!

—

なぜ、Visioの「保存」は初心者泣かせなのか?

Visioの世界には、歴史的ないきさつから2つの主要なファイル形式が存在します。

1. VSD形式(Visio 2003〜2010までの古いバイナリ形式)
2. VSDX形式(Visio 2013以降のXMLベースのモダンな形式)

実務では、「昔のクライアントから送られてきた古い図面(.vsd)を改修し、最新の形式(.vsdx)で保存し直したい」「あるいは、現在の形式をそのまま維持して上書き保存したい」といった要望が日常茶飯事に発生します。

ここで素朴な疑問が浮かびますよね。
「現在開いているファイルが、古い形式なのか新しい形式なのか、どうやってプログラムで見分ければいいの?」

これを判定せずに `ActiveDocument.Save` なんて叩こうものなら、ファイル形式のミスマッチでエラーが起きたり、意図しない古い形式で保存されてしまったりと、現場は大パニックです。

—

救世主:`FileFormat` プロパティの正体

VisioのDocumentオブジェクトには、現在のファイル形式を教えてくれる `FileFormat` というプロパティが備わっています。

これを使うことで、Visioが裏側で持っている「ファイルの血統書」を読み取ることができます。主な定数は以下の通りです。

  • `visSaveAsVisio` (または `visOpenXMLDrawing` など、バージョンによって評価値が異なりますが、今回は安全に判定するロジックを組みます)

しかし、バージョン差異(Visio 2010以前と2013以降)を完全に吸収するためには、単に定数を比較するだけでなく、「今開いているファイルが新規作成(一度も保存されていない)なのか?」というライフサイクル上の考慮も必要になります。

—

【実践】バージョン差異を完全吸収するスマート保存関数

それでは、実際の現場でそのままコピペして使える、極上の汎用保存関数をプレゼントしましょう。

このコードは、現在のファイル形式を自動判別し、古い形式であれば警告を出しつつ適切な拡張子で保存、または新規ファイルならモダンな `.vsdx` として安全に保存する優れものです。

‘ ==============================================================================
‘ 処理名: SaveDocumentSmartly
‘ 概要 : Visioのバージョン差異とファイル形式を判定し、適切な形式で保存する
‘ 著者 : チーフアーキテクト
‘ ==============================================================================
Public Sub SaveDocumentSmartly()
Dim targetDoc As Visio.Document
Set targetDoc = ActiveDocument

‘ 1. ドキュメントが一度も保存されていない(新規作成)場合のハンドリング
If targetDoc.Path = “” Then
Dim defaultPath As String
‘ デスクトップにモダンなVSDX形式で保存する例
defaultPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\新しい図面.vsdx”

targetDoc.SaveAs defaultPath
MsgBox “新規ファイルのため、VSDX形式で保存しました:VSDX”, vbInformation, “保存完了”
Exit Sub
End If

‘ 2. 既存ファイルの形式判定と上書き保存
‘ FileFormatプロパティで現在の形式をチェック
Dim currentFormat As Long
currentFormat = targetDoc.FileFormat

On Error GoTo ErrorHandler

‘ 簡易的な判定ロジック(Visio 2013以降のXML形式かどうか)
‘ ※visOpenXMLDrawing = 2 (VSDX等)、古いバイナリは別の値になります
If currentFormat = visOpenXMLDrawing Or currentFormat = visOpenXMLTemplate Then
‘ すでに新しいVSDX形式なので、そのまま上書き保存
targetDoc.Save
MsgBox “既存のVSDX形式で上書き保存しました。”, vbInformation, “保存完了”
Else
‘ 古いVSD形式などの場合、現代のエンジニアとしてVSDXへのアップグレードを推奨・実行する
Dim confirmResult As VbMsgBoxResult
confirmResult = MsgBox(“このファイルは古い形式(.vsd等)です。” & vbCrLf & _
“最新の.vsdx形式に変換して保存しますか?” & vbCrLf & _
“(「いいえ」を選択すると、古い形式のまま上書きします)”, _
vbYesNo + vbQuestion, “形式変換の確認”)

If confirmResult = vbYes Then
‘ 拡張子を.vsdxに置き換えて保存
Dim newPath As String
newPath = Left(targetDoc.FullName, InStrRev(targetDoc.FullName, “.”) – 1) & “.vsdx”

‘ SaveAsで新しい形式を指定して保存
targetDoc.SaveAs newPath
MsgBox “VSDX形式への変換・保存が完了しました!”, vbInformation, “サクセス”
Else
‘ 古い形式のまま上書き
targetDoc.Save
MsgBox “古い形式のまま上書き保存しました。”, vbInformation, “保存完了”
End If
End If

Exit Sub

ErrorHandler:
MsgBox “保存中に予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “エラー”
End Sub

—

コードのポイントと「陥りやすい罠」の回避策

ここで、プロの視点からコードの重要なポイントを解説しておきます。

1. `targetDoc.Path = “” ` のチェックを怠るな

ファイルを開いてすぐ、一度も名前を付けて保存していない状態で `targetDoc.Save` を実行すると、Visioは「どこに保存していいかわからないよ!」とエラー(実行時エラー)を吐き出して強制終了します。
実務の自動化スクリプトでは、「パスが空(=新規)」のケースを最初に裁くのが鉄則です。

2. 文字列操作 (`InStrRev`) による拡張子のスマートな置換

古い `.vsd` から新しい `.vsdx` へパスを書き換える際、単に文字列をくっつけると `sample.vsd.vsdx` のような悲惨なファイル名が生まれます。
`InStrRev` 関数を使って「右側から最初のドット(`.`)」の位置を探し、そこから前をスパッと切り出すことで、安全に拡張子をすげ替えています。ここがエンジニアの腕の見せ所ですね。

3. エラーハンドリング (`On Error GoTo`) の実装

社内ネットワークの共有サーバーなどでファイルを保存する場合、権限エラーや「他のユーザーが編集中」といった理由で保存に失敗することが多々あります。
野良マクロのようにエラーで突然VBAの画面がピキーンと立ち上がるのを防ぐため、必ず `ErrorHandler` を用意してユーザーに優しいメッセージを返すようにしましょう。

—

ここをクリアすれば、Visio VBAの基本はバッチリですよ!

お疲れ様でした!
「ファイルを開く・保存する」という一見地味な動作の裏側には、ファイル形式の歴史、オブジェクトのライフサイクル、そして環境差異を吸収するプログラミングの知恵がギュッと詰まっています。

今回紹介した `FileFormat` の判定と、安全なパス操作のテクニックさえマスターしておけば、どんなに古い図面が舞い込んできても、あなたの組んだマクロは微動だにせず正確にタスクを完遂してくれるはずです。

日々の定型業務からあなたを解放する自動化の旅、これからも一緒に楽しんでいきましょう!

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