Visio VBAの深淵へ:レガシーな「Data1-3」を現代のシェイプデータへ昇華させる技術
こんにちは。Visioの自動化という荒野を駆け抜ける皆さん、今日も図面と格闘していますか?
Visioの歴史は長く、数十年前の図面が今も現場で「現役」であることは珍しくありません。特に悩ましいのが、昔のVisioで多用されていた「Data1」「Data2」「Data3」という謎の文字列セルです。
今日は、これらレガシーな遺産を紐解き、現代の標準である「シェイプデータ(旧カスタムプロパティ)」へ安全に移行する、アーキテクト級の作法を伝授します。マクロの記録から一歩踏み出し、Visioのオブジェクトモデルを掌握しましょう。
—
1. なぜ「Data1-3」は危険なのか?
古いVisio図面を開くと、ShapeSheet(シェイプシート)の「その他」セクションに`Prop.Data1`、`Prop.Data2`…と並んでいるのを見たことはありませんか?
これらはかつて、簡易的なデータベースとして使われていました。しかし、以下の理由から現代の運用には適していません。
- 可読性の欠如: 「Data1」という名前では、そこに何が入っているか人間には分かりません。
- 型の制約: 文字列としてしか扱えないため、数値計算や日付管理が困難です。
これらを現代的な「シェイプデータ」へと再定義し、構造化データとして生まれ変わらせるのが、我々エンジニアの仕事です。
—
2. Visioオブジェクトモデルの基本を押さえる
移行コードを書く前に、Visioの階層構造を脳内に叩き込んでください。
1. Application: Visioそのもの。
2. Document: ファイル単位。
3. Page: 図面のページ。
4. Shape: 図形そのもの。すべてのデータはここに宿ります。
特に重要なのは、Shapeは「セル」の集合体であるという点です。`Shape.Cells(“Prop.Data1”)` と記述することで、その図形の特定のセルに直接アクセスできることを覚えておきましょう。
—
3. レガシー移行のためのVBAコード
それでは、実用的な移行スクリプトを提示します。このコードは、古い「Data1」の内容を読み取り、新しい「資産管理番号」という名前のシェイプデータへ書き換えるものです。
Sub MigrateLegacyData()
Dim shp As Visio.Shape
Dim pg As Visio.Page
Dim legacyVal As String
‘ アクティブなページのすべてのシェイプを走査
For Each pg In ActiveDocument.Pages
For Each shp In pg.Shapes
‘ 1. Data1セルが存在するか確認 (エラー回避の鉄則)
If shp.CellExists(“Prop.Data1”, visExistsAnywhere) Then
‘ 2. レガシーデータの値を取得
legacyVal = shp.Cells(“Prop.Data1”).Formula
‘ 3. 新しいシェイプデータを追加(AddNamedRow)
‘ ※既に存在する場合はエラーになるため、本来はTry-Catch的な処理が必要
On Error Resume Next
shp.AddNamedRow visSectionProp, “AssetID”, visTagDefault
On Error GoTo 0
‘ 4. 値を転記
shp.Cells(“Prop.AssetID.Value”).Formula = legacyVal
‘ 5. レガシーセルを削除(慎重に!)
‘ shp.DeleteRow visSectionProp, shp.Cells(“Prop.Data1”).Row
Debug.Print “移行完了: ” & shp.Name & ” -> ” & legacyVal
End If
Next shp
Next pg
MsgBox “移行プロセスが完了しました!”
End Sub
コードのポイント解説
- `CellExists`: これを忘れると、Data1が存在しない図形に当たった瞬間にコードが停止します。「あるかどうかわからないもの」には必ずこのチェックを入れてください。
- `AddNamedRow`: シェイプデータをプログラムから追加する際の必須メソッドです。`visSectionProp`を指定することで、シェイプデータ領域に新しい行を追加できます。
- `On Error Resume Next`: 今回は簡略化のために入れていますが、実務では「既に列が存在する場合」のハンドリングをしっかり書くのがプロの流儀です。
—
4. 陥りやすい罠:その「更新」は正しいか?
初心者が陥りやすいミスが、「セルに値を書き込んだのに反映されない」という現象です。
Visioのセルには`Formula`(数式)と`Result`(結果)があります。
- `Formula`: “100” や “=SUM(A1,B1)” といった中身。
- `Result`: その結果として表示されている値。
文字列を書き込む際は `.Formula` に `”` (ダブルクォーテーション) で囲った文字列を渡す必要があります。`shp.Cells(“…”).Formula = “123”` と書くと、Visioは「123という数式」として解釈してくれます。
—
最後に:自動化は「図面の健康診断」から始まる
レガシーな図面を保守することは、単なる作業ではなく、図面という「資産」の健康診断です。Data1-3を整理し、意味のあるデータ構造に変えるだけで、後々の検索や集計のコストが劇的に下がります。
Visio VBAは、一度習得すれば魔法のような力を与えてくれます。まずは手元の小さな図面で、この移行スクリプトを試してみてください。
「ここをクリアすれば、Visio VBAの基本はバッチリですよ」。
また次回の技術講義でお会いしましょう。質問があればいつでもどうぞ。
