2016-10-10 4 views
1

Ich versuche Zeilen einzufügen, in denen ich Jahre in der Spalte "Jahr" vergesse. Die Idee ist, ein Jahr und einen Wert für jedes Jahr bis 2016 zu haben, beginnend mit dem ersten Jahr für eine bestimmte ID. Hier ist mein aktueller Stand:Zeilen einfügen, um die Sequenz zu füllen

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 

Hier ist mein gewünschter Zustand:

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 

So bevölkern fehlen Jahre mit dem Wert aus dem Vorjahr. Wie kann dies in Excel, SQL oder VBA erreicht werden? Ich kann dies in eine Access-Datenbank werfen, um den Job zu erledigen. Das einzige, woran ich gerade denken kann, ist, meine aktuelle Tabelle mit SQL in eine Tabelle mit all den Jahren zu integrieren, die ich möchte, und dann die NULL-Werte neu aufzufüllen. Jede Hilfe wird sehr geschätzt. Vielen Dank!

Edit: Wie mache ich das speziell mit SQL?

+0

'Wert für jedes Jahr bis 2016 'aus wann? und erklären Sie auch die Logik – TheGameiswar

+0

Ihre Idee, SQL zu verwenden, um dies zu tun, ist gut. Wenn Sie einen schnellen Weg haben, um dies in eine Datenbank zu bekommen und das zu tun, würde ich diese Route gehen. VBA wird im Vergleich zu einer schnellen SQL-Anweisung ein wenig schmerzhaft sein. – JNevill

+0

Auch Ihre Beispieldaten zeigen, dass das erste Jahr für 'a'' 2015' mit einem Wert '90' ist, aber Ihre gewünschten Ergebnisse zeigen Daten, die für' a' zurückgehen, mit einem unerklärten Wert von '60'. – JNevill

Antwort

0

Dies kann mit der unten gezeigten Brute-Force-Methode (VBA) erfolgen. Bitte lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben.

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 
Verwandte Themen