确定是否调用属性的一般方法会引发错误

时间:2016-03-21 19:20:20

标签: vba excel-vba powerpoint powerpoint-vba powerpoint-2013

假设您有一张带有一个图表的幻灯片,并且您运行此代码(在2007年之后的Office版本中):

Dim pptWorkbook As Object
Dim result As Object

Set pptWorkbook = ActivePresentation.slides(1).Shapes(1).Chart.ChartData.Workbook
Set result = pptWorkbook.ContentTypeProperties

您将生成错误:

  

应用程序定义或对象定义的错误

我认为这是因为"在Office 2010中不推荐使用智能标记。"(Source),一般来说,为了避免这类问题引发错误并退出您的VBA,您可以采取两种不同方法之一:

//Method 1
If OfficeVersion <= 2007
    Set result = pptWorkbook.ContentTypeProperties

//Method 2
On Error Resume Next // or GOTO error handler
Set result = pptWorkbook.ContentTypeProperties

方法一要求您知道属性导致错误的具体原因,在这种情况下这很容易,但对于其他属性可能不那么容易。方法二要求您使用某种形式的错误处理来处理错误事实之后,我对大多数其他Microsoft语言的理解通常是不鼓励的(exampleanother example)。这是VBA中的标准做法吗?

在VBA中,有没有其他方法可以确定对象的属性是否会在调用时抛出错误,在调用该属性之前,并且不知道该调用属性的细节?

1 个答案:

答案 0 :(得分:-1)

我喜欢为这种情况做的是创建一个单独的函数来检查属性是否存在并返回一个布尔值。在这种情况下,它看起来像这样:

Public Function CheckIfExists(targetObj As Object) As Boolean
Dim testObj As Object
On Error GoTo failedTest:
Set testObj = targetObj.ContentTypeProperties
CheckIfExists = True
Exit Function
failedTest:
CheckIfExists = False
End Function

如果该属性导致错误,则返回false,否则返回true -

然后将您的子修改为:

Public Sub FooSub()
Dim pptWorkbook As Object
Dim result As Object

Set pptWorkbook = ActivePresentation.slides(1).Shapes(1).Chart.ChartData.Workbook
If CheckIfExists(pptWorkbook) Then
    Set result = pptWorkbook.ContentTypeProperties
End If

...其余代码或适当的错误处理......

希望这有帮助, TheSilkCode