VBA找到最接近值的单元格

时间:2015-03-20 13:00:12

标签: vba find cell closest

我有一个excel文件,如下所示:

12123    51212
12123.5  45832
12124    37656
12124.5  32987
12125    42445

等等,其中A列始终为0.5,而B列有一定的输出。

现在我在单元格E2中有一个特定的值,比如12124,23,我想要一个 VBA 代码返回,在这种情况下,最佳匹配值在单元格A3 < / strong>,因为我需要在进一步的代码中使用此单元格位置,我不需要列B中的相应值。但是,我不知道如何启动。该文件最大可达30000行。

我只想知道首先使用哪种方法,然后我会尝试自己编写代码:)

JV

4 个答案:

答案 0 :(得分:2)

您不必为您的问题使用VBA,Excel将完美地完成它!

试试这个

=vlookup(E2;A:A;2;true)

并且对于您要做的事情,您必须以升序方式对A列进行排序,否则您将收到错误!

如果你确实需要在VBA中,

一个简单的for + if结构,带有像这样的测试

    Function pr24(ByVal Value_To_Match As Double) As Range


For i = 2 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    If Cells(i, 1) > Value_To_Match Then
        If Abs(Cells(i - 1, 1) - Value_To_Match) >= Abs(Cells(i, 1) - Value_To_Match) Then
            pr24 = Range(Cells(i, 1))
        Else
            pr24 = Range(Cells(i - 1, 1))
        End If

        Exit For
    Else

    End If
Next i



End Function

或者您可以使用工作表函数Vlookup

Application.WorksheetFunction.VLOOKUP()

答案 1 :(得分:1)

您需要先在列A中排序您的数据(从最小到最大),然后您可以使用简单的查找公式:

=LOOKUP(E2,A:A)

如果您不想对数据进行排序,那么您可以像这样使用VBA循环 - 但效率非常低 - 您应该始终使用工作表公式:

Sub SO()

Dim resultCell      As Excel.Range
Dim checkCell       As Double
Dim bestDiff        As Double

checkCell = Range("E2").Value
bestDiff = checkCell

For i = 1 To Range("A" & Rows.count).End(xlUp).Row
    If Range("A" & i).Value <= checkCell Then
        If (checkCell - Range("A" & i).Value) < bestDiff Then
            bestDiff = checkCell - Range("A" & i)
            Set resultCell = Range("A" & i)
        End If
    End If
Next i

MsgBox "Best match is in " & resultCell.Address

Set resultCell = Nothing

End Sub

答案 2 :(得分:0)

您可以使用VLOOKUP功能: -

Application.WorksheetFunction.VLOOKUP(lookup_value, table_array, column_index, range_lookup)

将您的值设置如下: -

lookup_value = 12124.23
table_array = would be the range Ax:Bx containing your values
column_index = 2 (the second column of table_array)
range_lookup = true

将range_lookup设置为true意味着如果vlookup找不到确切的值,它将返回最接近的匹配。

请注意,这仅在A列中的值按升序排序时才有效。

希望这有帮助。

答案 3 :(得分:0)

你不需要VBA,一个调用co VLOOKUP Excel功能就可以了;记得将最后一个参数设置为true,以找到与搜索值不完全匹配的值

它应该类似于: = VLOOKUP(E2,A:B,2,true)