1

我需要确保适用于 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
4

2 回答 2

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)并返回一个Worksheet对象或Nothing

Private Function GetWorksheet(ByVal strName as String) As Worksheet
    On Error Resume Next
    Set GetWorksheet = Worksheets(strName)
End Function

这使得调用代码更加简洁,因为您可以简单地测试返回值而不用担心错误处理。

于 2009-11-05T14:38:24.847 回答
0

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

于 2009-11-06T13:57:09.417 回答