如何在不排序的情况下找到下一个最小/最大值?


1

我有一个表,我需要从中获取相对于单独表中的值的下一个最大和/或最小值。但是,我还需要允许第一个表按任何条件排序,而不会影响查找的准确性。

我已经搜索并阅读了使用VLOOKUP,LOOKUP,HLOOKUP和MATCH查找次大/次最小值的各种方法,但我发现的所有内容似乎都要求源列按升序/降序排序,具体取决于是否你想要下一个最小/最大的值。当我希望能够同时使用两者时,或者我希望能够在不破坏公式的情况下对表进行排序时,这会中断功能。

有没有办法对Excel中的下一个最大/次最小值进行排序不敏感搜索?

首选解决方案将专门使用本机Excel函数,因为我目前不熟悉VBScript,并且目前不能安装第三方工具。解决方案还必须与Excel 2010 2013 兼容。


1
MIN(A1..A1000)和MAX(B2..B2000)是有效的功能
cybernard 2014年

您可能不熟悉VBScript,但我们中的一些人(包括我)有能力并且可以为您编写脚本。感兴趣吗?
cybernard 2014年

@cybernard如果这真的是唯一或最好的方式,我很感兴趣。如果使用原生Excel函数有一个相对简单的方法,我宁愿这样做。第三方工具仍然不受限制。
Iszi 2014年

仅供参考:我知道你坚持使用excel但是在一个完美的世界中你会使用数据库。将查询写入您想要的数据是最佳答案。例如:select * from table1,table2 where table1.column1> table2.column2;
cybernard 2014年

1
这仅在日期和时间存在时才有效。使用空白列并将其完全复制并粘贴。= IF(B3> NOW(),B3,“”) 我将其称为列T.然后在“next up”字段中输入。** = MIN(T1:T1000)
游戏2014年

Answers:


1

拟议结果

在此输入图像描述

在ARRAY公式中使用IF和SMALL

如果图片中显示的结果是您要查找的内容,则查找下一个更大的公式如下所示:
=SMALL(IF(Relative[Value]>[@Value];Relative[Value];99999999999);1)

说明

  • Relative[Value]>[@Value]返回一个TRUE或的数组FALSE
  • IF(Relative[Value]>[@Value];Relative[Value];99999999999)然后返回相对表中较大的值,对于那些不相关的值,它返回一些超出范围的巨大值。选择一个永远不会出现在您的数据中的人。或者,您可以使用0FALSES的值,也可以使用错误值。
  • 然后我们只使用SMALL带参数的函数k=1从Bigger值中找到第一个最小值。
  • 它是一个数组公式,因此请使用CTRL + SHIFT + ENTER输入公式。

链接:


0

如果您的号码是唯一的,这将有效:

下一个最小:

=SMALL(YourRange,RANK.EQ(YourValue,YourRange,1)+1)

下一个最大:

=SMALL(YourRange,RANK.EQ(YourValue,YourRange,1)-1)

如果它们不是,那么您可以使用数组公式或帮助列进行更复杂的操作。您还需要决定如何处理重复数字(返回相同或不同的值),您可以切换到使用LARGE和更改排序顺序RANK

不过,这应该给你一个起点。


你能再描述一下语法吗?根据Excel的SMALL帮助文件中的信息,我很难理解它。
Iszi 2014年

经过一些搜索后,该RANK.EQ组件似乎是PowerPivot中数据分析表达式的一部分 - 这是vanilla Excel 2010中不具备的功能(以及其他一些先决条件),仅适用于2013年的某些版本。这对我不起作用。
Iszi 2014年

1
你能在未排序的表中提供几个单元格的样本,然后在第二个表格中尝试相对值吗?
bvaughn 2016年

0

使用空白助手(邪恶)列并将其完全复制并粘贴。= IF(B3> NOW(),B3,“”)我将其称为列T.然后在“next up”字段中输入。** = MIN(T1:T1000)

作为这样的函数:

    Function Soonest(scolumn As String) As Date

'
'
Dim a, b
Dim test(20000) As Date
Dim Min As Date

b = 0

   For a = 1 To 20000
    If (IsEmpty(Range(scolumn & a))) Then
     GoTo SkipMe
    End If

     If (Range(scolumn & a).Value - Now() > 0) Then
     b = b + 1
     test(b) = Range(scolumn & a).Value
     End If
SkipMe:
  Next a

  If b = 0 Then
   Min = "None"
  GoTo NoneFound
  End If
  Min = test(1)
  For c = 1 To b
   If test(c) < Min Then Min = test(c)
  Next c
NoneFound:

Soonest = Min
End Function
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.