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

Другие вопросы по тегам