我有一份名单,旁边是一份班次名单。我想按天整理一份每班次的人员名单,该名单将自动动态更新。我不知道最好的做法是什么。
在主名册中,有一列员工姓名,后面跟着 14 列班次。然后,我想根据第一张表中的班次创建 14 个姓名列表。
例如:主要范围有:
A B C D E
---------- --- --- --- ---
1 Joe Blogs E E L O
2 Jill Bleg L L E E
3 Geoff Ted O L L L
例如,我想查找 D 列,并搜索 L 的第一个实例以列出 Joe Blogs,然后搜索 L 的第二个实例以列出 Geoff Ted,依此类推。
有没有什么方法可以在单元格范围内搜索字符串的第 N 个实例?
答案1
这并不像看起来那么简单。首先,要找到 D 列中所有出现“L”的行号,您可以使用:
=IF(D1:D3="L"; ROW(D1:D3))
另存为数组公式:输入后,按 Ctrl+Shift+Return(或 Mac 上的 Command+Shift+Return)。然后展示在花括号中。并且它的结果不会是单个单元格,而是与您正在处理的范围一样多的单元格。在上面的例子中,您将得到 3 个单元格,其值为 1、空白和 3。
下一个,使用SMALL
找到第 N 个值:
SMALL(numberlist; n)
返回(无序)数字范围或数字数组中第小的
n
数字numberlist
。
应用SMALL
上述内容,您将回到单个单元格的结果:
=SMALL(IF(D1:D3="L"; ROW(D1:D3)); 1)
=SMALL(IF(D1:D3="L"; ROW(D1:D3)); 2)
尽管结果是一个单元格,但仍需要使用 Ctrl+Shift+Return 进行保存。
现在,知道了行号,INDEX
就可以在第一列找到名称A1:A3
:
=INDEX(A1:A3; SMALL(IF(D1:D3="L"; ROW(D1:D3)); 1); 1)
=INDEX(A1:A3; SMALL(IF(D1:D3="L"; ROW(D1:D3)); 2); 1)
再次,所有这些都需要使用 Ctrl+Shift+Return 来保存。
但是,这样的公式不能拖拽到其他单元格中,因为排名“1”和“2”不会自动变成“3”,以此类推。而是根据公式所在的行来计算所需的排名:
=INDEX(A1:A3; SMALL(IF(D1:D3="L"; ROW(D1:D3)); ROW()); 1)
将其作为数组公式保存在第 1 行的某处后,可以将其向下拖动以添加到第 2 行、第 3 行等等。
或者,您可以复制/粘贴数组公式来动态调整列和行引用,而不是扩展结果。在下面的屏幕截图中,我将以下内容从 B7、B12 和 B17 复制到其他单元格中:
=INDEX($A$1:$A$3; SMALL(IF(B$1:B$3=B$6; ROW(B$1:B$3)); ROW()-ROW(B$6)); 1)
=INDEX($A$1:$A$3; SMALL(IF(B$1:B$3=B$11; ROW(B$1:B$3)); ROW()-ROW(B$11)); 1)
=INDEX($A$1:$A$3; SMALL(IF(B$1:B$3=B$16; ROW(B$1:B$3)); ROW()-ROW(B$16)); 1)
请注意,数组公式的键盘快捷键只有在实际更改公式后才会起作用;当您只是按“Return”键,然后再次进入公式并按“Ctrl+Shift+Return”键将不起作用。
此外,一旦扩展了数组公式,您需要选择所有结果单元格才能更改该公式。否则您将得到“你不能只改变数组的一部分”。