1

我正在嘗試編寫一個代碼模塊,該模塊將與PowerPoint 2003以及與2007年引入的顏色模型更改有關的所有較新版本主題與VBA對象模型中的方案),但是這個問題可能隨着任何對象模型的改變而增加。用於PowerPoint 2003和2007/2010/2013對象模型兼容性的條件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,或者如果你這樣做的話會陷入錯誤。