Partager via


Compatibilité descendante

S’applique à: Excel 2013 | Office 2013 | Visual Studio

Cette rubrique traite des problèmes de compatibilité XLL dans différentes versions de Microsoft Excel.

Définitions de constantes utiles

Envisagez d’inclure des définitions similaires à celles-ci dans le code de votre projet XLL et de remplacer toutes les instances de nombres littéraux utilisés dans ce contexte. Cela permet de clarifier le code spécifique à la version et de réduire la probabilité de bogues liés à la version sous la forme de nombres inoffensives.

#define MAX_XL11_ROWS            65536
#define MAX_XL11_COLS              256
#define MAX_XL12_ROWS          1048576
#define MAX_XL12_COLS            16384
#define MAX_XL11_UDF_ARGS           30
#define MAX_XL12_UDF_ARGS          255
#define MAX_XL4_STR_LEN           255u
#define MAX_XL12_STR_LEN        32767u

Obtention de la version en cours d’exécution

Vous devez détecter quelle version est en cours d’exécution à l’aide Excel4(xlfGetWorkspace, &version, 1, &arg)de , où arg est un XLOPER numérique défini sur 2 et version est une chaîne XLOPER qui peut ensuite être codée sur un entier. Par Microsoft Excel 2013, il s’agit de 15.0. Vous devez effectuer cette opération dans ou à partir de la fonction xlAutoOpen . Vous pouvez ensuite définir une variable globale qui informe tous les modules de votre projet de la version d’Excel en cours d’exécution. Votre code peut ensuite décider d’appeler l’API C à l’aide d’Excel12 et XLOPER12ou d’Excel4 à l’aide de XLOPER.

Vous pouvez appeler XLCallVer pour découvrir la version de l’API C, mais cela n’indique pas laquelle des versions antérieures à Excel 2007 que vous exécutez.

Création de compléments qui exportent des interfaces doubles

Prenons l’exemple d’une fonction XLL qui prend une chaîne et retourne une valeur qui peut être l’un des types de données de feuille de calcul. Vous pouvez exporter une fonction inscrite en tant que type « PD » et prototype comme suit, où la chaîne est passée en tant que chaîne d’octets comptée en longueur.

LPXLOPER WINAPI my_xll_fn(unsigned char *arg);

Bien que cela fonctionne parfaitement bien, il existe plusieurs raisons pour lesquelles il ne s’agit pas de l’interface idéale pour votre code à partir d’Excel 2007 :

  • Il est soumis aux limitations des chaînes d’octets de l’API C et ne peut pas accéder aux chaînes Unicode longues prises en charge à partir d’Excel 2007.
  • Bien que, à compter d’Excel 2007, Excel puisse passer et accepter des XLOPER, il les convertit en XLOPER12, de sorte qu’il y a une surcharge de conversion implicite à partir d’Excel 2007 qui n’est pas là lorsque le code s’exécute dans des versions antérieures d’Excel.
  • Il se peut que cette fonction puisse être rendue thread safe, mais si la chaîne de type est remplacée par PD$, l’inscription échoue avant Excel 2007.

Pour ces raisons, dans l’idéal, à partir d’Excel 2007, vous devez exporter une fonction pour vos utilisateurs qui a été inscrite en tant QD%$que , en supposant que votre code est thread safe et prototype comme suit.

LPXLOPER12 WINAPI my_xll_fn_v12(wchar_t *arg);

Une autre raison pour laquelle vous pouvez inscrire une autre fonction à partir d’Excel 2007 est qu’elle permet aux fonctions XLL de prendre jusqu’à 255 arguments, au lieu de la limite de 30 des versions antérieures.

Heureusement, vous pouvez bénéficier des avantages des deux en exportant les deux versions à partir de votre projet. Vous pouvez ensuite détecter la version d’Excel en cours d’exécution et inscrire de manière conditionnelle la fonction la plus appropriée. Pour plus d’informations et un exemple d’implémentation, voir Développement de compléments (XLL) dans Excel 2007.

Cette approche entraîne la possibilité qu’une feuille de calcul exécutée dans Excel 2003 affiche des résultats différents de ceux de la même feuille exécutée à partir d’Excel 2007. Par exemple, Excel 2003 mappe une chaîne Unicode dans une cellule de feuille de calcul Excel 2003 à une chaîne d’octets ASCII et la tronque avant de la passer à une fonction XLL. À compter d’Excel 2007, Excel transmet une chaîne Unicode non convertie à une fonction XLL inscrite de la bonne façon. Cela peut entraîner un résultat différent. Vous devez être conscient de cette possibilité et des conséquences pour vos utilisateurs, pas seulement dans la mise à niveau. Par exemple, certaines fonctions numériques intégrées ont été améliorées entre Excel 2000 et Excel 2003.

Nouvelles fonctions de feuille de calcul et fonctions d’utilitaire d’analyse

Les fonctions d’outil d’analyse (ATP) font partie d’Excel à partir d’Excel 2007. Auparavant, un XLL pouvait uniquement appeler une fonction ATP à l’aide de xlUDF. À compter d’Excel 2007, les fonctions ATP doivent être appelées à l’aide des énumérations de fonction définies dans xlcall.h. L’exemple dans Appel de fonctions définies par l’utilisateur à partir de DLL illustre les deux méthodes différentes.

Voir aussi