Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Hace referencia a: Excel 2013 | Office 2013 | Visual Studio
Llamar a funciones definidas por el usuario (UDF) desde una hoja de cálculo es tan sencillo como llamar a funciones integradas: escriba la función a través de una fórmula de celda. Sin embargo, desde la API de C, no hay códigos de función predefinidos que usar con las devoluciones de llamada. Para permitir llamar a UDF, la API de C exporta una función de solo XLL, la función xlUDF . El primer argumento de la función es el nombre de la función como una cadena y los argumentos posteriores son los que la UDF normalmente esperaría.
Puede obtener una lista de las funciones y comandos del complemento XLL registrados actualmente mediante la función xlfGetWorkspace con el argumento 44. Esto devuelve una matriz de tres columnas donde las columnas representan lo siguiente:
Ruta de acceso completa y nombre del XLL
El nombre de la UDF o el comando como exportado desde el XLL
Cadena de código de argumento y devolución
Nota:
Es posible que el nombre exportado desde XLL no sea el mismo que el nombre registrado por el que Excel conoce la UDF o el comando.
A partir de Excel 2007, las funciones Analysis Toolpak (ATP) están totalmente integradas y la API de C tiene sus propias enumeraciones para funciones como PRICE, xlfPrice. En versiones anteriores, tenía que usar xlUDF para llamar a estas funciones. Si el complemento necesita trabajar con Excel 2003 y Excel 2007 o versiones posteriores, y usa estas funciones, debe detectar la versión actual y llamar a la función de la manera adecuada.
Ejemplos
En el ejemplo siguiente se muestra la función xlUDF que se usa para llamar a la función PRICE de ATP cuando la versión en ejecución de Excel es 2003 o anterior. Para obtener información sobre la configuración de una variable de versión global, como gExcelVersion12plus en este ejemplo, vea Compatibilidad con versiones anteriores.
Nota:
En este ejemplo se usan las funciones de marco TempNum, TempStrConst para configurar los argumentos y Excel para llamar a la API de C.
LPXLOPER TempNum(double d);
LPXLOPER TempStrConst(const LPSTR lpstr);
int cdecl Excel(int xlfn, LPXLOPER pxResult, int count, ...);
double call_ATP_example(void)
{
XLOPER xPrice;
int xl_ret_val;
if(gExcelVersion12plus) // Starting in Excel 2007
{
xl_ret_val = Excel(xlfPrice, &xPrice, 7,
TempNum(39084.0), // settlement date 2-Jan-2007
TempNum(46706.0), // maturity date 15-Nov-2027
TempNum(0.04), // Coupon
TempNum(0.05), // Yield
TempNum(1.0), // redemption value: 100% of face
TempNum(1.0), // Annual coupons
TempNum(1.0)); // Rate basis Act/Act
}
else // Excel 2003-
{
xl_ret_val = Excel(xlUDF, &xPrice, 8,
TempStrConst("PRICE"),
TempNum(39084.0), // settlement date 2-Jan-2007
TempNum(46706.0), // maturity date 15-Nov-2027
TempNum(0.04), // Coupon
TempNum(0.05), // Yield
TempNum(1.0), // redepmtion value: 100% of face
TempNum(1.0), // Annual coupons
TempNum(1.0)); // Rate basis Act/Act
}
if(xl_ret_val != xlretSuccess || xPrice.xltype != xltypeNum)
{
// Even though PRICE is not expected to return a string, there
// is no harm in freeing the XLOPER to be safe
Excel(xlFree, 0, 1, &xPrice);
return -1.0; // an error value
}
return xPrice.val.num;
}
Cuando se llama a una función XLL que devuelve un valor modificando un argumento en su lugar, la función xlUDF sigue devuelve el valor a través de la dirección del resultado XLOPER/XLOPER12. En otras palabras, el resultado se devuelve como si a través de una instrucción return normal. El XLOPER/XLOPER12 que corresponde al argumento que se usa para el valor devuelto no está modificado. Por ejemplo, tenga en cuenta las dos UDF siguientes.
// Registered as "1E". Returns its argument incremented by 1.
void WINAPI UDF_1(double *pArg)
{
*pArg += 1.0;
}
// Registered as "QQ". Returns its argument unmodified
// unless it is a number, in which case it increments it
// by calling UDF_1.
LPXLOPER12 WINAPI UDF_2(LPXLOPER12 pxArg)
{
static XLOPER12 xRetVal; // Not thread-safe
XLOPER12 xFn;
xFn.xltype = xltypeStr;
xFn.val.str = L"\005UDF_1";
Excel12(xlUDF, &xRetVal, 2, &xFn, pxArg);
xRetVal.xltype |= xlbitXLFree;
return &xRetVal;
}
Cuando UDF_2 llama a UDF_1, el valor de pxArg no cambia después de la llamada a Excel12 y el valor devuelto por UDF_1 está contenido en xRetVal.
Al realizar un gran número de llamadas a una UDF de esta manera, puede evaluar primero el nombre de la función mediante la función xlfEvaluate. El número resultante, que es el mismo que el identificador de registro devuelto por la función xlfRegister , se puede pasar en lugar del nombre de la función como primer argumento a la función xlUDF . Esto permite a Excel buscar y llamar a la función más rápidamente que si tiene que buscar el nombre de la función cada vez.