Я пытаюсь написать единый модуль кода, который будет работать с PowerPoint 2003 и всеми более новыми версиями относительно изменений цветовой модели, которые были введены с 2007 года (тема против схемы в объектной модели VBA), но эта проблема может возникнуть при любых изменениях объектной модели.Условный код VBA для совместимости объектной модели PowerPoint 2003 и 2007/2010/2013
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, что означало бы поддержание нескольких версий проекта?