【问题标题】:VBA find cell of closest valueVBA找到最接近值的单元格
【发布时间】:2015-03-20 13:00:12
【问题描述】:

我有一个看起来像这样的 excel 文件:

12123    51212
12123.5  45832
12124    37656
12124.5  32987
12125    42445

以此类推,其中A列总是0.5递增,B列有一定的输出。

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

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

合资

【问题讨论】:

  • 它工作正常吗?如果是,请在否决票下方打勾验证答案,以便我们关闭主题。如果不是,我们将帮助您解决问题。
  • 谢谢,我修好了。我验证了两个对我有帮助的答案。

标签: vba find cell closest


【解决方案1】:

您不必使用 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 代码。
  • @024pr 有用吗?你的问题解决了吗?如果是,请验证答案以关闭主题!
【解决方案2】:

您可以为此使用 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 列中的值按升序排序时才有效。

希望这会有所帮助。

【讨论】:

  • 我澄清了我的描述,我正在寻找一个返回包含最近值的单元格位置的 VBA 代码。
【解决方案3】:

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

【讨论】:

  • 我澄清了我的描述,我正在寻找一个返回包含最近值的单元格位置的 VBA 代码。
【解决方案4】:

您不需要 VBA,调用 VLOOKUP Excel 函数即可解决问题;记得将最后一个参数设置为true,以找到与搜索值不完全匹配的值

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

【讨论】:

  • 我澄清了我的描述,我正在寻找一个返回包含最近值的单元格位置的 VBA 代码。
猜你喜欢
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 2023-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多