我有一个项目列表,这些项目的重复次数各不相同,但所有出现的情况都分组在一起(不必担心 20 行以下出现另一个“苹果”)。我需要使用数组公式对项目的每个出现进行编号:
物品 | 发生 |
---|---|
苹果 | 1 |
苹果 | 2 |
苹果 | 3 |
苹果 | 4 |
橙子 | 1 |
橙子 | 2 |
橙子 | 3 |
葡萄 | 1 |
葡萄 | 2 |
葡萄 | 3 |
葡萄 | 4 |
此工作表将与其他人共享,并且可能有数十到数百个不同的项目,并且每个项目可能有 1 到数百个出现。我需要在 Windows/Mac/Web 上运行的解决方案,因此 VBA 不是一个选项。在 Google 表格中,我找到了以下有效的公式:
=ArrayFormula(SORT(ROW(A2:A),SORT(ROW(A2:A),A2:A,1),1)-MATCH(A2:A,SORT(A2:A),0)-ROW()+1)
我需要在 Excel 中做同样的事情,因此我尝试将 ARRAYFORMULA 转换为 LAMBDA,因为我很幸运它们可以跨平台工作(尽管我对 LAMBDA 还很陌生):
=BYROW(A2:A,LAMBDA(item,SORT(ROW(item),SORT(ROW(item),item,1),1)-MATCH(item,SORT(item),0)-ROW()+1))
但是这个公式在 Google 表格中给出了一个错误:
“函数 SORT 参数 2 需要数字值。但‘Apples’是文本,无法强制转换为数字。”
Excel 中出现以下错误:
“公式中使用的值的数据类型错误。”
我很难理解我为 Google Sheets 找到的公式实际上是如何工作的,因此对其 LAMBDA 等效项进行故障排除对我来说不起作用。有没有关于如何在 Excel 中对我的出现次数进行编号的想法,无论是通过修复我已有的内容,还是有更好的选择?
添加:
@Mureinik 的答案不正确,因为我指定这需要是一个数组公式,但我尝试将他的建议包含在 LAMBDA 中(以及一些代码来找出列中的最后一行),并且它有效!
=BYROW(INDIRECT("A2:A"&COUNTA(A:A)),LAMBDA(item, COUNTIF(INDIRECT("A2:A"&ROW(item)), INDIRECT("A"&ROW(item))) ))
作为奖励,相同的代码可以在 Google Sheets 中使用,而且似乎比我之前的代码更高效。谢谢 @Mureinik,我给了你支票,让你走上了正确的道路!
答案1
您可以使用countif
函数来计算指定单元格的出现次数,直至列顶部。假设“项目”是 A 列,并且第 1 行有一个标题行,则行的公式n
为:
=COUNTIF($A$2:$An, $An)
例如,对于第 123 行,您需要:
=COUNTIF($A$2:$A123, $A123)
输入前两个单元格后,您可以将公式一直拖到列的底部,Excel 会为您整理编号。
答案2
@Mureinik 的答案不正确,因为我指定这需要是一个数组公式,但我尝试将他的建议包含在 LAMBDA 中(以及一些代码来找出列中的最后一行),并且它有效!
=BYROW(INDIRECT("A2:A"&COUNTA(A:A)),LAMBDA(item, COUNTIF(INDIRECT("A2:A"&ROW(item)), INDIRECT("A"&ROW(item))) ))
额外的好处是,相同的代码可以在 Google Sheets 中使用,而且似乎比我之前的代码更高效。感谢 @Mureinik 为我指明了正确的方向!