【入門編】【上級者向け】VSDXファイルのバイナリ構造を考慮し、破損した図面からシェイプデータのみを抽出して新規図面に復元する – Visio VBA解析バイブル

スポンサーリンク

Visioが「開かない」絶望からの生還術:VSDXの深層からデータを救出する極意

エンジニアの皆さん、こんにちは。Visioのファイルが突然壊れて開かなくなった経験はありませんか? 「ファイルが破損しているため開けません」という残酷なダイアログを前に、数日分の作業が露と消える恐怖。

しかし、諦めるのはまだ早いです。実は`.vsdx`ファイルは、実体は単なる「XMLの集合体(ZIP形式)」です。VisioのUIを通さず、VBAで泥臭くデータを救い出す手法を、今日は伝授しましょう。

—

1. なぜ「開けない」のか? VSDXの構造を知る

VSDXファイルは、中身を解凍すると`visio/pages/`や`visio/masters/`といったXMLファイルが詰まっています。Visio本体がファイルを開けない原因の多くは、ファイル全体のXML整合性の欠如です。

しかし、特定のシェイプやマスターシェイプの情報は、無事な可能性が高い。今回は、壊れたファイルから「シェイプのプロパティ(シェイプデータ)」を強引に吸い出し、新しいキャンバスに再構成するアプローチをとります。

—

2. 開発の現場で使う「救出コード」

まずは、以下のコードを見てください。これは、破損したファイルから「最低限の図形情報」を吸い上げるための考え方をコード化したものです。

‘ 【注意】このコードは標準的なVBA環境で動作しますが、
‘ ファイルが完全に破壊されている場合は、別途ZIP解凍によるXML解析が必要です。
Sub RecoverShapeDataFromBrokenFile()
Dim vsoDoc As Document
Dim vsoPage As Page
Dim vsoShape As Shape
Dim newDoc As Document
Dim targetPath As String

targetPath = “C:\Recovery\BrokenFile.vsdx”

‘ 1. 通常のオープンを試みるが、エラー無視設定で強行する
On Error Resume Next
Set vsoDoc = Application.Documents.OpenEx(targetPath, visOpenMinimized + visOpenDontList)

If vsoDoc Is Nothing Then
MsgBox “完全に致命的な破損です。ZIPとして解凍する手法へ移行してください。”
Exit Sub
End If
On Error GoTo 0

‘ 2. 新規ドキュメントを作成し、データを退避させる
Set newDoc = Application.Documents.Add(“”)

‘ 3. ページ内の全シェイプを走査してデータを抽出
For Each vsoPage In vsoDoc.Pages
Debug.Print “ページ解析中: ” & vsoPage.Name
For Each vsoShape In vsoPage.Shapes
‘ シェイプデータ(カスタムプロパティ)がある場合のみ救出
If vsoShape.SectionExists(visSectionProp, False) Then
‘ ここで救出したデータを新規ドキュメントへコピーまたは書き出し
CopyShapeData vsoShape, newDoc.Pages(1)
End If
Next
Next

MsgBox “救出プロセス完了。”
End Sub

‘ シェイプデータを新規図面に移すユーティリティ
Sub CopyShapeData(sourceShape As Shape, targetPage As Page)
Dim newShape As Shape
‘ 新規図面に矩形を作成
Set newShape = targetPage.DrawRectangle(0, 0, 1, 1)

‘ テキストやプロパティを移植
newShape.Text = sourceShape.Text
‘ ※ここにCellオブジェクトを用いた詳細なデータ移植処理が入ります
End Sub

—

3. このコードが教えてくれる「本質」

このコードには、Visioエンジニアとして知っておくべき3つの鉄則が詰まっています。

  • `OpenEx`のオプション: `visOpenDontList`などを使うことで、Visioの描画エンジンを極力動かさずにファイルにアクセスします。負荷をかけないことが、破損ファイルを救うコツです。
  • `SectionExists`で生存確認: 壊れたファイルは、一部のプロパティセクションだけが生き残っていることがあります。闇雲に`Cells`を叩くとクラッシュするため、`SectionExists`で「そのデータは存在するのか?」を確認してから触るのが鉄則です。
  • オブジェクトの疎結合: 壊れたファイルから直接データを読み取る際は、図形そのもの(Shapeオブジェクト)を移動させようとせず、`Text`や`Cell`内の値という「文字列・数値」として抽出するのが、最も安全なデータ救出方法です。

—

4. 陥りやすい罠と対策

初学者が最もやりがちなミスは、「壊れたオブジェクトのプロパティをそのまま参照し続けること」です。

Visio VBAでは、参照が無効になったオブジェクト(Dead Reference)に触れると、VBA自体がクラッシュし、ExcelやVisioが強制終了します。

  • 対策: 常に`On Error Resume Next`を局所的に使い、失敗した場合はすぐにログを吐いて次のシェイプへスキップする、「しなやかな設計」を心がけてください。

—

最後に:エンジニアとしての心構え

今回紹介したような「破損からのリカバリ」は、Visioの仕様の裏側を理解している者にしかできません。マクロの記録ボタンを押すだけのエンジニアから一歩踏み出し、オブジェクトがメモリ上でどう生成され、どう破棄されるのか。そのライフサイクルを想像できるようになれば、あなたはもう中級者を超えた存在です。

Visio VBAは古い言語だと言われますが、図面という非構造化データを構造化し、制御する力は、現代のRPAや自動化現場でも最強の武器になります。

「壊れた」と嘆く前に、まずは中身を覗いてみる。その知的好奇心こそが、最強のエンジニアへの道筋ですよ。それでは、次回の記事でお会いしましょう。

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