図形にExcelなどの外部データをリンクするマクロ

まず、データソースを用意します。今回は下のようなシンプルなExcelシートを使います。

処理の流れは次の通りです。
1.DataRecordsets.Add でVisioドキュメントにデータソースを設定し、レコードセットを作る
2.基の図形をコピーして位置を整える
3.LinkToDataでレコードセットを図形に紐づける
4.2~3の処理をレコードの数だけ繰り返します。

ソースはこんな感じです。
Public Sub DataRecordset_Link_To_Shape() 'データソースの名前と保存場所 Dim folderPath As String: folderPath = _ CreateObject("WScript.Shell").specialfolders("Desktop") Dim fileName As String: fileName = "Book1.xlsx" 'データソースの設定 Dim CN As String, Cmd As String Dim vsoDataRecordset As Visio.DataRecordset CN = "Provider=Microsoft.ACE.OLEDB.12.0;" _ & "Data Source=" + folderPath + "\" + fileName _ & ";Extended Properties=Excel 12.0" 'SQL文を渡して、レコードセットをセットする Cmd = "SELECT * FROM [Sheet1$]" Set vsoDataRecordset = ActiveDocument.DataRecordsets.Add(CN, Cmd, 0) Dim RSID As Long: RSID = vsoDataRecordset.id 'IDの数からレコードの数を調べる’ Dim IDArray() As Long: IDArray = vsoDataRecordset.GetDataRowIDs("") Dim recordSetCount As Long: recordSetCount = UBound(IDArray) + 1 'コピー元になる図形をセット Dim originalShape As Visio.Shape Set originalShape = ActiveWindow.Selection(1) 'コピー元になる図形の座標と幅を変数に入れる Dim originX As Double: originX = originalShape.Cells("PinX") Dim originY As Double: originY = originalShape.Cells("PinY") Dim width As Double: width = originalShape.Cells("Width") 'コピーした図形を並べる際のX軸方向の間隔の倍率 Dim marginRate As Double: marginRate = 2 Dim counterIndex As Long For counterIndex = 1 To recordSetCount Dim copyShape As Visio.Shape Set copyShape = originalShape.Duplicate 'コピー元を複製 'コピーした図形をコピー元から右方向にずらす。幅x倍率x序数 copyShape.Cells("PinX") = originX + width * marginRate * counterIndex copyShape.Cells("PinY") = originY '図形とデータを関連付ける copyShape.LinkToData RSID, counterIndex, True Next End Sub
コードは以上です。
途中で、こんなコードが出てきますが、
Dim IDArray() As Long: IDArray = vsoDataRecordset.GetDataRowIDs("")
IDを配列に入れて、レコードの数を取得するためのものです。
RecordCountのようにレコード数を直接参照するプロパティが見つからず、MSDNに書いてある方法を参考にしました。
ところで、データリンクの機能を使う際は、図形データには注意が必要です。
データシートのShapeDataを見て下さい。プロパティが次のように命名されます。

レコードセットのフィールド名が”_VisDM_”を挟むようになっています。(上の方はステンシルに元々入っていたデータです) ”メーカー”と”ユーザー”に至ってはなんだかよくわかりませんん。
後で図形データを使った別の処理をするのであれば、図形データのプロパティ名はデータソースのフィールド名と一致させた方がいいです。プロパティーのラベル名(右側の列)からプロパティ名を再設定する処理をこの時点で入れた方がいいかもしれませんね。
最後に、データグラフィックについてです。
データグラフィックは図形データをラベルなどに表示する機能です。ここではメーカーやIPアドレスなどの部分がそうです。私が知る限り、データグラフィックはVBAでは制御できないようです。図形データを好みの形で表示させたい場合は、基になる図形にあらかじめデータグラフィックを設定しておく方がよいかもしれません。
あとがき
PC、プリンター、ネットワーク機器、監視カメラなどの管理にはこういったダイアグラムを作ることがあります。
その場合、データ(管理表)と図面を常に同期しておくことが大切ですが、かなり面倒な作業です。
Visionのデータリンク機能を賢く使えば飛躍的に作業が楽で正確になると思います。
図形(またはステンシル)の種類を指定する列を作り、行ごとに異なる図形を使用するという仕様にすれば、より実用的ですね。