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)