提问人:Sjoerd Eeman 提问时间:9/11/2023 最后编辑:Sjoerd Eeman 更新时间:9/21/2023 访问量:66
Excel 从包含 0 的单元格上方的单元格中获取值 - 不带 vba-
Excel getting value from cells above a cell containing 0 -without vba-
问:
我有一列,里面有我拥有的一台机器的运行时间(这些都是手工填写的)。
机器发生故障后,机器将被修复,小时计数器将重置为0小时。
第一个单元格(在屏幕截图中)中的数字为 2538 是使用以下方法计算的:
=IF(COUNTIF(K2:K31,"0"),INDEX(K2:K31,MATCH(0,K2:K31,0)-1,1),"false")
K2:K31
是“小时”列。
此代码现在仅检查是否存在 0,然后在列中查找匹配项,选择它找到的第一个 0,然后选择上面的单元格并显示此单元格的值。
问题是我找不到跳过第一个 0 并显示第二个零以上的值的方法,在这种情况下,结果应该是 476。在我知道如何做到这一点之后,更改代码并检查第三个零上方的值可能很容易,在这种情况下应该是 105。
我不能使用 VBA,所以它必须是一个公式,我使用的是 Excel 2016 Pro 而不是 MS365。
运行时间 |
---|
2122 |
2230 |
2345 |
2447 |
2538 |
0 |
100 |
233 |
421 |
444 |
448 |
460 |
475 |
476 |
0 |
10 |
13 |
18 |
25 |
54 |
70 |
100 |
101 |
105 |
0 |
4 |
8 |
156 |
250 |
300 |
页眉 | 值大于 0 |
---|---|
第一个零以上的数字 | 2538 |
第二个零以上的数字 | 476 |
第三个零以上的数字 | 105 |
答:
请尝试使用以下公式:
• 细胞中使用的配方N2
=LET(
a,SCAN(1,K2:K31,LAMBDA(x,y,x+(y=0))),
b,UNIQUE(a),
DROP(LOOKUP(b,a,K2:K31),-1))
或者,代替使用功能。DROP( )TAKE( )
=LET(
a,SCAN(1,K2:K31,LAMBDA(x,y,x+(y=0))),
b,UNIQUE(a),
TAKE(LOOKUP(b,a,K2:K31),3))
不使用帮助程序函数的替代方法。LAMBDA( )
=INDEX(K2:K31,TOCOL(IFS(K2:K31=0,ROW(K2:K31)),3)-2)
另一种方式,如果您不使用 MS365
,则使用INDEX() & AGGREGATE()
=INDEX($K$2:$K$31,AGGREGATE(15,6,(ROW($K$2:$K$31)-1)/($K$2:$K$31=0),ROW(A1))-1)
您还可以使用:=LET(range,K2:K31,FILTER(DROP(range,-1),DROP(range,1))
这基于 Excel 2016,没有 MS365 或更高版本的 Excel。
我找到了解决问题的方法: 它需要更多的列,但这对我来说很好。如果需要,我可以隐藏这些列。这可能不是解决此问题的最佳方法,但它对我有用,在从 Stackoverflow 获得一些提示后找到我自己的解决方案是最好的感觉。这也是理解 Excel 中代码的好方法。
D 列是原始数据,只是数字
C 列正在检查 0,如果找到 0,则向其添加 1,如果是可以找到的第二个,则添加 2。
E列,在本例中为E9,如果在C列中查找F9中的值,如果找到,则选择上面的数字。
C2:C4 计算 E 列的最大值、平均值和最小值。
评论
MS365
Excel 2010+
Excel 2010+