Экспорт данных из Visio Shapes с использованием VBA - PullRequest
0 голосов
/ 29 июня 2018

Я хочу смоделировать нечто похожее на (гипер) график в 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 Ответ

0 голосов
/ 29 июня 2018

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
...