Экспорт данных из Visio Shapes с использованием VBA

Я хочу смоделировать нечто похожее на (гипер) график в MS Visio 2016 Professional, а затем экспортировать данные фигур в csv для дальнейшей работы с ним.

Я пытаюсь создать сценарий VBA, который проходит через все фигуры на листе и записывает (вставленные вручную) данные из фигур в один файл CSV (и в будущем, возможно, различные файлы CSV в зависимости от типа фигуры).

Чтобы почувствовать VBA, я попытался начать со сценария, который подсчитывает все фигуры на листе, но мне это уже не удалось. Пожалуйста, учтите, что я впервые работаю с VBA:

Sub countShapes()
Dim shp As Shape
Dim count As Integer
count = 0
Debug.Print count

For Each shp In ActiveSheet.Shapes
count = count + 1
Debug.Print count
Next

End Sub

Это возвращает ошибку времени выполнения 424, объект не найден.

Что мне не хватает?

В качестве второго шага я хочу, чтобы скрипт проверял, что фигуры, которые имеют, например, одинаковое число в поле данных "id", идентичны и во всех других полях данных, и отображает ошибку, если нет (перед экспортом в файлы csv), Могу ли я понять это, используя VBA в Visio?

Большое спасибо за любую помощь!

1 ответ

Решение

ActiveSheet является свойством Excel. Я думаю, что вы ищете ActivePage, что эквивалентно Visio. Чтобы исправить вышеприведенный код, вы можете использовать это:

For Each shp In ActivePage.Shapes
    count = count + 1
    Debug.Print count
Next

Однако, если вы просто после подсчета формы для страницы, вы могли бы написать это вместо:

Debug.Print ActivePage.Shapes.Count

Могу ли я порекомендовать некоторые ссылки, которые также могут помочь:

В качестве альтернативного подхода вас также может заинтересовать встроенный инструмент отчетности Visio:

Что касается второй части вашего вопроса (проверьте поля данных), я предполагаю, что вы говорите о чтении данных формы. Если это так, вы сначала хотите проверить, существует ли строка с именем "ID", и, если это так, прочитайте это значение. Так что-то вроде этого может заставить вас идти:

Public Sub TestGetCellValues()
    GetShapesCellValues ActivePage, "Prop.ID"
End Sub

Public Sub GetShapesCellValues(targetPage As Visio.Page, targetCellName As String)
Dim shp As Visio.Shape
If Not targetPage Is Nothing Then
    For Each shp In targetPage.Shapes
        If shp.CellExistsU(targetCellName, 0) = True Then
            Debug.Print shp.NameID & "!" _
                & targetCellName & " = " _
                & shp.CellsU(targetCellName).ResultIU
        End If
    Next shp
End If
End Sub

... который может выводить что-то вроде этого (учитывая связанные формы):

Sheet.2!Prop.ID = 3
Другие вопросы по тегам