要在 Mac 版 Excel 中合并大小可变的查找结果,请使用 REDUCE 和 VSTACK 构建一个矩形数组。本指南将创建一个美术资源列表,保留请求顺序,并显示未匹配的组,而不是悄悄将其省略。

任务很简单:每个请求的资源组可能匹配多行源数据、一行或零行。你希望将所有结果放在一个可扩展的工作表区域中,并让资源标签和数量保持在一起。

哪些 Mac 版 Excel 支持此方法?

下面的主要公式适用于 Mac 版 Microsoft 365 Excel。Microsoft 在其 REDUCE 函数文档中明确列出了此版本。其当前页面未列出 Mac 版 Excel 2024,因此,仅凭存在其他现代数组函数,无法确认整个公式都可用。

函数 Microsoft 相关文档中列出的 Mac 版本 在此处的作用
BYROW、MAP Mac 版 Microsoft 365;Mac 版 Excel 2024 说明原始方法及其适用范围
REDUCE Mac 版 Microsoft 365 在处理请求时保存不断增长的结果
VSTACK、HSTACK Mac 版 Microsoft 365;Mac 版 Excel 2024 合并结果块并构建备用行
FILTER Mac 版 Microsoft 365;Mac 版 Excel 2024;Mac 版 Excel 2021 返回所有匹配的资源行

这些版本信息来自 Microsoft 的 BYROW、MAP、VSTACK、HSTACK 和 FILTER 参考页面。

若要查看你的安装版本,请打开 Excel 菜单并选择 关于 Excel。Microsoft 的 Mac 版说明指出,Office 应用的“关于”对话框会显示版本和许可证类型。选择公式时,请同时检查这两项。请参阅关于 Office:我使用的是哪个版本的 Office?。

较新的 Mac Beta 预览改变了嵌套数组的适用范围

Microsoft 于 2026 年 9 月 24 日发布的公告将嵌套数组和 FLATTEN 作为 Beta 通道的预览功能推出。公告指定 Mac 版 16.114 Build 26092111 或更高版本,具体可用时间取决于推送安排。大多数嵌套数组计算要求工作簿兼容性版本为 3,可通过 公式 > 计算选项 选择。这些条件很重要:仅有 Microsoft 365 并不能证明预览功能已启用。请参阅在 Excel 中使用列表和数组在一个单元格中放入多个值。

下面的示例解决方案构建普通的矩形结果,不依赖该预览功能。这样也能避免工作簿的基本资源列表任务受嵌套数组设置影响。

为什么 BYROW 或 MAP 返回数组会造成问题?

Microsoft 将 BYROW 说明为每个输入行生成一个结果。其参考文档明确指出,内部 LAMBDA 返回单个值以外的任何内容都会产生 #CALC! 错误。返回多条记录的查找超出了文档所述的适用范围。请参阅 BYROW 函数。

例如,在下一节输入示例数据后,下面是一个诊断示例,展示了在文档所述的单值行为下会遇到的问题:

=BYROW(E2:E4,LAMBDA(key,FILTER(A2:C7,A2:A7=key,"No match")))

第一个请求会返回三行三列。让 BYROW 将这个数据块放入一个结果位置,会造成嵌套数组问题。在传统计算行为下,将外层函数改为 MAP 并不能提供通用的堆叠操作:内部结果仍然包含多个单元格。Microsoft 的 MAP 文档介绍了将输入值映射为新值,而其 #CALC! 错误指南说明了嵌套数组的限制。

用 VSTACK 包装失败的计算无法修复内部结果。有效的改动是在处理请求时追加每个查找数据块,这样每个中间结果本身就已经是一个矩形数组。

使用 REDUCE 和 VSTACK 构建完整的资源查找结果

1. 输入模拟源数据

从空白工作表开始。将下面这个制表符分隔的数据块粘贴到 A1。数量是美术资源的示例计数。

组	资源	数量
Mosaic	Tile Amber	2
Orbit	Ring Silver	3
Mosaic	Tile Blue	4
Prism	Panel Clear	5
Mosaic	Tile Coral	1
Prism	Panel Frost	2

将以下请求列表粘贴到 E1。保留所示顺序,以便对照预期结果。

请求的组
Mosaic
Orbit
Pebble

此示例特意包含三种结果:Mosaic 匹配三条记录,Orbit 匹配一条,Pebble 没有匹配项。由于未请求 Prism 组,因此其记录应保留在输出之外。

2. 单独检查一次查找

在未使用的区域输入此公式,例如 L1:

=FILTER($A$2:$C$7,$A$2:$A$7=$E$2,"No match")

它应返回三条 Mosaic 记录。FILTER 使用组比较,从源数据中选出完整的行。其包含数组的高度或宽度必须兼容;此处源数据和条件都覆盖行 2:7。请参阅 FILTER 函数。

这个小检查能将查找与堆叠逻辑分开。如果这些行不正确,请先修正源标签或引用,再添加外层计算。

3. 输入完整的堆叠公式

在 G:I 列留出空间,然后在 G1 中输入此公式:

=REDUCE(
  $A$1:$C$1,
  $E$2:$E$4,
  LAMBDA(acc,key,
    VSTACK(
      acc,
      FILTER(
        $A$2:$C$7,
        $A$2:$A$7=key,
        HSTACK(key,"No match","")
      )
    )
  )
)

按 Return。只需在输出区域左上角的单元格中输入一次公式;Excel 会自动调整溢出区域的大小。请勿将公式放在 Excel 表格内,因为表格中不支持溢出数组公式。Microsoft 在动态数组公式和溢出数组行为中说明了这两种行为。

