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