在 Excel 中,一个单元格通常只保存一个值;若想放入多个值,以往多靠逗号或换行把文本拼在一起,既难维护也不便计算。微软(Microsoft)在 Microsoft 365 Insider 博客中给出新做法:借助列表和数组,把多个值直接放进同一个单元格,并让它们仍能参与公式计算。
正文
在 Excel 的 40 年历史中,每个单元格只能放一个值。现在,我们很高兴宣布通过推出列表(lists)、单元格中的数组(arrays in cells)和嵌套数组(nested arrays)来改变这一点,初期面向 Microsoft Excel for Windows 和 Mac 的 Beta 频道。
许多工作簿早已尝试在一个单元格里塞入多个值:比如项目可能把“Carlos, Henrietta, Jacob”列为三个负责人,或 Forms 调查返回“2:00 PM; 2:30 PM; 3:00 PM”作为一条回答。有了列表,你可以把这些值保留在一个单元格,同时让它们彼此分开以便于筛选、计算等。
后文将更深入探讨单元格中的数组和嵌套数组。
注意: 这些是预览功能。在正式发布前,其行为可能根据反馈改变。在正式可用前,不建议在重要工作簿中使用。
Lists
列表让你能在单个单元格放入多个值。可通过插入 > 列表或按 Ctrl+J 创建,然后输入或粘贴项目,项目间用逗号或分号分隔(取决于区域设置)。选中单元格中的图标可显示各个值。
双击单元格或按 F2 即可像其他值一样添加、删除或编辑列表项。
借助列表,你可以按一个或多个单独项目筛选,而不必按整个文本条目筛选。
引用列表会返回其所有值用于计算。例如 =B2 会将这些值溢到单独的单元格。
Arrays in cells
列表本身有用,但它只是 Excel 更广泛改动的一部分。Excel 史上首次,数组可以作为值或公式结果原生存在于单元格中。它们可以是任意大小和形状,甚至能包含其他数组。
现在,你可以用花括号 { } “包裹”任何溢出公式的公式体,将其结果保留在单个单元格内。
自动态数组引入以来,数组结果会跨单元格溢出——例如 ={1;2;3}。用花括号包裹原数组会围绕它创建一个 1x1 数组,于是数组留在单单元格而不溢出。
花括号长期以来用于描述 Excel 中的数组,现在通过允许多层花括号延伸了该行为,让你建表更灵活:不必为公式溢出预留空间,结果可留在单格。
Arrays inside arrays, or nested arrays
数组现在也能“嵌套”在其他数组中。例如:={{1,2,3};{4,5,6}}
此前,产生“数组的数组”的公式会返回截断结果或 #CALC! 错误。现在,受支持的公式会返回完整的嵌套结果。
下例中可见 TEXTSPLIT 在有、无嵌套数组时的行为:无嵌套时 Excel 只为每行返回第一项;有嵌套时结果溢出,每行一个数组。
每行的数组随后可用于进一步计算。
Four new functions: FLATTEN, HAS, HASANY, HASALL
为便于处理数组,新增了四个函数。
FLATTEN(array, [pad_value], [levels]) 通过去除一层或多层嵌套来简化嵌套数组。
沿用上例,FLATTEN 可简化嵌套数组输出,将各个结果溢到网格。我们用空字符串 ("") 作为 pad_value,使项目较少的行在剩余列显示空白。
三个 HAS 函数检查值是否在数组中:
- HAS(array, value) 若 value 出现在数组任意处返回 TRUE,否则 FALSE。
- HASANY(array, values) 若 values 中任一值出现返回 TRUE,否则 FALSE。
- HASALL(array, values) 若 values 中所有值都出现返回 TRUE,否则 FALSE。
Do more with spreadsheets using arrays in cells and nested arrays
单元格内的数组开启了以往不实用的表格设计。下方跑步追踪表在一行一次跑步的表中捕获分段用时(每公里耗时),分段数取决于跑步长度,每次跑步的统计在同一表中直接计算。
更多例子建议查阅 LinkedIn、YouTube、Reddit 等你喜欢的 Excel 社区。
Enabling nested array calculations in a workbook
兼容版本 3(Compatibility Version 3)将随单元格数组一同发布,多数涉及嵌套数组的计算需要它。可在公式 > 计算选项中为各工作簿设置。详见兼容版本说明。
某些现有公式在兼容版本 3 下会返回不同结果。若工作簿行为不符预期,可保持为兼容版本 1 或 2。
Known limitations
该功能向 Beta 频道推出时有下列限制:
- 条件格式不检查数组内容,除非用公式
- 数据验证不能将列表或数组用作下拉项
- 图表不把数组展开为数据点
- 数据透视表不将数组值读为源数据
- Power Query不加载或输出数组值列
- 查找和替换不能替换列表/数组项
Availability
这些改进正面向 Beta 频道用户推出:
- Windows:Version 2610 (Build 20520.20000) 或更高
- Mac:Version 16.114 (Build 26092111) 或更高
本博客涵盖的功能会随时间逐步推出以监控质量和性能,因此部分预览功能可能不会立即可用。功能也可能在此过程中暂停、调整或移除。
Feedback
在 Excel 中点击帮助 > 反馈告知我们你的想法。
评论
讨论整体既好奇又警惕,分歧主轴是:单元格内列表/数组究竟是迟到的实用改进,还是让 Excel 本就松软的类型系统进一步失控;同时不少人认为这并不新鲜,其他工具和旧系统早已有类似能力。
认为这是迟到但终于到来的实用功能
- 有人觉得早该这么做,而不是 spill;能对单元格内多个值做索引,处理逗号分隔列表、JSON 型字段会轻松很多,甚至把这看作数据库字段支持 JSON 类型并配了好用界面。(较多人) > 这听起来像数据库字段支持 JSON 再加个好用的 UI,虽然说法有点贬低,但我觉得挺酷,会让不少事容易很多。(@kbenson)
认为类型松软和功能堆叠才是 Excel 的灾难
- 约束和惯用法才能让设计可控,什么都能塞进单元格只会产生没人看得懂的意大利面,还会威胁企业里维护多年的 VBA 脚本和后来 AI 生成的表格。(少数人) > 什么都灵活,就会让你做出没人看得懂的意大利面。(@lordnacho)
认为这并不新,甚至不清楚到底新增了什么
- 有人指出 TreeSheets 支持类似结构超过十五年,2008 年就在 Excel 里用过单元格内数组,Pick OS 六十一年前就有多值字段;也有人困惑一个单元格本来就能塞很多值,现在所谓“支持”究竟指什么。(较多人) > 我没看文章,但一个单元格不是早就能装很多值吗?谁能解释他们现在到底在“支持”什么?(@smalltorch)
认为旧兼容包袱仍在,新旧问题并存
- 一边支持列表和数组作为单元格值,一边仍因 Lotus 1-2-3 兼容保留 1900 年 2 月 29 日这个不存在的日期,显得割裂。(少数人) > Excel 现在支持把列表和数组当值放进单元格,却仍然认为 1900 年 2 月 29 日存在,就因为四十年的向后兼容?这世界真奇怪。(@gcanyon)
认为真正革命的方向是让单元格装概率分布
- 电子表格过于确定性,容易让人误以为它能反映现实;如果单元格和相关结果都是概率分布,才能表达不确定性并暴露尾部风险。(少数人) > 如果单元格能表示概率分布,所有结果单元格也跟着变成分布,就能更好地表达世界的不确定性。(@m101)
认为不该把 Excel 当严肃计算工具,应寻找替代品
- 有人称在电脑上做数学应通过 Mathematica 这类计算机代数系统;Excel 里数字不必是数字、也不必在某个位置,却会在管理对冲基金时静默出错。另有人推荐 OnlyOffice 作为开源替代,公式支持广且意外稳健。(少数人) > 在电脑上做数学应该用 CAS,比如 Mathematica;Excel 是放荡的灾难,数字“有位置”却不必是数字,还会在你管理对冲基金时静默出错。(@qubex)
用玩笑表达对新功能复杂度的复杂心情
- 从“Excel 有了 z 轴”到嵌套电子表格和无限缩放,调侃背后是对功能继续堆叠的无奈。(少数人) > Excel 刚刚有了 z 轴。酷。(@drfloyd51)
有价值的补充
- Excel 仍保留 1900 年 2 月 29 日,是 Lotus 1-2-3 兼容遗留,微软官方文档有说明;于是出现新类型系统和旧日期 bug 并存的奇观。
- Pick OS 的多值字段、TreeSheets 的层级/多值结构,是常被拿来证明“历史重复”的旧例。
- Excel for Mac 功能不缺,但 UI 支持不足,实际用起来远不如 Windows 版。
- 有评论把新功能精确描述为“数据库字段支持 JSON 类型并配上好用 UI”,并认为这比“单元格多值”更接近本质。
- 有人打算在同一单元格里定义多个 lambda,让其他单元格依赖它们及其类型,以此压力测试新系统。
- 有人用“科德要哭了”调侃在单元格里塞多值对关系模型的反叛。