VBA 找到最接近值的单元格

VBA find cell of closest value

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

12123    51212
12123.5  45832
12124    37656
12124.5  32987
12125    42445

依此类推,其中A列始终增加0.5,B列有一定的输出。

现在我在单元格 E2 中有一个特定值,比如 12124,23,我想要一个 VBA 代码到 return,在这种情况下,最佳匹配值在单元格A3中,因为我在进一步的代码中需要这个单元格位置,我不需要B列中的相应值。我不知道如何开始, 然而。该文件最多可包含 30000 行。

我只想知道先用什么方法,当然我会尝试自己写代码:)

合资企业

您需要先排序 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

您可以为此使用 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 没有找到准确的值,它将 return 最接近的匹配项。

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

希望对您有所帮助。

您不必使用 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()

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

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