VBA найти ячейку ближайшего значения

У меня есть файл Excel, который выглядит так:

12123    51212
12123.5  45832
12124    37656
12124.5  32987
12125    42445

и так далее, где столбец A всегда увеличивается на 0,5, а столбец B имеет определенный выход.

Теперь у меня есть определенное значение в ячейке E2, скажем 12124,23, и я хочу, чтобы в этом случае код VBA возвращал, что наилучшее совпадающее значение находится в ячейке A3, потому что мне нужно это расположение ячейки в следующем коде, я не Мне не нужно соответствующее значение в столбце B. Однако я не знаю, с чего начать. Файл может быть до 30000 строк.

Я только хотел бы знать сначала, какой метод использовать, затем я, конечно, постараюсь написать код:)

СП

4 ответа

Решение

Вам не нужно использовать VBA для вашей проблемы, Excel сделает это отлично!

Попробуй это

=vlookup(E2;A:A;2;true)

и для того, что вы пытаетесь сделать, вам нужно отсортировать столбец A по возрастанию, иначе вы получите ошибку!

И если вам это нужно в VBA,

простая для + если структура с таким тестом

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

Сначала вам нужно отсортировать данные в столбце 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 не найдет точное значение, он вернет наиболее близкое совпадение.

Обратите внимание, что это будет работать только в том случае, если значения в столбце A отсортированы в порядке возрастания.

Надеюсь это поможет.

Вам не нужен VBA, функция вызова совместно с VLOOKUP Excel сделает свое дело; не забудьте установить последний параметр в true, чтобы найти не точное совпадение с искомым значением

Это должно быть похоже на: = VLOOKUP(E2, A:B, 2, true)

Другие вопросы по тегам