Visioport.ru

Visio автоматизируют макросами на VBA внутри документа или надстройками на .NET. Ниже собраны рабочие примеры: как пройти по всем фигурам страницы и собрать их данные, добраться до вложенных фигур, отследить изменение геометрии и заполнить список. Общий обзор подходов — в статье про программирование в Visio.

Как собрать данные со всех фигур страницы

Для обхода фигур используется коллекция 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

Как получить свойства вложенной фигуры

Если свойства не видны в Cells напрямую, например в фигурах UML, они могут находиться во вложенных фигурах группы. В таком случае нужно обращаться к коллекции Shapes самой группы.

Например, в фигуре Class атрибуты хранятся в шестой вложенной фигуре:

Sub GetAttributes()
  ' Показывает текст из вложенной фигуры Attributes
  MsgBox ActivePage.Shapes(1).Shapes(6).Text
End Sub

Как отследить изменение геометрии фигуры

Для отслеживания изменений геометрии используется ячейка события EventXFMod. Формулу можно задать в ячейке ShapeSheet вручную или из кода:

Shape.Cells("EventXFMod").Formula = "RUNADDON(""ThisDocument.MyMacro"")"

Как динамически заполнить список выбора

Чтобы создать выпадающий список на основе данных из базы, установите для свойства тип Fixed List и программно запишите в ячейку Format строку значений, разделённых точкой с запятой:

Shape.Cells("prop.MyList.Format").Formula = """Value1;Value2;Value3"""

Как сделать страницу активной из кода

appObj.ActiveWindow.Page = "Page-1"

Как связаться с базой Access через ADODB

В примере при добавлении фигуры на страницу открывается база Access и построчно выводятся значения из таблицы:

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

Другие разделы

Частые вопросы

На каком языке можно автоматизировать Visio?
Макросы внутри документа пишут на VBA, а внешние программы и надстройки — на .NET, например на C# или VB.NET. Оба подхода работают с одной объектной моделью Visio.
Что нужно сделать, чтобы начать писать макросы в Visio?
Включите вкладку «Разработчик» в настройках ленты и сохраняйте файл в формате с поддержкой макросов, VSDM. Редактор VBA открывается с этой вкладки.
Как обратиться к ячейке ShapeSheet из кода?
Через свойство Cells фигуры, например Shape.Cells("Prop.Cost"). Перед чтением лучше проверить, что ячейка есть, методом CellExists.
Как узнать имя нужной ячейки ShapeSheet?
Выделите фигуру и откройте окно ShapeSheet на вкладке «Разработчик»: имена ячеек видны в строках разделов. Для свойств фигуры имя ячейки начинается с «Prop.».