Avaliar nomes e outras expressões de fórmula de planilha
Aplica-se a: Excel 2013 | Office 2013 | Visual Studio
Um dos recursos mais importantes que o Excel expõe por meio da API C é a capacidade de converter qualquer fórmula de cadeia de caracteres que possa ser inserida legalmente em uma planilha em um valor ou matriz de valores. Isso é essencial para funções XLL e comandos que devem ler o conteúdo de nomes definidos, por exemplo. Essa capacidade é exposta por meio da função xlfEvaluate, conforme mostrado neste exemplo.
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;
}
Observe que quando você estiver avaliando um nome de planilha, por conta própria ou em uma fórmula, você deve prefixar o nome com '!', pelo menos. Caso contrário, o Excel tenta encontrar o nome em um namespace oculto reservado para DLLs. Você pode criar e excluir nomes de DLL ocultos usando a função xlfSetName. Você pode obter a definição de qualquer nome definido, seja um nome DLL oculto ou um nome de planilha, usando a função xlfGetDef .
A especificação completa de um nome de planilha usa o seguinte formulário:
='C:\example folder\[Book1.xls]Sheet1'!Name
Observe que o Excel 2007 introduziu uma série de novas extensões de arquivo. Você pode omitir o caminho, o nome da pasta de trabalho e o nome da planilha em que não há ambiguidade entre as pastas de trabalho abertas nesta sessão do Excel.
O próximo exemplo avalia a fórmula COUNT(A1:IV65536)
da planilha ativa e exibe o resultado. Observe a necessidade de prefixar o endereço de intervalo com '!', que é consistente com a convenção de referência de intervalo em planilhas de macro XLM. A XLM da API C segue esta convenção:
=A1
Uma referência à célula A1 na planilha de macro atual. (Não definido para XLLs).=!A1
Uma referência à célula A1 na planilha ativa (que pode ser uma planilha ou uma planilha de macro)=Sheet1!A1
Uma referência à célula A1 na planilha especificada, Sheet1 nesse caso.=[Book1.xls]Sheet1!A1
Uma referência à célula A1 na planilha especificada na pasta de trabalho especificada.
Em uma XLL, uma referência sem um ponto de exclamação principal (!) não pode ser convertida em um valor. Não tem significado porque não há uma planilha de macro atual. Observe que um sinal de igual líder (=) é opcional e é omitido no próximo exemplo.
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;
}
Você também pode usar a função xlfEvaluate para recuperar a ID de registro de uma função XLL de seu nome registrado, que pode ser usada para chamar essa função usando a função xlUDF.
Observação
O nome registrado pode ser passado diretamente para a função xlUDF . Isso significa que você pode evitar ter que avaliar o nome para obter a ID antes de chamar xlUDF. No entanto, se a função for chamada muitas vezes, chamá-la usando a ID de registro será mais rápida.