对出现在具有其他值的单元格之间的具有特定值的单元格进行计数
Count cells with certain values which appear between cells with other values
我在 Excel 中有一排数字模式(每个数字在不同的单元格中),如下所示。
1 0 0 0 2 0 0 1 0 0 0 0 0 3 0 0 0 0 0 0 0 0 2 0 0 0 1
(我的行有 300 个单元格)。
定义:
- 我将非零值之间的零序列称为“0序列”。
- 我将标记 0 序列开始和结束的非零值称为 "mark value"
我要计算:
- 对 0 序列计数 0 的个数。在上面的这个例子中,结果是:3, 2, 5, 8, 3
- 确定最小的0序列。在上面的例子中,它是 2
- 确定最大的0序列。在上面的例子中,它是 8
判断每个0序列出现的频率。在上面的例子中,它是:
整行长度为1的0序列个数:0
整行长度为2的0序列个数:1
整行长度为3的0序列个数:2
整行长度为4的0序列个数:0
整行长度为5的0序列的个数:1
整行长度为6的0序列个数:0
整行长度为7的0序列个数:0
整行长度为8的0序列个数:1
我尝试了不同的 Excel 公式,例如:
=ABS(MATCH(D13, B2:B11, 0)-MATCH(D14, B2:B11, 0))-1
此公式不适用于具有相同值的标记值("D13"、"D14")。它也不会计算超过一个 0 序列。
任何提示,最好没有 VBA,将不胜感激。
假设您的值在 A1:AA1
中并且外部值是 <> 0:
获得正确频率的核心:
=FREQUENCY(IF(B1:Z1=0,COLUMN(B1:Z1)),IF(B1:Z1=0,"",COLUMN(B1:Z1)))
这将计算为一组数字 > 3,2,5,8,3
序列计数(在我的示例中返回到 B3
):
=TEXTJOIN(",",1,FREQUENCY(IF(B1:Z1=0,COLUMN(B1:Z1)),IF(B1:Z1=0,"",COLUMN(B1:Z1)))
最小序列(在B4
中返回):
=MIN(FREQUENCY(IF(B1:Z1=0,COLUMN(B1:Z1)),IF(B1:Z1=0,"",COLUMN(B1:Z1))))
最大序列(返回到B5
):
=MAX(FREQUENCY(IF(B1:Z1=0,COLUMN(B1:Z1)),IF(B1:Z1=0,"",COLUMN(B1:Z1))))
每个频率的计数(返回B5:B13
):
=COUNT(FILTERXML("<t><s>"&SUBSTITUTE(B,",","</s><s>")&"</s></t>","//s[.='"&ROW(A1)&"']"))
或者,如果您没有选择对 B3
使用 TEXTJOIN
:
=SUM(IF(FREQUENCY(IF(B:Z=0,COLUMN(B:Z)),IF(B:Z=0,"",COLUMN(B:Z)))=ROW(A1),1,0))
往下拉...
注意:这些公式都是通过CtrlShift[=57=数组输入的]输入
如您所见,我通过设置返回值的方式对您的查询进行了一些修改。
如果你愿意等一会儿,我相信有人能想出更简单的东西(也许 Excel O365 及其 DA 函数)
我在 Excel 中有一排数字模式(每个数字在不同的单元格中),如下所示。
1 0 0 0 2 0 0 1 0 0 0 0 0 3 0 0 0 0 0 0 0 0 2 0 0 0 1
(我的行有 300 个单元格)。
定义:
- 我将非零值之间的零序列称为“0序列”。
- 我将标记 0 序列开始和结束的非零值称为 "mark value"
我要计算:
- 对 0 序列计数 0 的个数。在上面的这个例子中,结果是:3, 2, 5, 8, 3
- 确定最小的0序列。在上面的例子中,它是 2
- 确定最大的0序列。在上面的例子中,它是 8
判断每个0序列出现的频率。在上面的例子中,它是:
整行长度为1的0序列个数:0
整行长度为2的0序列个数:1
整行长度为3的0序列个数:2
整行长度为4的0序列个数:0
整行长度为5的0序列的个数:1
整行长度为6的0序列个数:0
整行长度为7的0序列个数:0
整行长度为8的0序列个数:1
我尝试了不同的 Excel 公式,例如:
=ABS(MATCH(D13, B2:B11, 0)-MATCH(D14, B2:B11, 0))-1
此公式不适用于具有相同值的标记值("D13"、"D14")。它也不会计算超过一个 0 序列。
任何提示,最好没有 VBA,将不胜感激。
假设您的值在 A1:AA1
中并且外部值是 <> 0:
获得正确频率的核心:
=FREQUENCY(IF(B1:Z1=0,COLUMN(B1:Z1)),IF(B1:Z1=0,"",COLUMN(B1:Z1)))
这将计算为一组数字 > 3,2,5,8,3
序列计数(在我的示例中返回到
B3
):=TEXTJOIN(",",1,FREQUENCY(IF(B1:Z1=0,COLUMN(B1:Z1)),IF(B1:Z1=0,"",COLUMN(B1:Z1)))
最小序列(在
B4
中返回):=MIN(FREQUENCY(IF(B1:Z1=0,COLUMN(B1:Z1)),IF(B1:Z1=0,"",COLUMN(B1:Z1))))
最大序列(返回到
B5
):=MAX(FREQUENCY(IF(B1:Z1=0,COLUMN(B1:Z1)),IF(B1:Z1=0,"",COLUMN(B1:Z1))))
每个频率的计数(返回
B5:B13
):=COUNT(FILTERXML("<t><s>"&SUBSTITUTE(B,",","</s><s>")&"</s></t>","//s[.='"&ROW(A1)&"']"))
或者,如果您没有选择对 B3
使用 TEXTJOIN
:
=SUM(IF(FREQUENCY(IF(B:Z=0,COLUMN(B:Z)),IF(B:Z=0,"",COLUMN(B:Z)))=ROW(A1),1,0))
往下拉...
注意:这些公式都是通过CtrlShift[=57=数组输入的]输入
如您所见,我通过设置返回值的方式对您的查询进行了一些修改。
如果你愿意等一会儿,我相信有人能想出更简单的东西(也许 Excel O365 及其 DA 函数)