COUNTIF功能,如果值等于,则重置计数

时间:2016-07-01 21:20:10

标签: excel vba count formula countif

我需要列出每次出现值#34; 4A"的A列中的运行计数。在B列中,但如果B列中的值等于" 2B"则需要将计数重置为0。

我附上了我的工作簿样本,A栏显示了我需要如何操作。我愿意使用VB或公式。

enter image description here

或以文本格式:

| 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 |

2 个答案:

答案 0 :(得分:1)

修改

@Jeeped和@trincot提出了更好的非阵列版本。我在这里略微修改了它们:

@ Jeeped的公式:

=IF(OR(B1={"2B","4A"}), COUNTIF(INDEX(B:B,AGGREGATE(14, 6, ROW(B$1:B1)/(B$1:B1="2B"), 1)):B1, "4A"),"")

修改后,它使用汇总中的LARGE函数,而不是SMALL""而不是TEXT(,)

@ trincot的公式:

=IF(OR(B2={"2B","4A"}),(B2="4A")*(1+IFERROR(INDEX(G:G,MATCH(MAX(G$1:OFFSET(G2,-1,0))+1,G$1:OFFSET(G2,-1,0))),0)),"")

与原版相比,它已经稍微重新排列'IF-wise',我还用9999替换了魔术MAX([...]) + 1并制作它以便您可以将它粘贴在第一个单元格中并向下拖动而不是对于第一个单元格和连续单元格有两个单独的公式。

我的原始版本:

我认为它有可能是最容易理解的好处(? - 我显然有偏见,所以我可能错了)而且它在物理上是最短的。

它具有作为数组公式的明显缺点。

在单元格“A1”中,您可以写:

=IF(OR(B1="2B",B1="4A"),SUM((B$1:B1="4A")*(ROW(B$1:B1)>MAX(ROW(B$1:B1)*(B$1:B1="2B")))),"")

这是一个数组公式,所以你必须用ctrl + shift + enter确认它。

然后你可以把它拖下来。

基本上它计算从当前行延伸到第一行的范围内“4A”的出现次数,条件是计数“4A”的行大于“2B”的最后一行。

答案 1 :(得分:0)

以下是标准(非数组)公式的方法:

在A1中:

=IF(B1="4A",1,0)

在A2中:

=IF(B2="2B",IF(INDEX(A:A,MATCH(9999,A$1:A1))>0,0,""),
            IF(B2="4A",1+INDEX(A:A,MATCH(9999,A$1:A1)),""))

将A2向下拖动/复制到A列中的其余单元格。

这将产生空白,否则将显示相同的值。

如果不需要抑制重复值,则可以将A2中的公式简化为:

=IF(B2="2B",0,IF(B2="4A",1+A1,A1))

...并将其复制下来。