1

Я пытаюсь написать единый модуль кода, который будет работать с 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, что означало бы поддержание нескольких версий проекта?

ответ

1

После разработки/отладки в 2007 году или позже, это изменить:

Sub FillShape(oShp as Shape) 

к этому:

Sub FillShape(oShp as Object) 

Поскольку компилятор не знает, какие свойства у объекта есть или нет , он больше не будет лаять на вас. Конечно, вам нужно убедиться, что вы не пытаетесь нажать 2003 через любые обручи, которые он не понимает, или поймать ошибку, если вы это сделаете.