公式与公式 2

Range.Formula 和 Range.Formula2 是表示公式中逻辑的两种不同方式。 可以将其视为 Excel 公式语言的 2 种方言。

Excel 始终支持两种类型的公式计算:隐式交集计算 (“IIE”) 和数组计算 (“AE”) 。 在引入动态数组之前,IE 是单元格公式的默认值,而 AE 用于其他任何位置 (条件格式设置、数据验证、CSE 数组公式等) 。

这两种评估形式之间的主要区别在于,当将多单元格区域 (例如 A1:A10) 传递给需要单个值的函数时,它们的行为方式:

  • IIE 将选择与公式相同的行或列上的单元格。 此操作称为“隐式交集”。
  • AE 将使用多单元格区域中的每个单元格调用 函数,并返回结果数组。 此操作称为“提升”。

使用 Range.Formula 设置单元格的公式时,IIE 用于计算。

随着 Dyanamic Arrays (“DA”) 的引入,Excel 现在支持向网格返回多个值,而 AE 现在是默认值。 可以使用 Range.Formula2 设置/读取 AE 公式,它取代 Range.Formula。 但是,为了促进反向兼容性,仍支持 Range.Formula,并且将继续设置/返回 IIE 公式。 使用 Range.Formula 的公式集将触发隐式交集,并且永远不会溢出。 使用 Range.Formula 读取的公式将继续在发生隐式交集时保持无提示。

Range.Formula 有效地报告 Pre-DA Excel 中的编辑栏中显示的内容,而 Range.Formula2 则报告 DA Excel 中编辑栏报告的公式。

Excel 会自动在这两个公式变体之间进行转换,因此可以读取和设置它们。 为了便于使用 IIE) 的 Range.Formula (转换为 Range.Formula2 (AE) ,Excel 将使用新的隐式交集运算符 @指示可能出现隐式交集的位置。 同样,为了便于使用 AE) 将 Range.Formula2 (转换为使用 IIE) Excel 的 Range.Formula (将删除以无提示方式执行的 @ 运算符。 这两者之间通常没有区别。

从 Range.Formula 转换为 Range.Formula2

此示例显示设置 Range.Formula,然后检索 Range.Formula2 的结果

Dim cell As Range
Dim str As String

Set cell = Worksheets("Sheet1").Cells(2, 1)
ArrayOfFormulas = Array("=SQRT(A1)", "=SQRT(A1:A4)")

For i = LBound(ArrayOfFormulas) To UBound(ArrayOfFormulas)
 cell.Formula = ArrayOfFormulas(i)
 str = "Wrote Range.Formula:" & vbCr & cell.Formula & _
    vbCr & vbCr & _
    "Read Range.Formula2:" & vbCr & cell.Formula2
 MsgBox (str)
Next i
写入 Range.Formula 读取 Range.Formula2 注释
=SQRT (A1) =SQRT (A1) 相同,因为无法发生隐式交集
=SQRT (A1:A4) =SQRT (@A1:A4) SQRT 需要单个值,但提供多单元格区域。 这将在 IIE 中触发隐式交集,因此,如果转换为 AE 会调用使用 @ 运算符发生隐式交集的位置

从 Range.Formula2 转换为 Range.Formula

使用 Range.Formula2 Excel 的公式集使用 AE。 在文件保存时,DA Excel 会检查工作簿中的公式,以确定它们是否会在 AE 和 IIE 中计算相同的公式。 如果这样做,为了提高反向兼容性,Excel 可能会将其另存为 IIE,以减少 Excel 预 DA 版本看到的数组公式数。 可以使用 Range.SavedAsArray () 测试公式是否将公式另存为数组公式

Dim cell As Range
Dim str As String

Set cell = Worksheets("Sheet1").Cells(2, 1)
ArrayOfFormulas = Array("=SQRT(A1)", "=SQRT(@A1:A4)", "=SQRT(A1:A4)", "=SQRT(A1:A4)+SQRT(@A1:A4)")

For i = LBound(ArrayOfFormulas) To UBound(ArrayOfFormulas)
 cell.Formula2 = ArrayOfFormulas(i)
 str = "Wrote Range.Formula2:" & vbCr & cell.Formula2 & _
    vbCr & vbCr & _
    "Read Range.Formula:" & vbCr & cell.Formula & _
    vbCr & vbCr & _
    "Read Range.IsSavedAsArray:" & vbCr & cell.SavedAsArray
 MsgBox (str)
Next i
写入 Range.Formula2 读取 Range.Formula 读取 Range.SavedAsArray 注释
=SQRT (A1) =SQRT (A1) FALSE SQRT 需要单个值,A1 是单个值。 IIE 和 AE 之间没有差异。 另存为 IIE 并删除任何 @'s
=SQRT (@A1:A4) =SQRT (A1:A4) FALSE SQRT 需要单个值, @A1:A4 即单个值。 IIE 和 AE 之间没有差异。 另存为 IIE 并删除任何 @'s
=SQRT (A1:A4) =SQRT (A1:A4) TRUE SQRT 需要单个值,A1:A4 是多单元范围。 IIE 和 AE 可能因数组而异
=SQRT (A1:A4) + SQRT (@A1:A4) =SQRT (A1:A4) + SQRT (@A1:A4) TRUE 第一个 SQRT 需要单个值,A1:A4 是多单元范围。 IIE 和 AE 可能因数组而异

最佳做法

如果面向 Excel 的 DA 版本,则应优先使用 Range.Formula2 而不是 Range.Formula。

如果面向 Excel 的 Pre 和 Post DA 版本,则应继续使用 Range.Formula。 但是,如果想要严格控制用户编辑栏公式的外观,则应检测 是否为 。支持 Formula2,如果支持,请使用 。否则,Formula2 使用 。公式

注释

OfficeJS 不包括 Range.Formula2。 相反,Range.Formula 始终报告编辑栏中存在的内容。 作为一种能够让addins快速部署更新的较新语言,如果开发人员在 AE 到 IIE 之间遇到任何兼容性问题,建议他们更新其addins。

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。