Évaluation des noms et d’autres expressions de formule dans les feuilles de calcul
S’applique à: Excel 2013 | Office 2013 | Visual Studio
L’une des fonctionnalités les plus importantes qu’Excel expose via l’API C est la possibilité de convertir toute formule de chaîne qui peut légalement être entrée dans une feuille de calcul en valeur ou tableau de valeurs. Cela est essentiel pour les fonctions et commandes XLL qui doivent lire le contenu des noms définis, par exemple. Cette capacité est exposée via la fonction xlfEvaluate, comme illustré dans cet exemple.
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;
}
Notez que lorsque vous évaluez le nom d’une feuille de calcul, seul ou dans une formule, vous devez au moins préfixer le nom avec « ! ». Sinon, Excel tente de trouver le nom dans un espace de noms masqué réservé aux DLL. Vous pouvez créer et supprimer des noms DLL masqués à l’aide de la fonction xlfSetName. Vous pouvez obtenir la définition de n’importe quel nom défini, qu’il s’agisse d’un nom DLL masqué ou d’un nom de feuille de calcul, à l’aide de la fonction xlfGetDef .
La spécification complète d’un nom de feuille de calcul se présente comme suit :
='C:\example folder\[Book1.xls]Sheet1'!Name
Notez qu’Excel 2007 a introduit un certain nombre de nouvelles extensions de fichier. Vous pouvez omettre le chemin d’accès, le nom du classeur et le nom de la feuille où il n’y a aucune ambiguïté entre les classeurs ouverts dans cette session Excel.
L’exemple suivant évalue la formule COUNT(A1:IV65536)
de la feuille de calcul active et affiche le résultat. Notez la nécessité de préfixer l’adresse de plage avec « ! », ce qui est cohérent avec la convention de référence de plage sur les feuilles macro XLM. L’API C XLM suit cette convention :
=A1
Référence à la cellule A1 de la feuille macro active. (Non défini pour les XLL).=!A1
Référence à la cellule A1 de la feuille active (qui peut être une feuille de calcul ou une feuille de macro)=Sheet1!A1
Référence à la cellule A1 de la feuille spécifiée, Feuil1 dans ce cas.=[Book1.xls]Sheet1!A1
Référence à la cellule A1 de la feuille spécifiée dans le classeur spécifié.
Dans un XLL, une référence sans point d’exclamation de début ( !) ne peut pas être convertie en valeur. Il n’a aucune signification, car il n’y a pas de feuille macro actuelle. Notez qu’un signe égal au début (=) est facultatif et est omis dans l’exemple suivant.
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;
}
Vous pouvez également utiliser la fonction xlfEvaluate pour récupérer l’ID d’inscription d’une fonction XLL à partir de son nom inscrit, qui peut ensuite être utilisé pour appeler cette fonction à l’aide de la fonction xlUDF.
Remarque
Le nom inscrit peut être transmis directement à la fonction xlUDF . Cela signifie que vous pouvez éviter d’avoir à évaluer le nom pour obtenir l’ID avant d’appeler xlUDF. Toutefois, si la fonction doit être appelée plusieurs fois, l’appeler à l’aide de l’ID d’inscription est plus rapide.