Microsoft VBA习惯用法(Visio)用于测试不存在的属性?

时间:2009-11-05 09:40:01

标签: vba properties visio idioms

我需要确保在Visio 2003上运行的宏不会在较低版本的Visio上引起问题:特别是因为我正在写一个在较低版本的Visio上不存在的属性。目前我正在这样做:

...

On Error GoTo NoComplexScriptFont:

Set cellObject = shapeObject.Cells("Char.ComplexScriptFont")

On Error GoTo ErrHandler

...

NoComplexScriptFont:

    Rem MSGBOX only for debug

    MsgBox "No Such Property"

    GoTo endsub



ErrHandler:

    Rem put in general error handling here

    GoTo endsub



endsub:

End Sub





...

哪个有效,但我认为它有点乱。我已经玩弄了使用'Application.version'(对于Visio 2003返回'11')的想法,但我想避免假设任何特定版本中可用的属性,只是测试属性本身。

在VBA中这样做的好习惯是什么?

由于

---下面有几个答案,我的首选解决方案就是这个:

If shapeObject.CellExists("Char.ComplexScriptFont", 0) Then

    msgbox "Property exists"

else

    msgbox "Property does not exist"

end if

2 个答案:

答案 0 :(得分:2)

我会使用包装函数来访问属性,这样就不会搞乱正常的错误处理,如下所示:

...
Set cellObject = GetCellObject(shapeObject)
If Not cellObject Is Nothing Then
   ' Do something with cellObject
End If
...

Private Function GetCellObject(ByVal shapeObject As Object) As Object
    On Error Resume Next
    Set GetCellObject = shapeObject.Cells("Char.ComplexScriptFont")
End Function

(注意:我上面只使用Object,因为我不知道cellObject等类型是什么)

我经常使用相同的技术,即使对于我知道确实存在的属性,但在某些情况下会引发错误。例如(Excel),如果我要按名称访问工作表(如果不存在这样的工作表会引发错误),那么我将有一个调用Worksheets(name)的包装函数,并返回一个{ {1}}对象或Worksheet

Nothing

这使得调用代码更加清晰,因为您只需测试返回值而不必担心错误处理。

答案 1 :(得分:0)

您可以使用shape对象的CellExists属性来查看特定单元格是否存在。你必须传入你似乎正在使用的localeSpecificCellName,然后传入一个整数fExistsLocally,它指定搜索单元格的范围;如果你指定0,那么如果单元格被继承,CellExists将返回true ...如果它是1,那么如果单元格被继承,则CellExists将返回false。