Как получить данные формы с VBA в Visio? - PullRequest
0 голосов
/ 23 октября 2018

Я искал решение своей проблемы в течение 4 часов, но не нашел ничего подходящего для меня.У меня есть квадрат и добавил переменную "test" со значением "hello":

Visio Shape

Теперь я хочу прочитать переменную "test" в VBA,Для этого я сначала должен увидеть, присутствует ли переменная:

Public Sub GetShapeData()
    Dim shpsObj As Visio.Shapes
    Dim shpObj As Visio.Shape

    Set shpsObj = ActivePage.Shapes
    Set shpObj = shpsObj(1)

    Debug.Print shpObj.CellExistsU("Prop.test", 0)
End Sub

Я всегда получаю 0 в качестве результата.Где проблема?

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Может быть, этот код может помочь

If shpObj.CellExistsU("Prop.test", 0) then Debug.Print shpObj.Cells("Prop.test").ResultStr("")
0 голосов
/ 24 октября 2018

Если ни CellExists, ни CellExistsU не вернут совпадение, это будет означать, что фигура, на которую вы указываете, не имеет строки данных формы с таким именем.Если это так, то вам может пригодиться перебрать все фигуры на странице и проверить, что в них содержится.Вот небольшой фрагмент кода, который поможет с этим:

Public Sub ReportPageShapes()
Dim vPag As Visio.Page
Set vPag = ActivePage

Dim shp As Visio.Shape
For Each shp In vPag.Shapes
    ReportShapeData shp, 0
Next

End Sub

Private Sub ReportShapeData(ByRef shp As Visio.Shape, indent As Integer)
Dim iPropSect As Integer
iPropSect = Visio.VisSectionIndices.visSectionProp

Debug.Print String(indent, Chr(9)) & shp.NameID & " (Index = " & shp.Index & ")"

If shp.SectionExists(iPropSect, Visio.VisExistsFlags.visExistsAnywhere) <> 0 Then
    Dim i As Integer
    For i = 0 To shp.Section(iPropSect).Count - 1 Step 1
        Dim vCell As Visio.Cell
        Set vCell = shp.CellsSRC(iPropSect, i, Visio.VisCellIndices.visCustPropsValue)
        'Could also report vCell.RowName here as well if required
        Debug.Print String(indent, Chr(9)) & Chr(9) & vCell.RowNameU, vCell.ResultStr("")
    Next i
End If

If shp.Shapes.Count > 0 Then
    Dim s As Visio.Shape
    For Each s In shp.Shapes
        ReportShapeData s, indent + 1
    Next
End If

If indent = 0 Then
    Debug.Print vbCrLf
End If

End Sub

Это циклически перебирает каждую фигуру на странице + все дочерние фигуры (так как они могут содержать данные формы), возвращая или вызывая один и тот же метод для каждогоребенок.

0 голосов
/ 23 октября 2018

Попробуйте использовать свойство use ResultStr

Debug.Print shpObj.CellExistsU("Prop.test").ResultStr("")
...