这是一张图片,然后是数据描述
列说明:
输入(在F栏中)
DecimalValue
任务
查找属于给定Group
的行,其中ABS(Key
- DecimalValue
)值最小化。从该行返回Data
。
此问题与我之前的问题类似,但不同(涉及新的Group
列),通过评论确定最好提出新问题,而不是尝试更新/修改现有问题:
Display Row Values based on Nearest Numeric Match of Key
为Group
列添加更正,如果有可能就是我所追求的,因此标题反映了这一点。
(不完整的解决方案 - 不考虑Group
列)
=INDEX(C4:C33,MATCH(MIN(ABS(A4:A33-F5)),ABS(A4:A33-F5),0))
答案 0 :(得分:2)
给它一个...它似乎在我的测试表上工作。务必根据您的情况调整范围。同样,这是一个数组公式,需要使用Ctrl + Shift + Enter确认:
=INDEX(C2:C7,MATCH(MIN(ABS((B2:B7=F4)*A2:A7-F5)),ABS((B2:B7=F4)*A2:A7-F5),0),0)
通过将与您的组分配不匹配的键(即(B2:B7 = F4)* A2:A7-F5)部分归零来工作。因此,只有具有有效组的密钥才能使用一些数字来匹配数据列。
希望有助于解释它。您还可以使用“公式”工具栏上的“评估公式”功能查看其运行情况。
注意 - 如果将0用作最接近的值(无论组选择如何),它似乎返回第1个数据值。不知道如何解决这个问题......
答案 1 :(得分:2)
这是sous2817的答案调整,以避免输入0时得到错误结果的问题:
=INDEX(Data,MATCH(MIN(IFERROR(ABS(IF(GroupNo=Group,1," ")*Key-DecimalValue),
" ")),IFERROR(ABS(IF(GroupNo=Group,1," ")*Key-DecimalValue)," "),0))
它的工作原理的解释是一样的。通过用错误替换零来避免该问题。
请注意,Key
是关键列,GroupNo
是组号列,Data
是数据列,Group
是指定的搜索组,{ {1}}是为搜索而输入的数字。
编辑:正如下面的评论中所讨论的,通过使用命名范围(AKA命名公式),可以使该公式更具可读性。将命名范围DecimalNumber
设置为等于:
searchRange
然后公式变为:
IFERROR(ABS(IF(GroupNo=Group,1," ")*Key-DecimalValue)," ")
这样可以减少Excel开销,因为命名公式只计算一次(而在另一个版本中,每次出现时都会计算)。
答案 2 :(得分:0)
你应该能够做到如下
Function getLastRow()
Dim i As Integer
Dim l_row As Integer
For i = 1 To 35
If Sheet1.Cells(Rows.Count, i).End(xlUp).Row > l_row Then
l_row = Sheet1.Cells(Rows.Count, i).End(xlUp).Row
End If
Next i
getLastRow = l_row
End Function
Sub data_lookup
Dim last_row As Integer
Dim lcell as Range
Dim col_a_lookup As Double
Dim col_b_lookup AS Double
Dim row_collection As New Collection
Dim variance AS Double
Dim closest_row AS Integer
col_b_lookup = 0.04
col_a_lookup = 8
variance = 50
last_row = getLastRow
'Find All the Cells that match your lookup value for column B
For Each lcell in Sheet1.Range("$B$2", "$B$" & last_row)
If lcell.value = col_b_lookup Then
row_collection.Add lcell
End If
Next lcell
'Loop through the collection created above to find the closest absolute value to
'your lookup value for Column A
For Each lcell in row_collection
If Abs(Sheet1.Cells(lcell.row,"A") - col_a_lookup) < variance then
variance = Abs(Sheet1.Cells(lcell.row,"A") - col_a_lookup)
closest_row = lcell.row
End If
Next lcell
'Return Results
If closest_row > 0 Then
Msgbox "Closest Data: " & Sheet1.Cells(closest_row,"G")
Else
Msgbox "Cannot Locate"
End If
End Sub
显然,您必须将col_a_lookup
和col_b_lookup
设置为指定的值,并且我确定您要更改Msgbox。但这应该会帮助你。