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

我把这个excel表格的快照如下。

DEF 1 2 3 =? 67 a 4 45 b 5 12 c 6 3 d 

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

试试这个数组公式:

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

这是使用Ctrl + Shift + Enter在D3中input的

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

在某些时候,常规的Excel公式会变得难以pipe理和/或难以理解,因为它们变得越来越复杂,所以有时最好学习如何在VBA中编写代码。

看看下面的function:

 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 

将该代码inputExcel Visual Basic编辑器将允许您使用公式:

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

在你的单元格中,获取你之后的信息。 参数是:

  • 查找列,保存你想检查的值。
  • 数据列,保存你想要返回的值。
  • 开始行,和
  • search结束行。
  • 你想要得到最接近的数据。

VBA用于用户定义的function的使用允许任意复杂的代码,同时仍然是可读的。