Compartir a través de


Evaluar los nombres y otras expresiones de fórmulas de la hoja de cálculo

Hace referencia a: Excel 2013 | Office 2013 | Visual Studio

Una de las características más importantes que Excel expone a través de la API de C es la capacidad de convertir cualquier fórmula de cadena que se pueda escribir legalmente en una hoja de cálculo en un valor o matriz de valores. Esto es esencial para las funciones XLL y los comandos que deben leer el contenido de los nombres definidos, por ejemplo. Esta capacidad se expone a través de la función xlfEvaluate, como se muestra en este ejemplo.

int WINAPI evaluate_name_example(void)
{
  wchar_t *expression = L"\016!MyDefinedName";
  XLOPER12 xNameText, xNameValue;
  xNameText.xltype = xltypeStr;
  xNameText.val.str = expression;
// Try to evaluate the name. Will fail with a #NAME? error
// if MyDefinedName is not defined in the active workbook.
  Excel12(xlfEvaluate, &xNameValue, 1, &xNameText);
// Attempt to convert the value to a string and display it in
// an alert dialog. This fails if xNameValue is an error value.
  Excel12(xlcAlert, 0, 1, &xNameValue);
// Must free xNameValue in case MyDefinedName evaluated to a string
  Excel12(xlFree, 0, 1, &xNameValue);
  return 1;
}

Tenga en cuenta que al evaluar un nombre de hoja de cálculo, ya sea por sí mismo o en una fórmula, debe anteponer el nombre a '!', al menos. De lo contrario, Excel intenta encontrar el nombre en un espacio de nombres oculto reservado para archivos DLL. Puede crear y eliminar nombres DLL ocultos mediante la función xlfSetName. Puede obtener la definición de cualquier nombre definido, ya sea un nombre DLL oculto o un nombre de hoja de cálculo, mediante la función xlfGetDef .

La especificación completa de un nombre de hoja de cálculo tiene el siguiente formato:

='C:\example folder\[Book1.xls]Sheet1'!Name

Tenga en cuenta que Excel 2007 introdujo una serie de nuevas extensiones de archivo. Puede omitir la ruta de acceso, el nombre del libro y el nombre de la hoja donde no hay ambigüedad entre los libros abiertos en esta sesión de Excel.

En el siguiente ejemplo se evalúa la fórmula COUNT(A1:IV65536) de la hoja de cálculo activa y se muestra el resultado. Tenga en cuenta la necesidad de prefijar la dirección del intervalo con '!', que es coherente con la convención de referencia de rango en las hojas de macros XLM. La API DE C XLM sigue esta convención:

  • =A1 Referencia a la celda A1 de la hoja de macros actual. (No definido para XLL).

  • =!A1 Referencia a la celda A1 de la hoja activa (que podría ser una hoja de cálculo o una hoja de macros)

  • =Sheet1!A1 Referencia a la celda A1 de la hoja especificada, Sheet1 en este caso.

  • =[Book1.xls]Sheet1!A1 Referencia a la celda A1 de la hoja especificada del libro especificado.

En un XLL, una referencia sin un signo de exclamación inicial (!) no se puede convertir en un valor. No tiene sentido porque no hay ninguna hoja de macros actual. Tenga en cuenta que un signo de igual a inicial (=) es opcional y se omite en el ejemplo siguiente.

int WINAPI evaluate_expression_example(void)
{
    wchar_t *expression = L"\022COUNT(!A1:IV65536)";
    XLOPER12 xExprText, xExprValue;
    xExprText.xltype = xltypeStr;
    xExprText.val.str = expression;
// Try to evaluate the formula.
    Excel12(xlfEvaluate, &xExprValue, 1, &xExprText);
// Attempt to convert the value to a string and display it in
// an alert dialog. Will fail if xExprValue is an error.
    Excel12(xlcAlert, 0, 1, &xExprValue);
// Not strictly necessary, as COUNT never returns a string
// but does no harm.
    Excel12(xlFree, 0, 1, &xExprValue);
    return 1;
}

También puede usar la función xlfEvaluate para recuperar el identificador de registro de una función XLL de su nombre registrado, que luego se puede usar para llamar a esa función mediante la función xlUDF.

Nota:

El nombre registrado se puede pasar directamente a la función xlUDF . Esto significa que puede evitar tener que evaluar el nombre para obtener el identificador antes de llamar a xlUDF. Sin embargo, si se va a llamar a la función muchas veces, llamarla mediante el identificador de registro es más rápida.

Vea también