【问题标题】:Export data from Visio Shapes using VBA使用 VBA 从 Visio Shapes 导出数据
【发布时间】:2018-12-08 10:30:29
【问题描述】:

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

非常感谢您的帮助!

【问题讨论】:

    标签: vba export-to-csv visio


    【解决方案1】:

    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”值。现在我想打印保存为“类型”的字符串值。当我将 targetCellName 更改为 Prop.Type 时,它​​确实可以工作,但只打印“0”。我必须调用其他方法而不是 shp.CellsU(targetCellName).ResultIU 吗?
    • 您有一个名为“Prop.Type”的行,对吗?如果您查看 ShapeSheet,当前的公式和值是什么(您可以使用 F5 在公式和值视图之间切换)? (即你期望它是什么?)
    • 公式和值都显示“类型”。 Public Sub TestGetCellValues() printShapeCellValues ActivePage, "Prop.Type" End Sub Sub printShapeCellValues(targetPage As Visio.Page, targetCellName As String) Dim shp As Visio.Shape For Each shp In targetPage.Shapes If shp.CellExistsU(targetCellName, 0) = True Then Debug.Print shp.CellsU(targetCellName).ResultIU End If Next shp End Sub 如果我使用此代码,我希望它将形状行“Prop.Type”中的字符串值打印到控制台。但是我只得到 0。
    • 好的,我明白了。 Cell 有许多结果属性,您可以使用它们来获得您想要的结果。上面的一个是ResultIU,它是“内部单位”,但是对于一个字符串,您可以使用ResultStrU("") 查看此链接了解更多详细信息:msdn.microsoft.com/en-us/vba/visio-vba/articles/…
    • 非常感谢!我之前遇到了ResultStrU 方法,但由于我没有使用参数而无法使其工作。现在它按预期工作了!
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多