Как программно (VBA) собрать данные со всех шейпов на странице?
Для сбора данных по всем шейпам на странице используется коллекция Shapes объекта Page. Ниже приведен пример макроса, который собирает свойства Part Number, Manufacturer и Cost в массив.
Public Sub ExportShapeData()
Dim pagObj As Visio.Page
Dim shpsObj As Visio.Shapes
Dim shpObj As Visio.Shape
Dim celObj As Visio.Cell
Dim OrderInfo() As String
Dim iShapeCount As Integer
Dim i As Integer
Set pagObj = ActivePage
Set shpsObj = pagObj.Shapes
iShapeCount = shpsObj.Count
ReDim OrderInfo(3, iShapeCount - 1)
For i = 1 To iShapeCount
Set shpObj = shpsObj(i)
OrderInfo(0, i - 1) = shpObj.Name
If shpObj.CellExists("Prop.Part_Number", visExistsLocally) Then
Set celObj = shpObj.Cells("Prop.Part_Number")
OrderInfo(1, i - 1) = celObj.ResultStr("")
End If
If shpObj.CellExists("Prop.Manufacturer", visExistsLocally) Then
Set celObj = shpObj.Cells("Prop.Manufacturer")
OrderInfo(2, i - 1) = celObj.ResultStr("")
End If
If shpObj.CellExists("Prop.Cost", visExistsLocally) Then
Set celObj = shpObj.Cells("Prop.Cost")
OrderInfo(3, i - 1) = celObj.ResultIU
End If
Set shpObj = Nothing
Next
End Sub
Как программно добраться до свойств шейпа (Properties)?
Если свойства не видны в Cells напрямую (например, в UML шейпах), они могут быть вложены в группу. В таком случае нужно обращаться к коллекции Shapes самого шейпа-группы.
Например, в шейпе Class атрибуты хранятся в шестом вложенном шейпе:
Sub GetAttributes()
' Показывает текст из вложенного шейпа Attributes
MsgBox ActivePage.Shapes(1).Shapes(6).Text
End Sub
Как отловить изменение геометрии шейпа?
Для отслеживания изменений геометрии используется событие EventXFMod. Вы можете задать формулу в ячейке шейп-листа:
Shape.Cells("EventXFMod").Formula = "RUNADDON(""ThisDocument.MyMacro"")"
Динамическое формирование списка выбора (Fixed List)
Для создания выпадающего списка на основе данных из БД нужно установить тип поля в Fixed List и программно заполнить ячейку Format строкой значений, разделенных точкой с запятой.
Shape.Cells("prop.MyList.Format").Formula = """Value1;Value2;Value3"""
Как сделать страницу активной программно?
appObj.ActiveWindow.Page = "Page-1"
Связь с базой данных Access через ADODB
Private Sub Document_ShapeAdded(ByVal Shape As IVShape)
Dim cnn As New ADODB.Connection
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\db1.mdb;"
Dim datPrimaryRS As New ADODB.Recordset
datPrimaryRS.Open "tabl1", cnn, adOpenKeyset, adLockOptimistic, adCmdTable
datPrimaryRS.MoveFirst
While Not datPrimaryRS.EOF
MsgBox datPrimaryRS!название & " " & datPrimaryRS!характеристика
datPrimaryRS.MoveNext
Wend
datPrimaryRS.Close
cnn.Close
End Sub