如何使Excel只考虑具有给定值的行
这是一张图片,随后是数据的描述
专栏描述:
- 列A(键)严格增加小数点的顺序
- 列B(组)代表A中的值所属的组。
- 列C(数据)是各种数据
input(在F栏)
- F4中ie {1,2,3,4}中的确切组号
- 十进制值(不受限制),在F5中称为
DecimalValue
任务
查找属于给定Group
,其中ABS( Key
– DecimalValue
)值被最小化。 从该行返回Data
。
- 理想的是寻找一个只有Excel的解决scheme,使用INDEX,VLOOKUP,ABS等等。
这个问题类似于我之前的问题,但是不同的(涉及一个新的Group
列),通过评论确定最好问一个新的问题,而不是尝试更新/修改现有的问题:
显示基于键最近的数字匹配的行值
如果可能的话,为“ Group
列添加更正是我所追求的,因此标题反映了这一问题。
(不完整的解决scheme – 不考虑Group
列)
=INDEX(C4:C33,MATCH(MIN(ABS(A4:A33-F5)),ABS(A4:A33-F5),0))
给这个去吧…它似乎在我的testing表上工作。 一定要调整范围,以适应你的情况。 再次,这是一个数组公式,需要用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)部分来工作。 所以只有密钥有效的组才有一些号码用来匹配数据列。
希望有助于解释它。 您还可以使用“公式”工具栏上的“评估公式”function来查看它的实际运行情况。
注意 – 如果使用0作为最接近的值(不pipe组select),它似乎返回第一个数据值。 不知道如何解决这个问题
这里是sous2817的答案调整,以避免input0时得到错误的结果的问题:
=INDEX(Data,MATCH(MIN(IFERROR(ABS(IF(GroupNo=Group,1," ")*Key-DecimalValue), " ")),IFERROR(ABS(IF(GroupNo=Group,1," ")*Key-DecimalValue)," "),0))
它是如何工作的解释是一样的。 通过用错误replace零来避免该问题。
请注意, Key
是关键列, GroupNo
是组编号列, Data
是数据列, Group
是用于search的指定组, DecimalNumber
是为searchinput的编号。
编辑:正如在下面的评论中所讨论的,这个公式可以通过使用一个命名的范围(AKA命名公式)更可读。 设置一个命名范围searchRange
等于:
IFERROR(ABS(IF(GroupNo=Group,1," ")*Key-DecimalValue)," ")
然后公式变成:
=INDEX(Data,MATCH(MIN(searchRange),searchRange,0))
这还有一个好处,就是Excel的开销较小,因为指定的公式只计算一次(而在另一个版本中,每次计算时都会计算)。
你应该能够做到如下
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。 但这应该可以帮助你。