使用VBA从Visio形状导出数据

使用VBA从Visio形状导出数据,vba,export-to-csv,visio,Vba,Export To Csv,Visio,我想在MS Visio 2016 Professional中模拟类似于超曲线图的东西,然后将形状的数据导出到csv以进一步使用它 我正在尝试制作一个VBA脚本,它遍历工作表上的所有形状,并将手动插入的数据从形状写入一个csv文件,将来可能会根据形状的类型写入不同的csv文件 为了对VBA有所了解,我试着从一个脚本开始,该脚本计算工作表上的所有形状,但我已经失败了。请考虑这是我第一次与VBA合作: Sub countShapes() Dim shp As Shape Dim count As In

我想在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实现这一点吗


非常感谢你的帮助

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

非常感谢您的回复!我查看了您提供的资源,它们似乎非常有用。我把它们保存起来以备将来参考。你能否进一步澄清答案的第二部分?我尝试了你的代码,它确实打印了我形状的所有ID值。现在我想打印保存为Type的字符串值。当我刚刚将targetCellName更改为Prop.Type时,它确实起作用,但只打印0。我必须调用另一个方法而不是shp.CellsUtargetCellName.ResultIU吗?您有一行名为Prop.Type,对吗?如果查看ShapeSheet,当前可以使用F5在公式和值视图之间切换的公式和值是什么?你期望它是什么?公式和数值显示类型。Public Sub TestGetCellValues printShapeCellValues ActivePage,Prop.键入End Sub-PrintShapeCellValuesStarGetPage作为Visio.Page,targetCellName作为字符串Dim shp作为Visio.Shape作为targetPage中每个shp的Visio.Shape。如果shp.CellExistsUtargetCellName,0=True然后Debug.Print shp.CellsUtargetCellName.ResultIU End如果下一个shp End Sub如果我使用此代码,我希望它将形状行Prop.Type中的字符串值打印到控制台。不管怎样,我只得到0。好的,我明白了。单元格有许多结果属性,您可以使用这些属性来获得所需的结果。上面的一个是ResultIU,它是“内部单位”,但是对于一个字符串,您可以使用ResultStrU查看此链接以了解更多详细信息:非常感谢!我之前遇到过ResultStrU方法,但由于没有使用参数,因此无法使其工作。现在它的工作如预期!