Excel XLL 开发中的已知问题

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

本主题介绍在 XLL 开发中可能会遇到的 Microsoft Excel 中的已知问题。

注销 XLL 命令和函数

当 XLL 注册函数或命令时,Excel 会为资源创建一个新名称,并将对 DLL 函数的引用与该名称相关联。 该名称取自 xlfRegister 函数的第四个参数 pxFunctionText。 此名称在用于管理工作表名称的普通对话框中隐藏。 若要取消注册函数或命令,必须使用 xlfSetName 函数删除名称,传递名称但不传递定义。 但是,bug 会阻止从函数向导列表中删除名称。

函数向导中的参数说明字符串截断

pxArgumentHelp1 参数和 xlfRegister 函数的所有后续参数都是与 XLL 函数的参数对应的可选字符串。 函数向导显示这些参数,以在参数构造对话框中提供帮助。 有时,Excel 在对话框中显示与最终参数对应的字符串时,会截断一两个字符。 可以通过添加额外的“空字符串”作为函数注册的最后一个“参数帮助”参数来避免这种情况。

二进制名称范围限制

只有在创建二进制名称时处于活动状态的工作表再次处于活动状态时,才能检索二进制名称及其数据。 由于工作表函数无法激活工作簿中的工作表 (只有命令可以) 执行此操作,因此二进制名称的应用非常有限。 例如,如果有一个仅从特定工作表调用的命令,则可以使用二进制名称来存储与命令相关的数据。

具有数组公式的 xlSet 和工作簿

在 Excel 2003 和更早版本中,如果尝试将值分配给非活动工作表(活动工作表上的等效区域包含数组公式)上的工作表区域, 则 xlSet 函数 将失败。 在这种情况下,Excel 将显示消息“无法更改数组的一部分”。此问题已在 Excel 2007 中修复。

数据表中允许循环引用

如果数据表所基于的计算引用了表本身中的某些内容,则 Excel 当前不会引发错误。 尽管这种情况不太可能发生,但创建或修改用于计算数据表值的公式时,应小心谨慎。

将整数XLOPER12转换为 XLOPER

由于整数类型 xltypeIntXLOPER12 数据类型中的 32 位有符号整数,但它只是 XLOPER 数据类型中的 16 位有符号整数,因此某些整数 XLOPER12 值可能不能包含在整数 XLOPER 中。 如果 Excel 在内部转换此类型,则通过将类型转换为浮点 xltypeNumXLOPER 来解决此问题。

Framework XLOper12ToXLOper 函数将此行为镜像为与 Excel 在内部保持一致。 调用此函数时,不应假定返回的 XLOPER 将始终为 xltypeInt;如果my_xloper类型为 xltypeNum,则读取 my_xloper.val.w 会提供一个 false 值。

通过就地修改参数返回 XLOPER 或XLOPER12

Excel 允许通过修改参数来注册返回 XLOPERXLOPER12 的函数。 但是,如果 XLOPER/ XLOPER12 参数指向内存,并且指针随后被 DLL 函数的返回值覆盖,则 Excel 可能会泄漏内存。 Excel 不显示错误,但最终可能会崩溃。 此外,如果 DLL 为返回值分配了内存,Excel 可能会尝试释放该内存,这可能会导致应用程序立即崩溃。 因此,不应修改 XLOPER/ XLOPER12 参数。 所有 XLOPERXLOPER12 参数都应被视为严格只读。

有关更多信息,请参阅 Excel 中的内存管理

另请参阅

XLOper12ToXLOper开发 Excel XLL
Excel XLL SDK API 函数引用
Excel 中的内存管理