COUNTIF 函数,如果值等于则重置计数
COUNTIF Function, reset count if value equals
我需要在 B 列中每次出现值“4A”时在 A 列中列出一个 运行 计数,但如果 B 列中的值等于“2B”,则需要将计数重置为 0 .
我附上了我的工作簿样本,A 列显示了我需要如何进行计数操作。我愿意使用 VB 或公式。
或文本格式:
| A | B |
+---+----+
| 0 | 2B |
| | 3A |
| 1 | 4A |
| | 4B |
| | 4B |
| 2 | 4A |
| | 4B |
| 3 | 4A |
| | 9A |
| 0 | 2B |
| | 3A |
| 1 | 4A |
| | 4C |
| 2 | 4A |
| | 9A |
| 0 | 2B |
| | 3A |
| 1 | 4A |
| | 9A |
| 0 | 2B |
| | 3A |
| 1 | 4A |
| | 4C |
| | 9A |
| | 9B |
| | 9Z |
编辑:
@Jeeped 和@trincot 提出了更好的非数组版本。我在这里稍微修改了它们:
@Jeeped的公式:
=IF(OR(B1={"2B","4A"}), COUNTIF(INDEX(B:B,AGGREGATE(14, 6, ROW(B:B1)/(B:B1="2B"), 1)):B1, "4A"),"")
修改后,它在聚合中使用 LARGE
函数而不是 SMALL
和 ""
而不是 TEXT(,)
。
@trincot 的公式:
=IF(OR(B2={"2B","4A"}),(B2="4A")*(1+IFERROR(INDEX(G:G,MATCH(MAX(G:OFFSET(G2,-1,0))+1,G:OFFSET(G2,-1,0))),0)),"")
与原来的相比,它稍微重新排列了 'IF-wise',我还用 MAX([...]) + 1
替换了魔法 9999
并做了这样你就可以将它粘贴到第一个单元格并向下拖动而不是为第一个单元格和连续的单元格使用两个单独的公式。
我原来的版本:
我认为它的好处可能是最容易理解的(?-我在这里显然有偏见所以我可能是错的)而且它在物理上是最短的。
作为数组公式,它有一个明显的缺点。
在单元格 "A1" 中你可以写:
=IF(OR(B1="2B",B1="4A"),SUM((B:B1="4A")*(ROW(B:B1)>MAX(ROW(B:B1)*(B:B1="2B")))),"")
这是一个数组公式,所以你必须用ctrl + shift + enter来确认它。
然后往下拉就可以了
基本上它会计算从当前行到第一行的范围内“4A”的出现次数,前提是计数的“4A”行大于“2B”的最后一行。
这是一种使用标准(非数组)公式的方法:
在A1中放:
=IF(B1="4A",1,0)
在A2中放:
=IF(B2="2B",IF(INDEX(A:A,MATCH(9999,A:A1))>0,0,""),
IF(B2="4A",1+INDEX(A:A,MATCH(9999,A:A1)),""))
Drag/copy A2 向下到 A 列中的剩余单元格。
这将产生空白,否则将显示相同的值。
如果不需要抑制重复值,那么可以将A2中的公式简化为:
=IF(B2="2B",0,IF(B2="4A",1+A1,A1))
...并复制下来。
我需要在 B 列中每次出现值“4A”时在 A 列中列出一个 运行 计数,但如果 B 列中的值等于“2B”,则需要将计数重置为 0 .
我附上了我的工作簿样本,A 列显示了我需要如何进行计数操作。我愿意使用 VB 或公式。
或文本格式:
| A | B |
+---+----+
| 0 | 2B |
| | 3A |
| 1 | 4A |
| | 4B |
| | 4B |
| 2 | 4A |
| | 4B |
| 3 | 4A |
| | 9A |
| 0 | 2B |
| | 3A |
| 1 | 4A |
| | 4C |
| 2 | 4A |
| | 9A |
| 0 | 2B |
| | 3A |
| 1 | 4A |
| | 9A |
| 0 | 2B |
| | 3A |
| 1 | 4A |
| | 4C |
| | 9A |
| | 9B |
| | 9Z |
编辑:
@Jeeped 和@trincot 提出了更好的非数组版本。我在这里稍微修改了它们:
@Jeeped的公式:
=IF(OR(B1={"2B","4A"}), COUNTIF(INDEX(B:B,AGGREGATE(14, 6, ROW(B:B1)/(B:B1="2B"), 1)):B1, "4A"),"")
修改后,它在聚合中使用 LARGE
函数而不是 SMALL
和 ""
而不是 TEXT(,)
。
@trincot 的公式:
=IF(OR(B2={"2B","4A"}),(B2="4A")*(1+IFERROR(INDEX(G:G,MATCH(MAX(G:OFFSET(G2,-1,0))+1,G:OFFSET(G2,-1,0))),0)),"")
与原来的相比,它稍微重新排列了 'IF-wise',我还用 MAX([...]) + 1
替换了魔法 9999
并做了这样你就可以将它粘贴到第一个单元格并向下拖动而不是为第一个单元格和连续的单元格使用两个单独的公式。
我原来的版本:
我认为它的好处可能是最容易理解的(?-我在这里显然有偏见所以我可能是错的)而且它在物理上是最短的。
作为数组公式,它有一个明显的缺点。
在单元格 "A1" 中你可以写:
=IF(OR(B1="2B",B1="4A"),SUM((B:B1="4A")*(ROW(B:B1)>MAX(ROW(B:B1)*(B:B1="2B")))),"")
这是一个数组公式,所以你必须用ctrl + shift + enter来确认它。
然后往下拉就可以了
基本上它会计算从当前行到第一行的范围内“4A”的出现次数,前提是计数的“4A”行大于“2B”的最后一行。
这是一种使用标准(非数组)公式的方法:
在A1中放:
=IF(B1="4A",1,0)
在A2中放:
=IF(B2="2B",IF(INDEX(A:A,MATCH(9999,A:A1))>0,0,""),
IF(B2="4A",1+INDEX(A:A,MATCH(9999,A:A1)),""))
Drag/copy A2 向下到 A 列中的剩余单元格。
这将产生空白,否则将显示相同的值。
如果不需要抑制重复值,那么可以将A2中的公式简化为:
=IF(B2="2B",0,IF(B2="4A",1+A1,A1))
...并复制下来。