2017-08-22 97 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 
相關問題