2016-10-10 71 views
1

我試圖在年份列中缺少年份的地方插入行。這個想法是,每年都會有一年的時間和價值,直到2016年,從給定ID的第一年開始。這是我目前的狀態:插入行以填充序列

id year value 
a 2016 100 
a 2015 90 
a 2007 60 
b 2016 120 
b 2014 105 
c 2015 110 
c 2014 90 
d 2016 150 

這裏是我的理想狀態:

id year value 
a 2016 100 
a 2015 90 
a 2014 60 
a 2013 60 
a 2012 60 
a 2011 60 
a 2010 60 
a 2009 60 
a 2008 60 
a 2007 60 
b 2016 120 
b 2015 105 
b 2014 105 
c 2016 110 
c 2015 110 
c 2014 90 
d 2016 150 

因此,填充缺失的年比上年的價值。 Excel,SQL或VBA如何實現這一點?我可以將其放入訪問數據庫以完成工作。我現在唯一能想到的就是將我當前的表與SQL中的表連接起來,然後再重新填充NULL值。任何援助非常感謝。謝謝!

編輯:我如何使用SQL專門做這件事?

+0

從什麼時候開始,每年到2016年爲止每年的價值都會增加?並解釋邏輯 – TheGameiswar

+0

您的想法使用SQL來做到這一點很好。如果你有一個快速的方法把它放到數據庫中並做到這一點,那麼我會走這條路。與快速的SQL語句相比,VBA會有點痛苦。 – JNevill

+0

此外,您的示例數據顯示'a'的第一年是'2015',值爲'90',但您期望的結果顯示返回到'2007年'的'a'的日期值爲'60'的日期。 – JNevill

回答

0

這可以通過下面顯示的VBA,蠻力方法完成。 如果您有任何問題,請讓我知道。

Dim ws As Worksheet 
' assuming data is always sorted by id 
Dim Row As Integer 
Dim curID, prevID As String 
Dim curYr, prevYr As Integer 
Dim prevVal As Integer 

Set ws = ThisWorkbook.ActiveSheet 

Row = ws.Cells.SpecialCells(xlCellTypeLastCell).Row 
' This does 2 things gets the prevID and makes sure previous line selects the actual last row 
prevID = "" 
Do 
    prevID = ws.Cells(Row, 1) 
    prevYr = ws.Cells(Row, 2) 
    prevVal = ws.Cells(Row, 3) 
    Row = Row - 1 
Loop Until prevID <> "" Or Row = 2 

While Row > 2 
    curID = ws.Cells(Row, 1) 
    curYr = ws.Cells(Row, 2) 

    ' next id 
    If curID <> prevID Then 
     Row = Row + 1 
     For i = 2016 To (prevYr + 1) Step -1 
     ws.Rows(Row).Insert shift:=xlShiftDown 
     ws.Cells(Row, 1) = prevID 
     ws.Cells(Row, 2) = i 
     ws.Cells(Row, 3) = prevVal 
     Next i 
     Row = Row - 1 
     prevID = curID 
     prevYr = curYr 
     prevVal = ws.Cells(Row, 3) 
    ' next year 
    ElseIf curYr - 1 = prevYr Then 
     prevID = curID 
     prevYr = curYr 
     prevVal = ws.Cells(Row, 3) 
    ' in between 
    Else 
     Row = Row + 1 
     For i = (prevYr + 1) To (curYr - 1) 
     ws.Rows(Row).Insert shift:=xlShiftDown 
     ws.Cells(Row, 1) = prevID 
     ws.Cells(Row, 2) = i 
     ws.Cells(Row, 3) = prevVal 
     Next i 
     If prevYr = curYr Then 
     Row = Row - 1 
     End If 
     prevYr = curYr 
    End If 

    Row = Row - 1 
Wend