Excel4/Excel12

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

从 DLL/XLL 或代码资源中调用内部 Microsoft Excel 工作表函数、宏工作表函数或命令,或仅限 XLL 的特殊函数或命令。

所有最新版本的 Excel 都支持 Excel4。 从 Excel 2007 开始,支持 Excel12

仅当 Excel 已将控件传递给 DLL 或 XLL 时,才能调用这些函数。 当 Excel 通过调用 Visual Basic for Applications (VBA) 间接传递控件时,也可以调用它们。 不能在任何其他时间调用它们。 例如,在调用 DllMain 函数期间或操作系统调用 DLL 的其他时间,或者从 DLL 创建的线程中调用它们。

Excel4v 和 Excel12v 函数接受其参数作为数组,而 Excel4Excel12 函数接受其参数作为堆栈上的可变长度列表。 在所有其他方面, Excel4 的行为与 Excel4v 相同, Excel12 的行为与 Excel12v 相同。

int Excel4(int iFunction, LPXLOPER pxRes, int iCount, LPXLOPER argument1, ...);
int Excel12(int iFunction, LPXLOPER12 pxRes, int iCount, LPXLOPER12 argument1, ...);

参数

iFunction (int)

一个数字,指示要调用的命令、函数或特殊函数。 有关有效 iFunction 值的列表,请参阅以下“备注”部分。

pxRes (LPXLOPERLPXLOPER12)

指向具有 Excel4) 的 XLOPER (的指针,或使用 Excel12) 保存计算函数结果的XLOPER12 (。

iCount (int)

将传递给函数的后续参数数。 在 2003 之前的 Excel 版本中,这可以是 0 到 30 的任何数字。 从 Excel 2007 开始,这可以是 0 到 255 的任何数字。

argument1, ... (LPXLOPERLPXLOPER12)

函数的可选参数。 所有参数必须是指向 XLOPERXLOPER12 值的指针。

返回值

返回以下整数 (int) 值之一。

返回代码 说明
0 xlretSuccess 已成功调用函数。 这并不意味着函数未返回 Excel 错误值;若要找出这一点,必须查看生成的 pxRes 参数的类型和值。
1 xlretAbort 命令或函数在内部中止) (异常终止。 如果 XLM 宏表通过调用 CLOSE 自行关闭,或者 Excel 内存不足,则可能会出现这种情况。 如果 Excel 返回此错误,则调用函数必须立即退出。 仅允许 DLL 在退出之前调用 xlFree 。 不允许对 C API 进行所有其他调用。 用户可以使用“文件”菜单上的“保存”命令以交互方式保存任何工作。
2 xlretInvXlfn 提供的函数编号无效。 如果使用 Xlcall.h 头文件中的常量,则不应发生这种情况,除非正在调用正在运行的 Excel 版本中不支持的内容。
4 xlretInvCount 输入的参数数无效。 在 Excel 2003 之前的版本中,任何函数可以采用的最大参数数为 30。 从 Excel 2007 开始,最大数目为 255。 有些参数需要固定或最小数量的参数。
8 xlretInvXloper 将无效 的 XLOPERXLOPER12 传递给函数,或者使用了错误类型的参数。
16 xlretStackOvfl 发生堆栈溢出。 使用 xlStack 监视堆栈上剩余的空间量。 尽可能避免在堆栈上分配非常大的本地 (自动) 数组和结构;使它们成为静态的。 (请注意,可能会在未检测到的情况下发生堆栈溢出。)
32 xlretFailed 命令等效函数失败。 这等效于显示宏错误警报对话框的宏命令。
64 xlretUncalced 尝试取消引用尚未计算的单元格,因为计划在当前单元格之后重新计算该单元格。 在这种情况下,DLL 应立即将控件返回到 Excel。 仅允许 DLL 在退出之前调用 xlFree 。 不允许对 C API 进行所有其他调用。 有关哪些函数可以访问和无法访问尚未重新计算的单元格的值的详细信息,请参阅 Excel 命令、函数和状态
128 xlretNotThreadSafe 在对工作簿进行多线程重新计算期间,尝试调用一个不是线程安全的函数,或者可能不是线程安全的函数。 从 Excel 2007 开始,将返回此值,并且仅在声明为线程安全的 XLL 工作表函数中返回此值。
256 xlRetInvAsynchronousContext 异步函数句柄无效。 此值仅由 Excel 2010 使用。
512 xlRetNotClusterSafe 群集不支持调用。 此值仅由 Excel 2010 使用。

备注

有效的 iFunction 值

有效的 iFunction 值是在 Xlcall.h 头文件或以下任何特殊函数中定义的任何 xlf... 或 xlc... 常量。

  • xlAbort
  • xlEnableXLMsgs
  • xlGetInst
  • xlSheetNm
  • xlCoerce
  • xlFree
  • xlGetName
  • xlStack
  • xlDefineBinaryName
  • xlGetBinaryName
  • xlSet
  • xlUDF
  • xlDisableXLMsgs
  • xlGetHwnd
  • xlSheetId

不同类型的函数

Excel4Excel12 区分三类函数。 函数根据 Excel 可能调用 DLL 的三种状态进行分类。

  • 类 1 在由于重新计算而从工作表中调用 DLL 时适用。
  • 类 2 在从函数宏内或从在类型文本中使用数字符号 (#) 注册 DLL 的工作表调用时适用。
  • 类 3 在从对象、宏、菜单、工具栏、快捷键、 ExecuteExcel4Macro 方法或 工具/宏/运行 命令调用 DLL 时适用。 有关详细信息,请参阅 Excel 命令、函数和状态

下表显示了每个类中有效的函数。

1 类 2 类 3 类
任何工作表函数
xlSet 之外的任何 XLL 纯 xl... 函数。 xlfCaller
任何工作表函数
xlSet 之外的任何 xl... 函数。
宏工作表函数(包括 xlfCaller)返回一个值,但不执行任何影响工作区或任何打开的工作簿的操作。
任何函数,包括 xlSet 和命令等效函数。

显示 Command-Equivalent 函数的对话框

如果命令等效函数具有关联的对话框,则可以在 iFunction 中设置 xlPrompt 位。 这意味着 Excel 在执行命令之前会显示相应的对话框。

编写国际 DLL

如果在 iFunction 中设置 xlIntl 位,函数或命令将执行,就像从国际宏工作表中调用它一样。 这意味着,即使它运行的是本地化) 版本的国际 (,该命令在 Excel 美国版上的行为也是如此。

xlretUncalced 或 xlretAbort

收到其中一个返回值后,DLL 必须立即清理并将控件返回到 Excel。 收到其中一个返回值后,将禁用通过 C API( xlFree 除外)对 Excel 的回调。

示例

以下示例使用 Excel12 函数选择从中调用它的单元格。

此代码示例是 Excel 2010 XLL SDK 中提供的更大示例的一部分,该示例位于安装 SDK 的以下位置:

\Samples\Example\Example.c.

注意

此函数 (xlcSelect) 调用命令宏,因此,仅当从 XLM 宏表调用该宏时才有效。

short WINAPI Excel12Example(void)
{
    XLOPER12 xRes;
    Excel12(xlfCaller, &xRes, 0);
    Excel12(xlcSelect, 0, 1, (LPXLOPER12)&xRes);
    Excel12(xlFree, 0, 1, (LPXLOPER12)&xRes);
    return 1;
}

另请参阅

Excel4v/Excel12v