如何在大型Excel工作表中插入零单元格?

时间:2017-08-22 10:07:09

标签: excel

我有一个很长的excel文件,其中包含从网站收集的数字。由于来自源的错误,不到1%的单元格包含零。因此,我想找到更新这些单元格并用最近的值插值它们。零单元的长度是单个时间,因此我可以简单地取最接近的非零值的平均值。但是,有些地方它比一个长,所以我需要使用线性插值。

提取数据样本

+---+------+------+------+------+------+------+------+------+---+---+---+---+---+---+---+---+------+------+------+------+------+------+------+------+------+
|   |  A   |  B   |  C   |  D   |  E   |  F   |  G   |  H   | I | J | K | L | M | N | O | P |  Q   |  R   |  S   |  T   |  U   |  V   |  W   |  X   |  Y   |
+---+------+------+------+------+------+------+------+------+---+---+---+---+---+---+---+---+------+------+------+------+------+------+------+------+------+
| 1 | 4058 | 4048 | 4049 | 4082 | 4090 | 4115 | 4118 | 4109 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3990 | 4058 | 4064 | 4053 | 4057 | 4093 | 4123 | 4137 | 4133 |
+---+------+------+------+------+------+------+------+------+---+---+---+---+---+---+---+---+------+------+------+------+------+------+------+------+------+

1 个答案:

答案 0 :(得分:1)

这是一个非常通用的脚本,可能会做类似的事情。它仅在正值和十行上进行测试,因此您肯定需要将其调整到许多极端情况 - 但它应该指向正确的方向:

Sub Interpolate()
    Dim valueToTop As Integer

    For Row = 1 To 10
        valueToTop = -1
        valueToBottom = -1

        If Cells(Row, 1).Value = 0 Then
            RowToTop = Row - 1
            Do While RowToTop > 0
                If Cells(RowToTop, 1).Value > 0 Then
                    valueToTop = Cells(RowToTop, 1)
                    Exit Do
                End If
                RowToTop = RowToTop - 1
            Loop
            Debug.Print valueToTop
            Debug.Print RowToTop


            RowToBottom = Row + 1
            Do While RowToBottom > 0
                If Cells(RowToBottom, 1).Value > 0 Then
                    valueToBottom = Cells(RowToBottom, 1)
                    Exit Do
                End If
                RowToBottom = RowToBottom + 1
            Loop
            Debug.Print valueToBottom
            Debug.Print RowToBottom

            Cells(Row, 2).Value = valueToTop + (Row - RowToTop) * (valueToBottom - valueToTop) / (RowToBottom - RowToTop)


        End If



    Next Row
End Sub