评估名称和其他工作表公式表达式

适用于:Excel 2013 | Office 2013 | Visual Studio

Excel 通过 C API 公开的最重要功能之一是能够将可合法输入工作表的任何字符串公式转换为值或值数组。 例如,这对于必须读取已定义名称内容的 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 保留的隐藏命名空间中查找名称。 可以使用 xlfSetName 函数创建和删除隐藏的 DLL 名称。 可以使用 xlfGetDef 函数获取任何已定义名称的定义,无论是隐藏的 DLL 名称还是工作表名称。

工作表名称的完整规范采用以下形式:

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

请注意,Excel 2007 引入了许多新的文件扩展名。 可以省略此 Excel 会话中打开的工作簿之间没有歧义的路径、工作簿名称和工作表名称。

下一个示例计算活动工作表的公式 COUNT(A1:IV65536) 并显示结果。 请注意,需要为范围地址添加前缀“!”,这与 XLM 宏工作表上的范围引用约定一致。 C API XLM 遵循以下约定:

  • =A1 对当前宏表中单元格 A1 的引用。 (未为 XL) 定义。

  • =!A1 对活动工作表上单元格 A1 的引用 (可以是工作表或宏工作表)

  • =Sheet1!A1 对指定工作表上的单元格 A1 的引用,在本例中为 Sheet1。

  • =[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 函数的注册 ID,然后使用 xlUDF 函数调用该函数。

注意

注册的名称可以直接传递给 xlUDF 函数。 这意味着,在调用 xlUDF 之前,可以避免评估名称以获取 ID。 但是,如果要多次调用函数,则使用注册 ID 调用它的速度会更快。

另请参阅