【问题标题】:How to find & return all non-zero values within an unknown range?如何查找并返回未知范围内的所有非零值?
【发布时间】:2017-02-01 02:32:42
【问题描述】:
=IF(ROWS(AA$38:AA38)>COUNTIF(U$38:U$1000,"<>0"),"",INDEX(U$38:U$1000,SMALL(IF(U$38:U$1000>0,ROW(U$38:U$1000)-ROW(U$38)+1),ROWS(AA$38:AA38))))

我正在尝试使用此公式查找并返回一列数据中的所有非零值(从第 38 行开始),但我不知道在导入数据之前会有多少行.我希望能够自动排序,但如果我使用 (U:U) 或选择比实际填充行数大得多的数字(例如U$38:U$20000),我会收到错误消息。

有没有办法:

a) 让 excel 自动将 (U$38:U$####) 更改为填充数据的行数? (即,如果有 400 行,它将更改为 (U$38:U$400)。)

b) 找到一个替代公式,可以在不知道行数的情况下挑选出所有非零值?

编辑:

如下图所示,我设置了我的电子表格,使其不仅返回非零值(来自 U 列),而且还返回它对应的时间(来自 AG 列)。问题是当我尝试增加范围时。

我将查看具有不同数据量的大量不同数据文件,因此我希望能够将其自动化 - 而不必在每次需要时都摆弄所有 U$38:U$1000更改范围。这有意义吗?

可以用 VBA 代替吗?

Example Data

【问题讨论】:

  • 我们可以使范围动态化,是的。为了达到最佳效果,了解表中某个范围的数据类型会很有用:例如,U 列中的条目是否总是数字?
  • 是的,它们是——但它们可能是正面的或负面的。
  • 条目是否都是连续的?还是在结束前的列中可能有空单元格?
  • 哦,你想用这些值做什么?
  • 不,结束前没有空单元格。

标签: excel sorting indexing countif


【解决方案1】:

在某列试试这个:

=IFERROR(INDEX($U:$U,SMALL(ROW(myRange)*(myRange<>0),SUMPRODUCT(N(myRange=0))+ROWS($1:1))),"")

这是一个数组公式,必须在按住ctrl + shift的同时按enter

来确认

在某个单元格中输入它。看看它是否返回所需的值,然后填写直到返回空白。

myRange 是大于最大行大小的任意范围。我用u38:u20000

编辑:要从与U 不同的列中的匹配行返回值,只需将INDEX 函数中的array 参数从$U:$U 更改为所需的列,例如:$AG:$AG

EDIT2:如果您需要忽略 U 列中的错误值,请尝试输入以下 CSE 公式:

=IFERROR(INDEX(U:U,SMALL(ROW(myRange)*(IFERROR(--myRange,0)<>0),SUMPRODUCT(N(IFERROR(--myRange,0)=0))+ROWS($1:1))),"")

【讨论】:

  • 我喜欢使用 N() 函数来覆盖空白和零。
  • 感谢您的帮助,但是当我尝试此操作时,它只返回空白,而不是我期望的值 - 我只是应该用任意范围替换 myRange 吗?
  • @jm00548 你定义了myRange 吗?如果没有,它将返回一个#NAME 错误,因此该函数将返回一个空白。您需要将其设置为某个范围,该范围通过绝对寻址指向比您预期更大的范围。例如。 =Sheet1!$U$38:$U$20000
  • @TomSharpe 谢谢。有时我会使用双一元来代替。不过,我不知道哪个更有效。但是关于使用N() 的问题比使用-- 的问题要少。此外,如果空格是空格或文本,则 N() 仍将返回零,而双一元将返回错误。
  • @Ron Rosenfeld 你的意思是用$U$38:$U$20000 替换每次出现的myRange
【解决方案2】:

这只是对现有公式的修复,使其在更广泛的范围内工作,允许负值并忽略空单元格,但(我怀疑)其他人可能会提出更有效的解决方案!

=IF(ROWS(AA$38:AA38)>COUNTIFS(U$38:U$10000,"<>0",U$38:U$10000,"<>"),"",INDEX(U$38:U$10000,SMALL(IF(U$38:U$10000<>0,ROW(U$38:U$10000)-ROW(U$38)+1),ROWS(AA$38:AA38))))

这可以通过使用名称管理器声明一个动态范围来提高效率:-

=Sheet1!$U$38:INDEX(Sheet1!$U$38:$U$10000,COUNT(Sheet1!$U$38:$U$10000))

并称它为(比如)DynamicRange。

那么公式就变成了:-

=IFERROR(INDEX(DynamicRange,SMALL(IF(DynamicRange<>0,ROW(DynamicRange )-ROW(INDEX( DynamicRange,1 ))+1 ),ROWS($1:1))),  "")

这些是数组公式,必须使用 CtrlShiftEnter

输入

【讨论】:

  • 感谢您的帮助,但当我尝试此操作时,它返回 #DIV/0! 错误。
  • 抱歉,我无法重现 #DIV/0!根据我的测试数据,您和@Ron 之间的 cmets 交换建议您的真实数据可能存在一些问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 2019-04-04
  • 1970-01-01
  • 2023-04-02
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多