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

时间:2014-04-30 14:35:49

标签: excel vba excel-formula vlookup

这是一张图片,然后是数据描述 enter image description here

列说明:

  • A列(Key)是严格增加的小数序列​​
  • B列(组)表示A中的值所属的组。
  • C列(数据)是分类数据

输入(在F栏中)

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

任务

查找属于给定Group的行,其中ABS(Key - DecimalValue)值最小化。从该行返回Data

  • 理想情况下,使用INDEX,VLOOKUP寻找仅限Excel的解决方案, ABS等。

此问题与我之前的问题类似,但不同(涉及新的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))

3 个答案:

答案 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_lookupcol_b_lookup设置为指定的值,并且我确定您要更改Msgbox。但这应该会帮助你。