根据上一个和下一个可用数据自动计算并填写excel缺失值

我正在做眼动追踪研究,但眼动仪并不总是吸引眼球。 一个excel文件有〜30k-40k行,我想填补缺less的数值与以前可用和下一个可用数据点的平均值。 但是手动完成会花费很长时间。

我附上了一个表格的例子。 所以X列中的缺失值应该是:359.5或四舍五入到360.而Y列缺失值应该是134。

此外,如果可能的话,添加控制机制,只有在行中有N个值时,才会填充缺失的值。 背后的想法是,如果眼动仪在短时间内没有捕捉到眼睛,那么以这种方式计算平均值就可以了,但是如果眼睛的跟踪时间较长,那么这将是不正确的。

Excel表格的例子

除了在X和Y列中定位空白单元格外,这只是简单的math。

Option Explicit Sub missingGazePoints() Dim blnk As Range With Worksheets("Sheet3") For Each blnk In .Columns("X:Y").SpecialCells(xlCellTypeBlanks) blnk = blnk.End(xlUp).Value2 + _ (blnk.End(xlDown).Value2 - blnk.End(xlUp).Value2) / _ (blnk.End(xlDown).Row - blnk.End(xlUp).Row) Next blnk End With End Sub 

请注意,我已经用线性的方式填补了每一个缺点。 没有使用所有缺失点的静态平均值。 在这里输入图像说明

附录:使用数组

循环遍历重复的工作表查找将减慢速度; 可能到了崩溃的地步。 将所有值(包括空格)填充到二维variables数组中,并在将值返回给工作表之前执行内存中的所有处理将加速¹。

 Sub qwuirwqwq() Dim rsz As Long, x As Long, y As Long Dim vals As Variant, bd As Double, ed As Double On Error GoTo bm_Safe_Exit 'uncomment this line when you have finished debugging appTGGL bTGGL:=False 'uncomment this line when you have finished debugging With Worksheets("Sheet3") With .Cells(2, "X").Resize(Application.Min(.Cells(.Rows.Count, "X").End(xlUp).Row - 1, _ .Cells(.Rows.Count, "Y").End(xlUp).Row - 1), 2) vals = .Cells.Value2 For x = LBound(vals, 1) + 1 To UBound(vals, 1) If vals(x, 1) = vbNullString Then y = x + 1 Do While vals(y, 1) = vbNullString y = y + 1 Loop vals(x, 1) = vals(x - 1, 1) + _ (vals(y, 1) - vals(x - 1, 1)) / (y - x + 1) End If If vals(x, 2) = vbNullString Then y = x + 1 Do While vals(y, 2) = vbNullString y = y + 1 Loop vals(x, 2) = vals(x - 1, 2) + _ (vals(y, 2) - vals(x - 1, 2)) / (y - x + 1) End If Next x .Cells = vals ReDim vals(0) End With End With bm_Safe_Exit: appTGGL End Sub Public Sub appTGGL(Optional bTGGL As Boolean = True) Application.ScreenUpdating = bTGGL Application.EnableEvents = bTGGL Application.DisplayAlerts = bTGGL Application.Calculation = IIf(bTGGL, xlCalculationAutomatic, xlCalculationManual) Debug.Print Timer End Sub 

请注意“帮助程序” appTGGL子过程,该程序暂时挂起税收处理的各种环境设置,直到处理完成。

您还可以通过将工作簿保存为.XLSB而不是.XLSM来获得一些好处(执行速度,减小的文件大小)。


¹ 我运行了后者的基于内存的程序,通过300,000行,在0.6秒的时间内,在一台i5和8Gbs的平板电脑上,约0.6,000个空白单元格。 对,那是正确的。 零点六秒钟。