我有一个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
答案 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)