Compatibilidad con versiones anteriores
Hace referencia a: Excel 2013 | Office 2013 | Visual Studio
En este tema se abordan problemas de compatibilidad con XLL en diferentes versiones de Microsoft Excel.
Definiciones de constantes útiles
Considere la posibilidad de incluir definiciones similares a estas en el código del proyecto XLL y reemplazar todas las instancias de números literales usados en este contexto. Esto aclarará el código específico de la versión y reducirá la probabilidad de errores relacionados con la versión en forma de números de apariencia inofensica.
#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
Obtención de la versión en ejecución
Debe detectar qué versión se ejecuta mediante Excel4(xlfGetWorkspace, &version, 1, &arg)
, donde arg
es un XLOPER numérico establecido en 2 y la versión es una cadena XLOPER que, a continuación, se puede convertir en un entero. Para Microsoft Excel 2013, es la 15.0. Debe hacer esto en la función xlAutoOpen o desde ella. A continuación, puede establecer una variable global que informe a todos los módulos del proyecto de qué versión de Excel se está ejecutando. A continuación, el código puede decidir si se llama a la API de C mediante Excel12 y XLOPER12s, o si se usa Excel4 mediante XLOPERs.
Puede llamar a XLCallVer para detectar la versión de la API de C, pero esto no indica cuál de las versiones anteriores a Excel 2007 que está ejecutando.
Creación de complementos que exportan interfaces duales
Considere una función XLL que toma una cadena y devuelve un valor que puede ser cualquiera de los tipos de datos de la hoja de cálculo. Puede exportar una función registrada como tipo "PD" y prototipo de la siguiente manera, donde la cadena se pasa como una cadena de bytes con recuento de longitud.
LPXLOPER WINAPI my_xll_fn(unsigned char *arg);
Aunque esto funciona perfectamente bien, hay varias razones por las que esta no es la interfaz ideal para el código a partir de Excel 2007:
- Está sujeto a las limitaciones de las cadenas de bytes de la API de C y no puede acceder a las cadenas Unicode largas admitidas a partir de Excel 2007.
- Aunque, a partir de Excel 2007, Excel puede pasar y aceptar XLOPERs, internamente los convierte en XLOPER12, por lo que hay una sobrecarga de conversión implícita a partir de Excel 2007 que no está allí cuando el código se ejecuta en versiones anteriores de Excel.
- Puede ser que esta función se pueda hacer segura para subprocesos, pero si la cadena de tipo se cambia a
PD$
, se produce un error en el registro a partir de Excel 2007.
Por estas razones, lo ideal es que, a partir de Excel 2007, exporte una función para los usuarios que se registró como QD%$
, suponiendo que el código sea seguro para subprocesos y tenga el prototipo siguiente.
LPXLOPER12 WINAPI my_xll_fn_v12(wchar_t *arg);
Otra razón por la que podría querer registrar una función diferente a partir de Excel 2007 es que permite que las funciones XLL tomen hasta 255 argumentos, en lugar del límite de 30 de versiones anteriores.
Afortunadamente, puede tener las ventajas de ambas mediante la exportación de ambas versiones desde el proyecto. A continuación, puede detectar la versión en ejecución de Excel y registrar condicionalmente la función más adecuada. Para obtener más información y una implementación de ejemplo, vea Desarrollo de complementos (XLL) en Excel 2007.
Este enfoque conduce a la posibilidad de que una hoja de cálculo que se ejecuta en Excel 2003 pueda mostrar resultados diferentes a los de la misma hoja que se ejecuta a partir de Excel 2007. Por ejemplo, Excel 2003 asignaría una cadena Unicode en una celda de hoja de cálculo de Excel 2003 a una cadena de bytes ASCII y la truncaría antes de pasarla a una función XLL. A partir de Excel 2007, Excel pasará una cadena Unicode sin convertir a una función XLL registrada de la manera correcta. Esto podría dar lugar a un resultado diferente. Debe tener en cuenta esta posibilidad y las consecuencias para los usuarios, no solo en la actualización. Por ejemplo, algunas funciones numéricas integradas se mejoraron entre Excel 2000 y Excel 2003.
Nuevas funciones Worksheet y Analysis Toolpak
Las funciones de Analysis Toolpak (ATP) forman parte de Excel a partir de Excel 2007. Anteriormente, un XLL solo podía llamar a una función de ATP mediante xlUDF. A partir de Excel 2007, se debe llamar a las funciones de ATP mediante las enumeraciones de funciones definidas en xlcall.h. El ejemplo de Llamada a funciones definidas por el usuario desde archivos DLL muestra los dos métodos diferentes.