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, 真)
我有一个 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, 真)