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

 Смежные вопросы

  • Нет связанных вопросов^_^