【実務・中級編】レガシー図面保守のためのData1/Data2/Data3セル活用と現行データプロパティへの移行 – Visio VBA解析バイブル

スポンサーリンク

レガシーVisioの深淵:Data1/2/3から「シェイプデータ」への脱却と近代化戦略

Visioの歴史は、そのまま「非構造化データとの戦いの歴史」です。かつて、シェイプの付帯情報を記録するために使われていた `Shape.Data1`, `Data2`, `Data3` プロパティ。これらはレガシー図面において「便利だが闇が深い」領域です。

今回は、この呪縛から図面を解放し、現代的な「シェイプデータ(旧:カスタムプロパティ)」へ安全に移行するための、プロフェッショナルな設計思想とコードを伝授します。

なぜ `Data1-3` は「技術的負債」なのか?

`Data1`〜`Data3` は、Visioオブジェクトモデルにおいて極めて原始的な文字列格納場所です。

  • 型定義がない: 数値なのか日付なのか、ただの文字列なのか判別不能。
  • 検索性が皆無: Visioの「データグラフィック」機能と連携できず、視覚化にコストがかかる。
  • 拡張性ゼロ: 3つしか枠がなく、ビジネス要件の変化に追従できない。

これらをそのまま残すことは、将来的に「データ抽出のために数千行の泥臭い解析コードを書く」という未来を予約することと同義です。今すぐ移行せよ。これがエンジニアとしての結論です。

設計の鉄則:破壊を恐れず、検証を怠るな

移行プロセスにおいては、以下の3ステップを厳守してください。

1. Read(抽出): 既存の `Data1-3` を安全に吸い上げる。
2. Validate(検証): 値が空でないか、意図した形式かを確認。
3. Write(構築): `AddCustomProperty` を用いて、堅牢なシェイプデータへ変換。

特に重要なのは「既存の値を消去する前に、全シェイプのスナップショットを外部ファイル(JSONやCSV)に保存すること」です。これがバックアップの唯一の正解です。

実装:Data1-3をシェイプデータへ移行する職人コード

以下のコードは、シェイプの `Data1` を「プロジェクト名」、`Data2` を「期限」、`Data3` を「担当者」というラベルのシェイプデータに変換する実戦用モジュールです。

Option Explicit

‘ ———————————————————
‘ 概要: Data1-3をシェイプデータ(Prop.xxx)へ移行する
‘ 設計方針: セルの存在確認を行い、例外を回避する堅牢な実装
‘ ———————————————————
Public Sub MigrateLegacyData()
Dim shp As Visio.Shape
Dim pg As Visio.Page

For Each pg In ActiveDocument.Pages
For Each shp In pg.Shapes
‘ グループ化シェイプやマスターシェイプの考慮が必要な場合はここでフィルタリング
If shp.Type <> Visio.visTypeGroup Then
Call ProcessShapeData(shp)
End If
Next shp
Next pg

MsgBox “移行完了:Data1-3の構造化が完了しました。”, vbInformation
End Sub

Private Sub ProcessShapeData(ByRef shp As Visio.Shape)
‘ 既存のData1-3を取得(空文字の場合は空とみなす)
Dim val1 As String: val1 = shp.Data1
Dim val2 As String: val2 = shp.Data2
Dim val3 As String: val3 = shp.Data3

‘ 既にシェイプデータが存在するか確認し、なければ追加する
‘ AddCustomPropertyは存在チェックが必要なため、ヘルパー関数を利用
If Len(val1) > 0 Then AddOrUpdateProperty shp, “ProjectName”, val1
If Len(val2) > 0 Then AddOrUpdateProperty shp, “DueDate”, val2
If Len(val3) > 0 Then AddOrUpdateProperty shp, “Owner”, val3

‘ 移行完了後、レガシーデータをクリア(慎重に!)
‘ shp.Data1 = “”: shp.Data2 = “”: shp.Data3 = “”
End Sub

Private Sub AddOrUpdateProperty(ByRef shp As Visio.Shape, propName As String, propValue As String)
Dim propCell As Visio.Cell
Dim sectionObj As Visio.Section

‘ シェイプデータセクションが存在するか確認
If Not shp.SectionExists(Visio.visSectionProp, Visio.visExistsAnywhere) Then
shp.AddSection Visio.visSectionProp
End If

‘ プロパティセルが存在しなければ追加
If Not shp.CellExists(“Prop.” & propName, Visio.visExistsAnywhere) Then
shp.AddRow Visio.visSectionProp, Visio.visRowProp, propName
End If

‘ 値を代入
shp.Cells(“Prop.” & propName).Formula = “””” & propValue & “”””
End Sub

プロフェッショナルな現場での注意点

1. トランザクションの意識:
大規模な図面の場合、`Application.BeginUndoScope` / `EndUndoScope` で囲むことを推奨します。これにより、移行が失敗した際にワンクリックで全てをロールバックできます。
2. データベース連携:
もし移行後のデータをExcelやSQL Serverと連携させるなら、`Prop.ID` のような一意なキーを持たせる設計にしてください。`Data1-3` はあくまで「属性」であり、キーにはなり得ません。
3. パフォーマンスの罠:
`For Each` で全シェイプを回すのは、1万個以上のシェイプがある場合、UIがフリーズするリスクがあります。適宜 `DoEvents` を挟み、進捗をステータスバーに出力する設計にしてください。

まとめ

`Data1-3` のようなレガシーなフィールドを放置することは、図面の寿命を縮める行為です。コードで自動化し、シェイプデータを「検索可能な資産」に変える。これこそが、Visioを単なる作図ソフトから、真のデータプラットフォームへと昇華させる唯一の道です。

さあ、あなたの図面に眠るレガシーを、今すぐ解放してください。

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