使用 VBA 从 Visio Shapes 导出数据

Export data from Visio Shapes using VBA

我想在 MS Visio 2016 Professional 中模拟类似于(超)图的东西,然后将形状数据导出到 csv 以进一步使用它。

我正在尝试制作一个 VBA 脚本,它遍历 sheet 上的所有形状并将形状中的(手动插入的)数据写入一个 csv 文件(以及将来根据形状的类型,可能会有不同的 csv 文件)。

为了感受 VBA,我尝试从计算 sheet 上所有形状的脚本开始,但我已经失败了。请考虑这是我第一次使用 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

此 returns 运行时错误 424,未找到对象。

我错过了什么?

作为第二步,我希望脚本检查在数据字段 "id" 中具有相同编号的形状在所有其他数据字段中是否相同,如果不相同则显示错误(在导出到 csv 文件之前)。我可以在 visio 中使用 vba 实现吗?

非常感谢您的帮助!

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