Excel 工作表和表达式计算

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

Microsoft Excel 工作表单元格内容计算为以下四种基本数据类型之一:

  • Numbers
  • 布尔值 TRUEFALSE
  • Strings
  • Errors

包含这些类型的混合类型数组也可以作为函数的自变量输入到公式中,或者作为跨越多个单元格的值输入到数组公式中。

当用户(或命令宏)在单元格中输入内容时,Excel 会尝试解释输入内容,在无法解释的情况下将显示错误消息。 如果输入内容以字符串前缀(单引号)开头,Excel 会将所有输入字符按提供时的原样放入单元格中,不进行任何修改。 (不显示字符串前缀。) 如果输入以 =+-开头,Excel 会尝试将输入解释为公式。如果语法不正确或计算停止,则显示错误,并且单元格处于编辑模式。 否则,Excel 会尝试识别、转换和计算运算符和函数名称及其自变量。

在应用运算符之前,对操作数从左到右进行计算。 从最高优先级的运算符和最内层(嵌套最多)开始对函数进行计算。 如果不能将函数参数或多个操作数转换为预期的类型,计算会失败,并导致 #VALUE! 错误。 当系统不将令牌(它不是一个文字值)识别为函数或定义的名称或标签时,计算将失败,并会导致 #NAME? 错误。

如果输入不以任何这些内容开头,Excel 将根据输入的已知模式(如日期、时间、货币金额、百分比或数字)进行检查,并相应地进行解释。 这是特定于区域设置采取的处理方式。 如果这些解释没有任何意义,Excel 将回头考虑将输入视为字符串,并将它放在单元格中保持不变。

Excel 支持其他数据类型,最明显的是范围引用。 当计算不使用引用参数的运算符和函数的参数时,或当单元格公式中的表达式减少为一个引用时,Excel 将把引用转换为引用到单元格的值。

Excel 通过 XLM 函数 EVALUATE 及其 C API 等效的 xlfEvaluate,能够将任何有效的字符型字符串减少到四个基本的工作表数据类型之一。 除此之外,此函数提供评估 DLL 代码中的命名区域的简单方法。 此函数与前述显示错误消息或启用单元格编辑的行为不同,如果表达式计算失败,该函数返 #VALUE! 错误。

数字

Excel 中的所有工作表编号内部表示为 8 字节双精度浮点数,包括所有的整数。 但是,对 Excel 中的这些数字的实现并不完全遵从 IEEE,如下表所示。

类型 最大值 最小值
IEEE 8 字节双精度值
1.7976931348623157E+308
2.2250738585072014E-308
工作表(由函数返回的值或粘贴值)
1.7976931348623157E+308
2.22507385850721E-308
工作表(手动输入)
9.99999999999999E+307
2.22507385850721E-308

Excel 工作表不支持 IEEE 次正规数(即 2.2250738585072009E-308 到 4.9406564584124654E-324 范围内的数字),但 VBA 双精度类型则支持这类数字。

如果 DLL 函数返回 IEEE +/- 无穷大值或无效双精度值,则 Excel 会将其转换为 #NUM!。 所有次正规数和小于 Excel 最小正正规数的数字都将转换为正零。 IEEE 负零受支持,即可由 DLL 函数返回并显示为 -0。 (< 运算符不会检查负零,因此,如果 A1 包含负零,=A1<0 计算结果为 TRUE)。

请注意,某些数字格式和这些规定相比,限制更为严格,例如,日期和时间。 事实上,整数除法就是浮点数除法,并且在极端情况下可能会产生非整数结果,而精确结果应为整数。

长型 Unicode 字符串

用户在许多版本中看到的所有字符串现在都以 Unicode 字符串的形式存储在内部。Unicode 工作表字符串长度最多为 32,767 (215 - 1) 个字符,并且可以包含任何有效的 Unicode 字符。

当首次引入 C API 时,工作表字符串是字节字符串,长度限制为 255 个字符以内,并且 C API 可反映这些限制。 使用 Excel 2007,C API 将更新为处理 Excel 长 Unicode 字符串。这意味着以正确方式注册的 DLL 函数可以接受 Unicode 参数并返回 Unicode 字符串。

