我需要确保在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
答案 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。