如何使用Excel工作表函数查找具有最接近值的单元格

时间:2014-11-26 05:57:13

标签: excel excel-formula

我拍摄了这张excel表的快照,如下所示。

          D             E           F
1         
2
3         =?            67           a
4                       45           b 
5                       12           c
6                        3           d

我想根据以下规则将a,b,c或d中的任何字母分配给D3。
首先,我必须从E3到E6的项目中得到最接近20的数字。在这种情况下E5(12)。
然后,搜索第一步中获得的结果右侧的下一个单元格,以获得字母值 c
我的问题是,我必须在D3中执行哪些功能来执行此操作?

2 个答案:

答案 0 :(得分:3)

试试这个数组公式:

=INDEX(F$3:F$6,MATCH(MIN(ABS(20-E$3:E$6)),ABS(20-E$3:E$6),0))

使用 Ctrl + Shift + 输入在D3中输入。

答案 1 :(得分:0)

我将向您展示一种稍微不同的方法,如何创建用户定义的函数(UDF)来执行此操作。在这种情况下,它可能不是严格要求,但知道这个过程非常有用。

在某个时刻,常规Excel公式可能变得难以管理和/或不可读,因为它们变得更加复杂,因此有时建议学习如何在VBA中编码。

看看以下功能:

Option Explicit

Public Function getVal(c As String, r As Integer)
    getVal = Range(c & CStr(r)).Value
End Function

Public Function paxLookup( _
    lkupCol As String, _
    dataCol As String, _
    sRow As Integer, _
    eRow As Integer, _
    data As Integer _
) As String
    Dim diff As Integer
    Dim newdiff As Integer

    ' Invalid range means no data. '

    paxLookup = ""
    If eRow < sRow Then Exit Function

    ' First row is initial best. '

    diff = Abs(data - getVal(lkupCol, sRow))
    paxLookup = Range(dataCol & CStr(sRow)).Value
    sRow = sRow + 1

    ' Check all rows, getting better ones. '

    While sRow <= eRow
        newdiff = Abs(data - getVal(lkupCol, sRow))
        If newdiff < diff Then
            diff = newdiff
            paxLookup = getVal(dataCol, sRow)
        End If
        sRow = sRow + 1
    Wend
End Function

将该代码输入Excel Visual Basic编辑器将允许您使用以下公式:

=paxLookup("e","f",3,6,20)

在您的单元格中,获取您之后的信息。论点是:

  • 查找列,包含您要检查的值。
  • 数据列,保存您想要返回的值。
  • 开始行,
  • 搜索的结束行。
  • 您想要最接近的数据。

将VBA用于用户定义的函数允许任意复杂的代码,同时仍然可读。