Оценка имен и других выражений в формулах листов

Область применения: Excel 2013 | Office 2013 | Visual Studio

Одной из наиболее важных функций, предоставляемых Excel через API C, является возможность преобразования любой строковой формулы, которая может быть введена на листе, в значение или массив значений. Это важно для функций и команд XLL, которые должны считывать содержимое определенных имен, например. Эта возможность предоставляется с помощью функции xlfEvaluate, как показано в этом примере.

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;
}

Обратите внимание, что при вычислении имени листа либо отдельно, либо в формуле, имя должно быть префиксом "!", по крайней мере. В противном случае Excel пытается найти имя в скрытом пространстве имен, зарезервированном для библиотек DLL. Вы можете создавать и удалять скрытые имена DLL с помощью функции xlfSetName. Вы можете получить определение любого определенного имени, будь то скрытое имя DLL или имя листа, с помощью функции xlfGetDef .

Полная спецификация для имени листа имеет следующий вид:

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

Обратите внимание, что в Excel 2007 появился ряд новых расширений файлов. Вы можете опустить путь, имя книги и имя листа, где нет неоднозначности между открытыми книгами в этом сеансе Excel.

В следующем примере вычисляется формула COUNT(A1:IV65536) для активного листа и отображается результат. Обратите внимание на необходимость префикса адреса диапазона с помощью "!", что соответствует соглашению о ссылке на диапазон на листах макросов XLM. XLM-интерфейс C API соответствует следующему соглашению:

  • =A1 Ссылка на ячейку A1 на текущем листе макросов. (Не определено для XLLs).

  • =!A1 Ссылка на ячейку A1 на активном листе (который может быть листом или листом макросов).

  • =Sheet1!A1 Ссылка на ячейку A1 на указанном листе, в данном случае — Лист1.

  • =[Book1.xls]Sheet1!A1 Ссылка на ячейку A1 на указанном листе в указанной книге.

В XLL ссылка без начального восклицательного знака (!) не может быть преобразована в значение. Это не имеет смысла, так как нет текущего листа макросов. Обратите внимание, что первый знак равенства (=) является необязательным и опущен в следующем примере.

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;
}

Функцию xlfEvaluate можно также использовать для получения идентификатора регистрации функции XLL из ее зарегистрированного имени, которое затем можно использовать для вызова этой функции с помощью функции xlUDF.

Примечание.

Зарегистрированные имена можно передать непосредственно в функцию xlUDF . Это означает, что перед вызовом xlUDF можно избежать необходимости вычислять имя, чтобы получить идентификатор. Однако если функция вызывается много раз, вызов ее с помощью идентификатора регистрации выполняется быстрее.

См. также