使用VBA从Visio Shapes导出数据

时间:2018-06-29 09:08:08

标签: vba export-to-csv visio visio-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文件)。我可以在visio中使用vba来实现这一点吗?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

ActiveSheet是Excel属性。我认为您正在寻找ActivePage,它与Visio等价。因此,要在上面修复代码,可以使用以下代码:

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

但是,如果您只是在计算页面的形状,则可以这样写:

Debug.Print ActivePage.Shapes.Count

我可以推荐一些可能也有帮助的链接吗

作为一种替代方法,您可能还对Visio的内置报告工具感兴趣:

关于问题的第二部分(检查数据字段),我假设您正在谈论读取Shape Data。如果是这种情况,您首先要检查是否存在名为“ 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