如何在 Excel、Libre Office 或 Google Sheets 中合并两张行数和列数不同的工作表?示例:
第 1 页:
姓名 | 年龄 | 电话 |
---|---|---|
麦克风 | 三十五 | 197 158 348 |
戴夫 | 三十八 | 394 953 429 |
第 2 页:
结果:
答案1
Google 表格
此解决方案适用于 Google 表格,支持不同大小的范围、高度和/或宽度,只要每个范围的第一列是公共索引/ID,例如共享名字示例中的列。您可以轻松添加和删除范围。
公式
=LET(
Σ,LAMBDA(x, QUERY(x,"WHERE Col1<>''")),
a,Σ(Sheet1!A1:C), b,Σ(Sheet2!A1:C),
Δ,LAMBDA(x,y, INDEX(VLOOKUP(x,y,
SEQUENCE(1,COLUMNS(y)-1,2),0))),
BYROW(UNIQUE(INDEX({a;b},,1)), LAMBDA(r,
IFNA({r, Δ(r,a), Δ(r,b)}))))
排序
如果需要排序,可以通过将最后一个公式包装在 QUERY 中来添加,该公式支持按任何列排序而不会干扰标题。在以下示例中,结果按以下方式排序:姓名:
=LET(
Σ,LAMBDA(x, QUERY(x,"WHERE Col1<>''")),
a,Σ(Sheet1!A1:C), b,Σ(Sheet1!A1:C),
Δ,LAMBDA(x,y, INDEX(VLOOKUP(x,y,
SEQUENCE(1,COLUMNS(y)-1,2),0))),
QUERY(BYROW(UNIQUE(INDEX({a;b},,1)), LAMBDA(r,
IFNA({r, Δ(r,a), Δ(r,b)}))),
"ORDER BY Col1 ASC",1))
解释
- LET 允许存储值和计算。
rangeA
和rangeB
是您的两个数据范围(包括标题)。它们可以是不同的维度,但第一列必须是索引/ID 列(姓名在您的示例中)。Σ
存储一个 LAMBDA 函数来过滤范围中的空行。这样做只是为了多次重复使用相同的公式。它接受一个参数x
,可以是范围(或数组)。a
并分别存储将函数应用到其中一个范围以删除空白行的b
结果。Σ
Δ
是第二个 LAMBDA 函数,它接受两个参数x
和y
,其中x
是单个姓名是y
一个数组,其中第一列包含名字。再次使用 LAMBDA 来重用两个数组的代码a
,而b
不是重复它。- VLOOKUP 用于定位
x
数组中包含的行y
。它放置在数组函数 INDEX 中,以便可以使用单个公式从同一行返回多个值。 - SEQUENCE 用于返回 VLOOKUP 索引参数的列数组。该数组为 1 行 x
Columns(y)-1
列(因为我们不需要名字列),编号从 2 开始(第二列,跳过名字)。
- VLOOKUP 用于定位
- LET 的最后一个参数是实际返回结果的公式。BYROW 将每个唯一值从名字将两个数组的列逐一放入存储当前姓名在
n
。INDEX 用于抓取第一列。 n
对于传入的每个值,LAMBDA 的公式都会返回一个数组,该数组由n
第一列与 和 各自返回的数组值(列)相Δ
结合而成。a
b
- 带排序的版本
第二个版本采用了使用 QUERY 的排序,以保持标题不受干扰。