Условный код VBA для совместимости объектной модели PowerPoint 2003 и 2007/2010/2013
Я пытаюсь написать один модуль кода, который будет работать с PowerPoint 2003 и всеми более новыми версиями в связи с изменениями цветовой модели, которые были введены в 2007 году (тема по сравнению со схемой в объектной модели VBA), но эта проблема может возникнуть с любой объектной моделью изменения.
PowerPoint включает метод Application.Version, позволяющий проверить, какая версия PowerPoint используется во время выполнения, но не включает эквивалентную константу компилятора, которую можно использовать во время компиляции с помощью операторов #If... #Then.
В приведенном ниже примере вторая часть оператора If вызовет ошибку компилятора в PowerPoint 2003, поскольку метод ObjectThemeColor (и константа msoThemeColorDark1) не существует в этой версии объектной модели VBA:
Option Explicit
Public Enum PPTversion
PPT2003 = 11
PPT2007 = 12
PPT2010 = 14
PPT2013 = 15
End Enum
Sub FillShape(oShp as Shape)
If Int(Application.Version) = 11 Then
' Use the old colour model
oShp.Fill.ForeColor.SchemeColor = ppForeground
Else
' Use the new colour model
' causes a compiler error "Method or data member not found" when run in 2003
oShp.Fill.ForeColor.ObjectThemeColor = msoThemeColorDark1
End If
End Sub
Можно получить часть пути к решению, используя константу компилятора VBA7 (которая эффективно обнаруживает PowerPoint 2010 и более поздние версии), но это оставляет 2007 неучтенным:
Option Explicit
Public Enum PPTversion
PPT2003 = 11
PPT2007 = 12
PPT2010 = 14
PPT2013 = 15
End Enum
Sub FillShape(oShp as Shape)
If Int(Application.Version) = 11 Then
' Use the old colour model
oShp.Fill.ForeColor.SchemeColor = ppForeground
Else
' Use the new colour model
#If VBA7 Then
oShp.Fill.ForeColor.ObjectThemeColor = msoThemeColorDark1
#End If
End If
End Sub
Есть ли способ достичь того, что я пытаюсь сделать, без использования механизма #Const, который будет означать поддержку нескольких версий проекта?
1 ответ
После разработки / отладки в 2007 году или позже измените это:
Sub FillShape(oShp as Shape)
к этому:
Sub FillShape(oShp as Object)
Поскольку компилятор не знает, какие свойства имеет или не имеет Объект, он больше не будет лаять на вас. Конечно, вам нужно убедиться, что вы не пытаетесь протолкнуть 2003 через любые обручи, которые он не понимает, или перехватите ошибку, если вы это сделаете.