我需要知道如何从行中排除 0 并获取 MIN 值。
但我也需要排除 F1 单元。
前任:
A B C D E F
1 0 18 20 0 150 = 18
但如果我在 excel 中使用 =MIN(A1,B1,C1,D1,E1) 返回 0。
任何帮助表示赞赏。
试试这个公式
=SMALL((A1,C1,E1),INDEX(FREQUENCY((A1,C1,E1),0),1)+1)
SMALL 和 FREQUENCY 函数都接受“联合”作为参数,即用逗号分隔并用括号括起来的单个单元格引用,如 (A1,C1,E1)。
因此,该公式使用 FREQUENCY 和 INDEX 来查找范围内零的数量,如果将其加 1,则得到 k 值,使得第 k 个最小值始终是除零之外的最小值。
我假设你没有负数......
在结果单元格中输入以下内容,然后在按 ENTER 的同时按 Ctrl 和 Shift:
=MIN(If(A1:E1>0,A1:E1))
到目前为止,最有效的方法是使用 SMALL 和 COUNTIF 公式,如下所示;
SMALL 返回数据集中的第 k 个最小值。
=小(A1:A100,COUNTIF($A$1:$A$100,0)+1)
其中 countif 计算范围 (+1) 中的零,并用于告诉 SMALL 返回第 k 个最小值。
信用:链接
不完全确定您在这里想要什么,但是如果您想在范围内打折空白单元格并传递零,那么就可以了;如果有点做作:
=MIN(IF(A1:E1=0,MAX(A1:E1),A1:E1))
使用 Ctrl+Shift+Enter 作为数组。
我在这里做的是用列表中的最大值替换零。
如果你所有的价值都是积极的,你可以做 -max(-n)
列出的解决方案并不完全适合我。最接近的是 Wiggum 酋长 - 我想对他的回答添加评论,但缺乏这样做的声誉。所以我作为单独的答案发布:
=MIN(IF(A1:E1>0;A1:E1))
然后不要按 ENTER,而是按 CTRL+SHIFT+ENTER 并观察 Excel 分别将{
和添加}
到公式的开头和结尾(以激活数组上的公式)。
Chief Wiggum 提出的逗号“,”和“If”语句不适用于 Excel Home and Student 2013。需要分号“;” 以及全盖“IF”成功了。语法差异很小,但我花了 1.5 小时才弄清楚为什么会出现错误和#VALUE。
把我的帽子扔进戒指:
1) 首先我们对一组整数执行 NOT 函数,将非零值评估为 0,将零值评估为 1
2)然后我们在原始整数集中搜索 MAX
3) 然后我们将步骤 1 中生成的集合中的每个数字乘以步骤 2 中找到的 MAX,将 1 设置为 0,将 0 设置为 MAX
4)然后我们将步骤3中生成的集合添加到我们的原始集合中
5) 最后,我们在步骤 4 中生成的集合中寻找 MIN
{=MIN((NOT(A1:A5000)* MAX(A1:A5000))+ A1:A5000)}
如果您知道数字的粗略范围,则可以将 MAX(RANGE) 替换为常数。这稍微加快了速度,仍然不足以与更快的功能竞争。
还对 5000 个整数的数据集进行了快速测试,公式执行了 5000 次。
{=SMALL(A1:A5000,COUNTIF(A1:A5000,0)+1)}
1.700859 秒已过去 | 5,301,902 个刻度已过去
{=SMALL(A1:A5000,INDEX(FREQUENCY(A1:A5000,0),1)+1)}
1.935807 秒过去 | 6,034,279 个刻度已过去
{=MIN((NOT(A1:A5000)* MAX(A1:A5000))+ A1:A5000)}
3.127774 秒经过 | 9,749,865 个刻度已过去
{=MIN(If(A1:A5000>0,A1:A5000))}
3.287850 秒经过 | 10,248,852 个刻度已过去
{"=MIN(((A1:A5000=0)* MAX(A1:A5000))+ A1:A5000)"}
3.328824 秒经过 | 10,376,576 个刻度已过去
{=MIN(IF(A1:A5000=0,MAX(A1:A5000),A1:A5000))}
3.394730 秒已过去 | 10,582,017 个刻度已过去
min() 函数不包括 BOOLEAN 和 STRING 值。如果你用“”(空字符串)替换你的零 - min() 函数将按照你的意愿完成它的工作!
在 Microsoft 365 中,您可以使用新功能 MINIFS
=MINIFS(A1:E1;A1:E1;">0")
给 1
=MINIFS(A1:E1;A1:E1;">1")
给 18
*代替 ; ,如果使用英文版
您所要做的就是删除包含它的单元格中的“0”,然后重试。那应该行得通。