Общий способ определить, вызывает ли свойство свойство ошибку
Скажем, у вас есть один слайд с одной диаграммой и вы запускаете этот код (в версии 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