使用 VBA 从 Visio 形状导出数据



我想对类似于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

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

  • http://visualsignals.typepad.co.uk/vislog/2007/10/just-for-starte.html
  • http://visualsignals.typepad.co.uk/vislog/2007/11/looping-through.html
  • 适用于 Visio 的 VBA 编程

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

  • 创建形状数据报告(支持文档(
  • Visio 16 入门 - 从共享数据生成和应用报表(视频(

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

最新更新