通过查找找到最接近的数字?

时间:2019-11-06 14:12:09

标签: excel excel-formula

有没有一种方法可以从表中查找最接近的数字。

示例-我有以下一组数字

Column 1    Column 2
 € 1,187,385     € 19,547.82 
 € 949,430   € 30,404.75 
 € 935,216   € 19,704.01 
 € 907,508   € 28,912.47 
 € 865,841   € 21,698.54 
 € 844,429   € 26,468.55 
 € 741,769   € 26,687.78 
 € 729,647   € 28,750.40 
 € 711,840   € 11,909.60 
 € 690,197   € 22,172.20 
 € 659,998   € 15,919.33 
 € 657,956   € 9,134.46 
 € 648,282   € 13,700 
 € 634,949   € 7,802 
 € 631,214   € 6,407 

我的查询值为730,000-因为这不是100%匹配-是否有办法找到与该数字(730,00)最接近的匹配-意识到它是729,647,然后告诉excel显示第2列中的数字(28,780.40)

更多示例:

如果我在A列中搜索数字,结果将如下所示。

 € 730,000   € 26,687.78 
 € 1,239,636     € 19,547.82 
 € 693,365   € 22,172.20 
 € 631,283   € 6,407 

具有完全匹配的Vlookup

3 个答案:

答案 0 :(得分:0)

您可以使用:

Option Explicit

Sub test()

    Dim i As Long, j As Long, LastRowA As Long, LastRowD As Long
    Dim Value As Long
    Dim Differ As Long
    Dim Result As Double

    With ThisWorkbook.Worksheets("Sheet1")

        LastRowA = .Cells(.Rows.Count, "A").End(xlUp).Row
        LastRowD = .Cells(.Rows.Count, "D").End(xlUp).Row
        Differ = 0

        For i = 2 To LastRowD

            Value = .Range("D" & i).Value

            For j = 2 To LastRowA

                If j = 2 Then
                    Differ = Abs(Value - .Range("A" & j).Value)
                    Result = .Range("B" & j).Value
                Else
                    If Abs(Value - .Range("A" & j).Value) < Differ Then
                        Differ = Abs(Value - .Range("A" & j).Value)
                        Result = .Range("B" & j).Value
                    End If
                End If

            Next j

            .Range("E" & i).Value = Result

        Next i

    End With

End Sub

结果:

enter image description here

答案 1 :(得分:0)

此公式应该起作用:

=IF(LOOKUPVAL>MAX(COLUMN1),FIRSTVAL,INDEX(COLUMN2,IF(ABS(LOOKUPVAL-INDEX(COLUMN1,MATCH(LOOKUPVAL,COLUMN1,-1)))<ABS(LOOKUPVAL-INDEX(COLUMN1,MATCH(LOOKUPVAL,COLUMN1,-1)+1)),MATCH(LOOKUPVAL,COLUMN1,-1),MATCH(LOOKUPVAL,COLUMN1,-1)+1)))

其中COLUMN1COLUMN2是与您的查询表相对应的范围(已将€和空格编辑为纯数字),FIRSTVAL是第一个列2中的值,而LOOKUPVAL是您要查找的值的范围。

工作原理

A 。您可以使用以下方法在第1列中找到大于LOOKUPVAL的最小值的索引:

=MATCH(LOOKUPVAL,COLUMN1,-1)

由于您的值按降序排序,因此我们使用-1第三个参数。为了方便起见,我们将其称为 INDEX1

B 。由于您的值按降序排列,因此第1列中的下一个值将小于LOOKUPVAL。我们可以通过以下方式获取它的索引:

=INDEX1+1

我们将其称为 INDEX2

C 。我们可以查找与这两个索引关联的值:

=INDEX(COLUMN1,INDEX1)
=INDEX(COLUMN1,INDEX2)

我们分别称为 VALUE1 VALUE2

D 。我们从 VALUE1 VALUE2 中的每一个获取LOOKUPVAL的距离

=ABS(LOOKUPVAL-VALUE1)
=ABS(LOOKUPVAL-VALUE2)

我们将它们分别称为 DISTANCE1 DISTANCE2

E 。我们根据 DISTANCE1 DISTANCE2 中哪个较小来获得所需的索引:

=IF(DISTANCE1<DISTANCE2,INDEX1,INDEX2)

我们将其称为 DESIREDINDEX

F 。最后,我们查找所需的第2列值:

=INDEX(COLUMN2,DESIREDINDEX)

G 。要在此答案的顶部获得冗长而繁琐的公式,请从底部开始,然后后替换

H 。最后一步,我们需要保护MATCH函数在尝试查找比第1列中的任何数字都大的数字时避免错误。为此,我们将整个内容包装在IF中:

=IF(LOOKUPVAL>MAX(COLUMN1),FIRSTVAL,Proceed as described above)

希望有帮助

答案 2 :(得分:0)

另一个可能的解决方案是 ARRAY FORMULA CTRL + SHIFT + ENTER

=IFERROR(VLOOKUP(C1+MIN(ABS(C1-$A$1:$A$15)),$A$1:$B$15,2,0),VLOOKUP(C1-MIN(ABS(C1-$A$1:$A$15)),$A$1:$B$15,2,0))

这只是寻找lookupvalue与您的数据之间的最小绝对差。

enter image description here