我想对类似于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来实现这一点吗?
非常感谢您的帮助!
答案 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