Найти ближайший номер через поиск? - PullRequest
0 голосов
/ 06 ноября 2019

Есть ли способ найти ближайший номер из таблицы.

Пример - у меня есть следующий набор цифр

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)

Еще несколько примеров:

Если я поищу цифры в столбце А - результаты будут следующими:

 € 730,000   € 26,687.78 
 € 1,239,636     € 19,547.82 
 € 693,365   € 22,172.20 
 € 631,283   € 6,407 

Спасибо за продвинутый

Vlookup withистинное совпадение

Ответы [ 3 ]

0 голосов
/ 06 ноября 2019

Эта формула должна работать:

=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 . Мы получаем расстояния LOOKUPVAL от каждого из VALUE1 и VALUE2 по

=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)

Надеюсь, что поможет

0 голосов
/ 06 ноября 2019

Другим возможным решением будет это ФОРМУЛА Массива CTRL + SHIFT + ENTER

=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))

Thisпросто ищет самую низкую абсолютную разницу между lookupvalue и вашими данными.

enter image description here

0 голосов
/ 06 ноября 2019

Вы можете использовать:

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

Результаты:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...