如何使Excel只考虑具有给定值的行

这是一张图片,随后是数据的描述 在这里输入图像说明

专栏描述:

  • 列A(键)严格增加小数点的顺序
  • 列B(组)代表A中的值所属的组。
  • 列C(数据)是各种数据

input(在F栏)

  • F4中ie {1,2,3,4}中的确切组号
  • 十进制值(不受限制),在F5中称为DecimalValue

任务

查找属于给定Group ,其中ABS( KeyDecimalValue )值被最小化。 从该行返回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_lookupcol_b_lookup指定的值,我相信你想要更改Msgbox。 但这应该可以帮助你。