好吧,看起来相当简单的问题实际上非常棘手,因为在计算可能导致错误答案的差异时会遇到舍入错误。我最终将结果任意四舍五入到小数点后 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))))
必须使用 CtrlShiftEnter
作为数组公式输入
假设数据中没有间隙(这会抛出 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,你会得到错误的答案。
我认为,一旦找出差异,就可以使用工作表函数 Min。
如果需要,可以直接在数据中允许空白单元格 - 我认为 VBA 方法确实全面。