4. 对照预期结果

对于提供的数据,输出将占据 G1:I6:

组 资源 数量
Mosaic Tile Amber 2
Mosaic Tile Blue 4
Mosaic Tile Coral 1
Orbit Ring Silver 3
Pebble 无匹配项

预期的行数和列数可直接从示例得出:一行标题、三行 Mosaic、一行 Orbit,以及一行未匹配请求。四条匹配记录的数量总计为 10。Pebble 旁边的数量为空,可将查找无结果与资源数量为零区分开来。

公式如何组装结果

REDUCE 以 A1:C1 作为累加器的初始值。对于 E2:E4 中的每个值,key 保存当前请求的组,acc 保存目前组装的结果。Microsoft 在 REDUCE 函数中说明了这种初始值、累加器和当前值的模式。

在此公式中,FILTER 创建下一个匹配的数据块,VSTACK 则将其追加到 acc 下方。将实际标题作为初始值,可立即得到三列结果,并避免引入一个无用的空白起始行。VSTACK 按顺序纵向追加数组,详见 VSTACK 函数。

如果没有匹配项,FILTER 的第三个参数会提供 HSTACK(key,"No match","")。这样会生成一个三列的备用行:请求的组、说明标签和空白数量。Microsoft 在 FILTER 函数中说明了无结果时的参数,在 HSTACK 函数中说明了横向合并。

保持备用行有三列很重要。Microsoft 文档指出,如果输入数组的宽度不同,VSTACK 会用 #N/A 填充缺少的列。因此,单单元格备用结果会在其旁边留下多余的填充值。请参阅 VSTACK 函数。

扩展工作表前,先确定输出行为

此公式实现了一种特定策略:按顺序处理每项请求,保留所有匹配的源数据行,并为未匹配的组显示一条标记行。因此,如果请求列表中重复某个组,其匹配数据块也会重复。如果源数据记录重复,该记录也会保留;此公式不包含删除重复项的步骤。

调整示例时,请使用此决策指南:

所需结果 合适的方法 条件
为每个组统计一个数量 MAP 和 COUNTIF 每项请求产生一个值
按请求顺序列出所有资源记录 上面的完整 REDUCE 公式 需要文档中列出的 Mac 版 Microsoft 365 函数
查找少量明确列出的数据块 对多个 FILTER 调用直接使用 VSTACK 每项请求都添加一个公式参数
在单元格中保留嵌套数组 Microsoft 的嵌套数组预览功能 需要文档中列出的 Beta 版本可用性和工作簿设置

若要快速检查计数,请在 K6 中输入以下完整公式,并确保其下方有三个可用单元格:

=MAP($E$2:$E$4,LAMBDA(key,COUNTIF($A$2:$A$7,key)))

预期计数分别为 3、1 和 0。由于每项请求都会产生一个数字,因此 MAP 适用于此情况。COUNTIF 会统计符合条件的单元格;此示例使用简单的模拟标签。请参阅 MAP 函数和在 Microsoft Excel 中使用 COUNTIF 函数。

Mac 版 Excel 2024 的固定请求替代方法

如果你的版本提供 FILTER、HSTACK 和 VSTACK,但不提供 REDUCE,请在 G1 中使用以下完整替代公式,替换之前的公式。对于提供的三个请求,它会生成相同的预期结果:

=VSTACK(
  $A$1:$C$1,
  FILTER($A$2:$C$7,$A$2:$A$7=$E$2,HSTACK($E$2,"No match","")),
  FILTER($A$2:$C$7,$A$2:$A$7=$E$3,HSTACK($E$3,"No match","")),
  FILTER($A$2:$C$7,$A$2:$A$7=$E$4,HSTACK($E$4,"No match",""))
)

Microsoft 在这三个必需函数的文档中均列出了 Mac 版 Excel 2024:FILTER、HSTACK 和 VSTACK。其代价是维护较麻烦:每增加一个请求的组,就需要再添加一个 FILTER 参数。

诊断错误并确保结果完整

如果出现 #SPILL! 错误,请选中公式单元格并检查预定的输出区域。将该区域中的现有内容移走,并检查是否存在合并单元格。Microsoft 还指出,将公式放在表格内也是原因之一;请将输出放在普通工作表网格中。请参阅如何更正 #SPILL! 错误。

如果出现 #CALC!,请先找出产生错误的计算。如果 BYROW 公式返回多单元格数据块,就会超出其文档所述的单值范围。没有匹配项且未提供备用结果的独立 FILTER,则可能产生空数组错误。这是 Microsoft 的 #CALC! 错误指南中描述的两种不同原因。

添加源数据记录时,请将 $A$2:$C$7 和 $A$2:$A$7 都扩展到相同的结束行。向 REDUCE 版本添加请求时,请将 $E$2:$E$4 扩展到最后一项所需请求。避免包含未使用的请求单元格:公式会处理范围中的每个单元格。

如果源列表经常增长,可以考虑将源数据存储在 Excel 表格中,并用结构化引用替换固定的源引用。Microsoft 文档指出,添加或删除表格行时,结构化引用会自动调整。溢出结果仍应放在表格之外。请参阅动态数组公式和溢出数组行为。

使用组装好的资源列表前,请将各组数据块与请求列表进行对照,并检查未匹配标记。在此示例中,具体的完成检查是:三条 Mosaic 记录、一条 Orbit 记录、一条可见的 Pebble 标记,以及没有 Prism 记录。这可以确认所提供数据的筛选内容和顺序符合预期。

来源