2017-08-22 61 views
1

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

样品中提取数据

+---+------+------+------+------+------+------+------+------+---+---+---+---+---+---+---+---+------+------+------+------+------+------+------+------+------+ 
| | 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 | 
+---+------+------+------+------+------+------+------+------+---+---+---+---+---+---+---+---+------+------+------+------+------+------+------+------+------+ 
+0

我可能会使用VBA这一点。 –

+0

我将数据导入matlab,将零转换为NaN,然后​​使用fillmissing()函数。 – sosruko

回答

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 
相关问题