1

J'essaye d'écrire un seul module de code qui fonctionnera avec PowerPoint 2003 et toutes les versions plus récentes en relation avec les changements de modèle de couleur qui ont été introduits avec 2007 (thème par rapport au schéma dans le modèle d'objet VBA) mais ce problème peut augmenter avec les modifications du modèle objet. PowerPoint inclut la méthode Application.Version pour vérifier quelle version de PowerPoint est utilisée au moment de l'exécution mais n'inclut pas de constante de compilateur équivalente pouvant être utilisée lors de la compilation avec les instructions #If ... #Then.Code VBA conditionnel pour la compatibilité des modèles d'objet PowerPoint 2003 et 2007/2010/2013

Dans l'exemple ci-dessous, la deuxième partie de la déclaration Si jetteront une erreur de compilation dans PowerPoint 2003 parce que la méthode ObjectThemeColor (et constante msoThemeColorDark1) n'existe pas dans cette version du modèle objet 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 

Il est possible d'obtenir une partie de la voie à une solution en utilisant la constante du compilateur VBA7 (qui détecte efficacement PowerPoint 2010 et ci-dessus), mais cela laisse 2007 portés disparus:

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 

y at-il un moyen d'atteindre ce J'essaie faire sans utiliser le mécanisme #Const ce qui signifierait maintenir plusieurs versions du projet?

Répondre

1

Après avoir développé/débogage en 2007 ou plus tard, changer ceci:

Sub FillShape(oShp as Shape) 

à ceci:

Sub FillShape(oShp as Object) 

Depuis le compilateur ne sait pas quelles sont les propriétés d'un objet a ou n'a pas , il ne vous abattra plus. Bien sûr, c'est à vous de vous assurer que vous n'essayez pas de pousser 2003 à travers des cerceaux, il ne comprend pas ou piège l'erreur si vous le faites.

Questions connexes