注意

为了实现向后兼容,C API 现在仍然完全支持字节字符串,但是这些字符串仍然具有同样的 255 字符限制。

返回错误

如果无法将函数或运算符参数转换为正确的类型,或者如果无法识别函数或已定义的名称,Excel 对单元格的计算会出错。 这两种方案前面都已介绍过。 如果内置工作表函数和运算符发生故障,它们也会导致出错,并告知用户故障的类型。 您应当让您的外接程序函数返回与在 Excel 中的行为一致的错误。

#NULL!

#NULL! 错误由一些 XLM 信息函数返回。 例如,当返回的错误中没有打印机安装结果时,调用带有参数 78 的 GET.DOCUMENT(78) 或等效的 C API 函数 xlfGetDocument。 该错误还可由某些函数返回(例如,在计算空字符串时)。

当其他任何错误看起来都不合适时,你可能希望从自己的加载项函数返回此错误。

#DIV/0!

如果分母的计算结果为零或是一个小到无法在 Excel 中表示为非零的数值时,Excel 除法运算符将返回 #DIV/0! 错误。 某些根据定义涉及到除法的函数还可能返回此错误。 例如,当没有任何输入可以转换为数字时,AVERAGE 将返回此错误。

仅当需要指示检测到除零情况时,才应考虑从加载项函数返回此错误。

#VALUE!

如果函数或运算符参数不能转换为所需的类型,Excel 将返回 #VALUE! 错误。 对于无法转换的函数参数,例如 =LN("X"),Excel 不会调用函数代码。 在编写和调试自己的外接程序函数时,务必牢记这一点。

如果参数不能在函数代码内转换,某些函数会返回此错误。 例如, DATEVALUE("30-Feb-2007") 失败并显示此错误,尽管参数的类型正确。 在这种情况下,该函数将返回其代码中的错误。 某些函数返回此错误,即使值类型和范围是允许的,例如 FIND("a","xyz") 返回此错误。

您应考虑从您的外接程序函数返回此错误,以指示参数类型有误、无法将参数转换为正确的类型或超出了范围的错误,虽然您也应该考虑返回数值参数超出范围的 #NUM!。 您还应考虑在区域或数组参数的形状或大小有误时返回此错误。

#REF!

当将表达式复制到生成的相对引用超出限制的位置时,Excel 在该表达式中生成 #REF! 错误。 例如,如果单元格 B2 包含公式 =A1,则将此公式复制到单元格 B1 会导致公式 =#REF!。 此错误也会生成一些公式,其中包含通过使用剪切和粘贴操作覆盖的引用,或是在行、列或工作表删除中删除的引用。 某些可返回引用的函数可以返回此错误, OFFSET(A1,-1,-1)例如 。 定义中包含变成无效引用的工作表名称也计入对此错误的评估。

如果您的外接程序函数采用引用参数,则应考虑如果引用无效或者如果您收到了引用错误,需返回此错误。 Memory Management in Excel中有关 XLOPER/XLOPER12s 的部分介绍了如何创建可接受并返回引用参数的函数。

#NAME?

�����ʽ�а���δ��ʶ��Ϊ������������Ƶ�����ʱ��Excel ���� #NAME? 如果您的外接程序函数尝试访问已定义的名称,但事实上却并未定义,则应考虑返回此错误。

#NUM!

当数字输入超过允许的范围时,Excel 中的许多内置数值函数和数学函数都会返回 #NUM! 错误, LN(0)例如 。 您应该考虑从您的外接程序函数中返回此错误,以指示数字输入无效或超出范围。

#N/A

通常返回 #N/A 错误,用来指示成功或有意义的结果是不可用的。 例如,如果找不到精确匹配项,包含第三个参数零的 MATCH 将返回此错误。 此外,还可以使用函数 NA 生成此错误,并使用函数 ISNA 专门对其进行检测。 因此,工作表中常用这种错误来指示特定于应用程序的条件范围。

另请参阅

Excel 编程概念

在 Excel 中使用 C API 进行编程

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

Excel XLL SDK API Function Reference