关于本文
本文是通过利用生成式 AI 的自动化生成流程创建的。我们查阅了 Microsoft 官方的 HSTACK 和 VSTACK 函数规范,并准备了可测试连接行数和列数不同的表格时的结果的示例。目前尚未在 Excel 真实环境中进行结果确认。
验证状态:📘 已通过 Microsoft Support 确认,Excel 真实环境未确认
当在 Excel 中并排排列两个表格时,如果行数不同,进行横向合并会发生什么?如果列数不同,进行纵向合并又会发生什么?Microsoft 365 / Excel 2024 的动态数组函数 HSTACK 和 VSTACK 允许通过公式组合表格。但是,当合并宽度或高度不同的表格时,可能会被#N/A填充,如果单纯使用IFERROR来隐藏,有时可能会找不到原因。我们将使用相同的两个虚拟表格来观察差异,并解释在将其应用于实际工作之前需要确认的内容。
创建示例表
在 Excel 的空工作表中输入以下两个表格。左表为 A1:B4,右表为 D1:F3。首先请确认公式的溢出范围内没有其他值。
左表 A1:B4
| 姓名 | 部门 |
|---|---|
| 青木 | 销售 |
| 佐藤 | 总务 |
| 铃木 | 营业 |
右侧表格 D1:F3
| 代码 | 数量 | 价格 |
|---|---|---|
| P01 | 2 | 100 |
| P02 | 3 | 150 |
除去标题行后,左侧数据为3行×2列,右侧为2行×3列。这次是有意改变了尺寸。放置计算式的单元格请选择不与原表重叠的 H2 等位置。
HSTACK:水平连接会发生什么
=HSTACK(A2:B4,D2:F3)
HSTACK 会将各个数组按水平方向排列。返回值的列数是各个数组列数的总和,行数是最大行数。以这次为例,结果为 3行×5列。
| 第1列 | 第2列 | 3列 | 4列 | 5列 |
|---|---|---|---|---|
| 青木 | 销售 | P01 | 2 | 100 |
| 佐藤 | 总务 | P02 | 3 | 150 |
| 铃木 | 销售 | #N/A | #N/A | #N/A |
此#N/A是由于右表的数据行比左表少一行而添加的区域。并非文件损坏。这是微软官方的HSTACK 函数但说明中指出,缺失的行会填充#N/A。
VSTACK:垂直合并有何不同
=VSTACK(A2:B4,D2:F3)
VSTACK 是按垂直方向排列的函数。这次将变为 5行×3列。由于左侧的表只有 2 列,因此预计上方 3 行的第 3 列会显示#N/A。
| 第1列 | 第2列 | 第3列 |
|---|---|---|
| 青木 | 营业 | #N/A |
| 佐藤 | 总务 | #N/A |
| 铃木 | 营业 | #N/A |
| P01 | 2 | 100 |
| P02 | 3 | 150 |
仅凭垂直堆叠并不能使表格的含义相匹配。在此,左侧两列是“姓名和部门”,右侧三列是“代码、数量和价格”,因此,即使在形式上可以合并,各列的含义也会混淆。如果在业务中使用,首先需要统一各列的含义。
这个问题类似于在 SQL 中盲目对列名不同的数据使用 UNION 的设计失误。HSTACK/VSTACK 是通过行和列的位置进行合并,而不是理解标题名称并进行对应。
尝试更改一个地方
接下来,不删除左侧表格的最后一行(A4:B4),而是仅将公式的引用范围减少一行。
=HSTACK(A2:B3,D2:F3)
由于两个表都变成两行,因此 HSTACK 将不再缺少行,计算区域应该变为 2 行 × 5 列。其优点是无需编辑数据本身,只需更改引用范围即可确认其行为。
再次将引用范围恢复原样后,使用 IFNA 更改显示内容。
=IFNA(HSTACK(A2:B4,D2:F3),"")
缺失位置的#N/A将变为为空字符串。微软的函数说明中也包含结合使用 IFERROR 的示例,但 IFERROR 也会隐藏其他类型的错误。而使用 IFNA 则只能针对#N/A进行处理。
注意:如果源数据侧确实存在#N/A,也会被 IFNA 掩盖而无法看见。请务必在事先确认原始表格质量的前提下,再为了美观的目的使用它。
如果出现 #SPILL! 错误
HSTACK/VSTACK 是将公式输入单个单元格并将计算结果溢出到周围的动态数组函数。如果在希望展开结果的位置存在文字或其他公式,#SPILL!可能会出现错误。
切勿在原始表格周围写入内容,而应将公式置于空白区域作为基本原则。在实务报表中,准备一个专门存放结果的工作表或区域会更安全。
此外,在不支持该函数的旧版 Excel 中,将无法进行此类计算。Microsoft Support 支持的产品为 Excel for Microsoft 365 和 Excel 2024 系列。如果共享对象使用的是旧版 Excel,请考虑采用值粘贴或其他替代方案。
在工作中使用的判断
| 想要实现的目标 | 适合的应对方案 |
|---|---|
| 将不同的信息横向排列 | HSTACK。但需先确认行之间的对应关系 |
| 将列定义相同的每月数据纵向累加 | VSTACK。但需统一列的顺序和数据类型 |
| 列数不一致 | #N/A确认发生的位置和含义 |
| 输入数据中原本存在错误 | 切勿用 IFNA 掩盖,应先追查错误原因 |
| 行数不断增加的业务表格 | 还对比了使用 Excel 表格或 Power Query 进行架构管理的方法 |
尤其重要的是,将表格并排与正确关联数据是两回事这一点。由于 HSTACK 只是将不同表格的行号对齐,因此对于“通过员工 ID 进行关联”的用途,建议考虑基于键的方式,例如 XLOOKUP 或 Power Query 的合并。
完成版的公式和输入表的制作方法已保存至GitHub 示例:HSTACK/VSTACK 行列大小不一致中。
