有没有一种方法可以从表中查找最接近的数字。
示例-我有以下一组数字
Column 1 Column 2
€ 1,187,385 € 19,547.82
€ 949,430 € 30,404.75
€ 935,216 € 19,704.01
€ 907,508 € 28,912.47
€ 865,841 € 21,698.54
€ 844,429 € 26,468.55
€ 741,769 € 26,687.78
€ 729,647 € 28,750.40
€ 711,840 € 11,909.60
€ 690,197 € 22,172.20
€ 659,998 € 15,919.33
€ 657,956 € 9,134.46
€ 648,282 € 13,700
€ 634,949 € 7,802
€ 631,214 € 6,407
我的查询值为730,000-因为这不是100%匹配-是否有办法找到与该数字(730,00)最接近的匹配-意识到它是729,647,然后告诉excel显示第2列中的数字(28,780.40)
更多示例:
如果我在A列中搜索数字,结果将如下所示。
€ 730,000 € 26,687.78
€ 1,239,636 € 19,547.82
€ 693,365 € 22,172.20
€ 631,283 € 6,407
具有完全匹配的Vlookup
答案 0 :(得分:0)
您可以使用:
Option Explicit
Sub test()
Dim i As Long, j As Long, LastRowA As Long, LastRowD As Long
Dim Value As Long
Dim Differ As Long
Dim Result As Double
With ThisWorkbook.Worksheets("Sheet1")
LastRowA = .Cells(.Rows.Count, "A").End(xlUp).Row
LastRowD = .Cells(.Rows.Count, "D").End(xlUp).Row
Differ = 0
For i = 2 To LastRowD
Value = .Range("D" & i).Value
For j = 2 To LastRowA
If j = 2 Then
Differ = Abs(Value - .Range("A" & j).Value)
Result = .Range("B" & j).Value
Else
If Abs(Value - .Range("A" & j).Value) < Differ Then
Differ = Abs(Value - .Range("A" & j).Value)
Result = .Range("B" & j).Value
End If
End If
Next j
.Range("E" & i).Value = Result
Next i
End With
End Sub
结果:
答案 1 :(得分:0)
此公式应该起作用:
=IF(LOOKUPVAL>MAX(COLUMN1),FIRSTVAL,INDEX(COLUMN2,IF(ABS(LOOKUPVAL-INDEX(COLUMN1,MATCH(LOOKUPVAL,COLUMN1,-1)))<ABS(LOOKUPVAL-INDEX(COLUMN1,MATCH(LOOKUPVAL,COLUMN1,-1)+1)),MATCH(LOOKUPVAL,COLUMN1,-1),MATCH(LOOKUPVAL,COLUMN1,-1)+1)))
其中COLUMN1
和COLUMN2
是与您的查询表相对应的范围(已将€和空格编辑为纯数字),FIRSTVAL
是第一个列2中的值,而LOOKUPVAL
是您要查找的值的范围。
工作原理
A 。您可以使用以下方法在第1列中找到大于LOOKUPVAL
的最小值的索引:
=MATCH(LOOKUPVAL,COLUMN1,-1)
由于您的值按降序排序,因此我们使用-1
第三个参数。为了方便起见,我们将其称为 INDEX1 。
B 。由于您的值按降序排列,因此第1列中的下一个值将小于LOOKUPVAL
。我们可以通过以下方式获取它的索引:
=INDEX1+1
我们将其称为 INDEX2 。
C 。我们可以查找与这两个索引关联的值:
=INDEX(COLUMN1,INDEX1)
=INDEX(COLUMN1,INDEX2)
我们分别称为 VALUE1 和 VALUE2 。
D 。我们从 VALUE1 和 VALUE2 中的每一个获取LOOKUPVAL
的距离
=ABS(LOOKUPVAL-VALUE1)
=ABS(LOOKUPVAL-VALUE2)
我们将它们分别称为 DISTANCE1 和 DISTANCE2 。
E 。我们根据 DISTANCE1 和 DISTANCE2 中哪个较小来获得所需的索引:
=IF(DISTANCE1<DISTANCE2,INDEX1,INDEX2)
我们将其称为 DESIREDINDEX 。
F 。最后,我们查找所需的第2列值:
=INDEX(COLUMN2,DESIREDINDEX)
G 。要在此答案的顶部获得冗长而繁琐的公式,请从底部开始,然后后替换。
H 。最后一步,我们需要保护MATCH
函数在尝试查找比第1列中的任何数字都大的数字时避免错误。为此,我们将整个内容包装在IF
中:
=IF(LOOKUPVAL>MAX(COLUMN1),FIRSTVAL,Proceed as described above)
希望有帮助
答案 2 :(得分:0)