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

如何使用Excel工作表函数查找值最接近的单元格,excel,excel-formula,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中的任何字母分

我对这张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中加入哪些函数才能执行此操作?

尝试以下数组公式:

=索引(F$3:F$6,匹配(最小值(ABS(20-E$3:E$6)),ABS(20-E$3:E$6),0))


这是使用Ctrl+Shift+Enter在D3中输入的。

我将向您展示一种稍微不同的方法,即如何创建用户定义函数(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
在你的牢房里,获取你想要的信息。理由如下:

  • 查找列,其中包含要检查的值
  • 数据列,包含要返回的值
  • 起始行,以及
  • 用于搜索的结束行
  • 要获取最接近的数据

在用户定义函数中使用VBA允许编写任意复杂的代码,同时仍具有可读性。

列E中的值是否始终按降序排列(从最大值到最小值)?@Jerry,不一定按降序排列(这是一个随机列表)非常好+1.你只差一分钟就得到了几乎相同的答案。@Yars你需要以数组公式的形式输入它。这是普遍接受的,因此Excel公式是一种编程形式,这是一种观点,@chris,这不一定是我的观点:-)可能是这样的,但仍然需要说公式Q是可以的:)这里的许多人都认为Excel公式属于超级用户。在Excel社区中,公式不被接受为编程,大多数Excel论坛将公式和编程(VBA)问题分为不同的区域
=paxLookup("e","f",3,6,20)