Ну, то, что выглядит как довольно простой вопрос, на самом деле было довольно сложно, потому что вы сталкиваетесь с ошибками округления, когда вычисляете различия, которые могут привести к неправильному ответу. В итоге я произвольно округлил результаты до 10 знаков после запятой, прежде чем сравнивать их, чтобы обойти это, но это не выглядит элегантной формулой:
=MIN(IF((ROUND(ABS(ROUND(A2:INDEX(A:A,COUNTA(A:A)),0)-A2:INDEX(A:A,COUNTA(A:A))),10)=MIN(ROUND(ABS(ROUND(A2:INDEX(A:A,COUNTA(A:A)),0)-A2:INDEX(A:A,COUNTA(A:A))),10))),A2:INDEX(A:A,COUNTA(A:A))))
Должен быть введен как формула массива, используя Ctrl Сдвиг Ввод
Предполагается, что в данных нет пробелов (которые отбрасывают Counta, а также дают нулевой результат для минимальной разницы).
РЕДАКТИРОВАТЬ
Это только эксперимент, чтобы увидеть, если вы получите правильный ответ, используя десятичные типы
Option Explicit
Option Base 1
Sub findClosestToInt()
Dim sht As Worksheet
Dim LastRow As Long, nRows As Long, nData As Long, nMins As Long
Dim i As Long
Dim data() As Variant, differences() As Variant, minData() As Variant
Dim minDiff As Variant, minValue As Variant, maxData As Variant
Set sht = ActiveSheet
LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row
Debug.Print ("LR=" & LastRow)
nRows = LastRow - 1
ReDim data(LastRow - 1)
ReDim differences(LastRow - 1)
' store data as decimal
nData = 0
For i = 2 To LastRow
If sht.Cells(i, 1) <> "" Then
nData = nData + 1
data(nData) = CDec(sht.Cells(i, 1))
End If
Next i
ReDim Preserve data(nData)
ReDim differences(nData)
Debug.Print ("nData=" & nData)
' find differences from nearest integer
For i = 1 To nData
differences(i) = Abs(data(i) - Round(data(i), 0))
Debug.Print (differences(i)) ' no rounding errors
Next i
minDiff = Application.WorksheetFunction.Min(differences)
Debug.Print ("minDiff=" & minDiff)
ReDim minData(nData)
' find min of data where difference is equal to min difference
nMins = 0
For i = 1 To nData
If differences(i) = minDiff Then
nMins = nMins + 1
minData(nMins) = data(i)
End If
Next i
ReDim Preserve minData(nMins)
minValue = Application.WorksheetFunction.Min(minData)
Debug.Print ("minValue=" & minValue)
End Sub
Результат равен 1,99, что является правильным. Если вы просто используете (скажем) double, вы получите неправильный ответ.
Я думаю, что можно нормально использовать функцию рабочего листа Мин, как только вы отработали различия.
При необходимости можно пустые ячейки в данных просто использовать - подход VBA делает думаю, выиграть все вокруг.