Общий способ определить, вызывает ли свойство свойство ошибку

Скажем, у вас есть один слайд с одной диаграммой и вы запускаете этот код (в версии Office более поздней, чем 2007):

Dim pptWorkbook As Object
Dim result As Object

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

Вы сгенерируете ошибку:

Ошибка приложения или объекта

Я полагаю, что это потому, что "Смарт-теги устарели в Office 2010". ( Источник). Вообще, чтобы избежать такого рода проблем из-за ошибки и выхода из 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, что обычно не рекомендуется ( пример, другой пример). Это стандартная практика в VBA?

Есть ли в VBA какой-либо другой способ определить, будет ли свойство объекта вызывать ошибку при вызове, ДО вызова этого свойства и без знания специфики этого вызываемого свойства?

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

Другие вопросы по тегам