Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 通过查找找到最近的号码?_Excel_Excel Formula - Fatal编程技术网

Excel 通过查找找到最近的号码?

Excel 通过查找找到最近的号码?,excel,excel-formula,Excel,Excel Formula,有没有办法从表格中找到最接近的数字 示例-我有以下一组数字 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

有没有办法从表格中找到最接近的数字

示例-我有以下一组数字

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 
我有一个查找值730000-因为这不是100%匹配-有没有办法找到与该数字最接近的匹配(730,00)-意识到它是729647&然后告诉excel在第2列显示该数字(28780.40)

还有几个例子:

如果我搜索A列中的数字,结果如下

 € 730,000   € 26,687.78 
 € 1,239,636     € 19,547.82 
 € 693,365   € 22,172.20 
 € 631,283   € 6,407 
Vlookup与真匹配

您可以使用:

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
选项显式
子测试()
我长,j长,LastRowA长,LastRowD长
模糊值等于长
只要不同就不同
结果是双倍的
使用此工作簿。工作表(“表1”)
LastRowA=.Cells(.Rows.Count,“A”).End(xlUp).Row
LastRowD=.Cells(.Rows.Count,“D”).End(xlUp).Row
差=0
对于i=2到最后一行
值=.Range(“D”&i).Value
对于j=2到最后一行a
如果j=2,则
差异=绝对值(值-.范围(“A”&j).值)
结果=.Range(“B”&j).Value
其他的
如果Abs(值-.范围(“A”&j.值)<不同,则
差异=绝对值(值-.范围(“A”&j).值)
结果=.Range(“B”&j).Value
如果结束
如果结束
下一个j
.范围(“E”和i).值=结果
接下来我
以
端接头
结果:


这个公式应该适用于:

=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)))
由于您的值是按降序排序的,因此我们使用
-1
第三个参数。为方便起见,我们将其称为INDEX1

B。由于您的值是按降序排列的,因此第1列中的下一个值将小于
LOOKUPVAL
。我们可以通过以下方式获取其索引:

=INDEX1+1
我们将其称为INDEX2

C。我们可以查找与这两个索引相关的值:

=INDEX(COLUMN1,INDEX1)
=INDEX(COLUMN1,INDEX2)
我们将分别称之为VALUE1VALUE2

D。我们通过以下公式得到
LOOKUPVAL
VALUE1VALUE2之间的距离

=ABS(LOOKUPVAL-VALUE1)
=ABS(LOOKUPVAL-VALUE2)
我们将分别称之为距离1距离2

E。我们根据距离1距离2中较小的一个来获得所需的指数:

=IF(DISTANCE1<DISTANCE2,INDEX1,INDEX2)
G。要在这个答案的顶部得到冗长而繁琐的公式,你需要从底部开始,然后再从后面替换

H。作为最后一步,我们需要保护
MATCH
函数在查找大于第1列中任何数字时不出错。要做到这一点,我们将整个内容包装在
IF
中:

=IF(LOOKUPVAL>MAX(COLUMN1),FIRSTVAL,Proceed as described above)

希望有帮助

另一个可能的解决方案是这样的ARRAY-FORMULA CTRL+SHIFT+ENTER

这只是查找
lookupvalue
与数据之间的最小绝对差值

=INDEX(COLUMN2,DESIREDINDEX)
=IF(LOOKUPVAL>MAX(COLUMN1),FIRSTVAL,Proceed as described above)
=IFERROR(VLOOKUP(C1+MIN(ABS(C1-$A$1:$A$15)),$A$1:$B$15,2,0),VLOOKUP(C1-MIN(ABS(C1-$A$1:$A$15)),$A$1:$B$15,2,0))