Visio で VBA コーディングを初めて使用する方はこちら
Visio 2010 Pro を使用しています
VBA を使用してシステム アーキテクチャ ダイアグラムの描画を自動化しようとしています。データ ソースは Excel シートです。うまくいけば、これが結果です...
私は Excel シートを読み取るために VBA を作成しました。また、インターネットの助けを借りて、ページ上に図形を作成することができます (皆さん、ありがとうございます!)。
私がたどろうとしていた道は次のとおりでした。
- 最初に各システムのオブジェクトをドロップします
- 自動接続を使用して、レコードセットをループし、システム間のリンク (統合を示す) を描画します。
- Excel データから、リンクは接続している図形の名前を認識します (そして、ページに図形をドロップするときに shape.name を割り当てます)。
シェイプ名を使用して一意のシェイプ オブジェクトを識別する方法がわかりません (自動接続メソッドのパラメーターとして使用できます)。
これを行うためのより良い方法または簡単な方法はありますか?
Autoconnect の例を見てきました ( http://msdn.microsoft.com/en-us/library/office/ms427221%28v=office.12%29.aspx ); 実行時に作成されたオブジェクトのハンドル (つまり、作成された各オブジェクトの変数。私の場合、それをどこにも保存していません。この情報を配列に保存し、同じものをループすることを考えました。オブジェクトを見つけるために。
これを行う最善の方法についていくつか考えてみたいと思います。私が Visio の初心者であることを考えると、いくつかのサンプル (動作する?) コードは非常に好評です。
私が特に整理したいコードは、「形状を接続する...」とコメントされています。
私が持っているもう1つの小さな問題。VBA を実行するたびに新しいステンシルが作成されるということです。これを行わずにマスターを選択するにはどうすればよいですか?
どうもありがとう!
私が達成しようとしていることについて、人々がどれだけの情報を得る必要があるか確信が持てなかったので、これまでに書いた/ハッキングした/盗用したコードを添付しました
Public Sub DrawSystem()
Dim strConnection As String
Dim strCommand As String
Dim vsoDataRecordset As Visio.DataRecordset
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& "User ID=Admin;" _
& "Data Source=" + "b:\visio\Objects2;" _
& "Mode=Read;" _
& "Extended Properties=""HDR=YES;IMEX=1;MaxScanRows=0;Excel 12.0;"";" _
& "Jet OLEDB:Engine Type=34;"
strCommand = "SELECT * FROM [Sheet1$]"
' load the data ...
Set vsoDataRecordset = ActiveDocument.DataRecordsets.Add(strConnection, strCommand, 0, "Objects")
'Stencil document that contains master
Dim stnObj As Visio.Document
'Master to drop
Dim mastObj As Visio.Master
'Pages collection of document
Dim pagsObj As Visio.Pages
'Page to work in
Dim pagObj, activePageObj As Visio.Page
'Instance of master on page
Dim shpObj As Visio.Shape
Dim shpFrom As Variant
Dim shpTo As Variant
Set stnObj = Documents.Add("Basic Shapes.vss")
' create a new page in the document
Set pagObj = ThisDocument.Pages.Add
pagObj.Name = "Page-" & Pages.Count
' -------------------------------------------------------
' LOOP THROUGH THE RECORDSET
' -------------------------------------------------------
Dim lngRowIDs() As Long
Dim lngRow As Long
Dim lngColumn As Long
Dim varRowData As Variant
' process the ENTITY records
Debug.Print "PROCESSING ENTITY RECORDS"
lngRowIDs = vsoDataRecordset.GetDataRowIDs("")
' draw rectangles for systems
Set mastObj = stnObj.Masters("Rectangle")
'Iterate through all the records in the recordset.
For lngRow = LBound(lngRowIDs) To UBound(lngRowIDs)
varRowData = vsoDataRecordset.GetRowData(lngRow)
If varRowData(2) = "ENTITY" Then
' draw a new object on the created page with the correct details
' TODO - work out how to programmatically draw them in an appropriate location
Set shpObj = pagObj.Drop(mastObj, lngRow / 2, lngRow / 2)
' set the appropriate attributes on the new object from the dataset
shpObj.Name = varRowData(3)
shpObj.Text = varRowData(7)
shpObj.data1 = varRowData(3)
shpObj.data2 = varRowData(7)
shpObj.Data3 = varRowData(8)
shpObj.Cells("Width") = 0.75
shpObj.Cells("Height") = 0.5
Debug.Print ("Created Object: " & varRowData(3) & " : ID = " & shpObj.ID)
Else
Debug.Print ("SKIPPED:" & varRowData(2) & " : " & varRowData(0))
End If
Next lngRow
' process the LINK records
Debug.Print "PROCESSING LINK RECORDS"
lngRowIDs = vsoDataRecordset.GetDataRowIDs("")
Set mastObj = stnObj.Masters("Dynamic Connector")
'Iterate through all the records in the recordset.
For lngRow = LBound(lngRowIDs) To UBound(lngRowIDs)
' only process LINK records
If varRowData(2) = "LINK" Then
Debug.Print ("Joining! " & varRowData(4) & " - " & varRowData(5) & " with " & varRowData(6))
Set shpObj = pagObj.Drop(mastObj, 2 + lngRow * 3, 0 + lngRow * 3)
varRowData = vsoDataRecordset.GetRowData(lngRow)
shpObj.Name = varRowData(6)
shpObj.Text = varRowData(7)
' connect the shapes ...
shpFrom = activePageObj.Shapes(varRowData(4))
shpTo = activePageObj.Shapes(varRowData(5))
shpFrom.AutoConnect shpTo, visAutoConnectDirNone
Else
Debug.Print ("LINK SKIPPED:" & varRowData(2) & " : " & varRowData(0))
End If
Next lngRow
サブ終了
テストに使用したデータ ファイルは次のとおりです (コピーして Excel に貼り付けます)。
1,,ENTITY,A,,,1,1: A,ONE
2,,ENTITY,B,,,2,2: B,TWO
3,,ENTITY,C,,,3,3: C,THREE
13,1,LINK,LINK1,A,B,13.1,13.1: LINK1,LINK1
13,2,LINK,LINK2,A,C,13.2,13.2: LINK2,LINK2
13,2,LINK,LINK2,C,B,13.2,13.2: LINK2,LINK2