2016-10-10 4 views
1

Я пытаюсь вставить строки, в которых мне не хватает лет в столбце Год. Идея состоит в том, чтобы иметь год и ценность, населяемые на каждый год до 2016 года, начиная с первого года для данного идентификатора. Вот мое текущее состояние:Вставить строки для заполнения последовательности

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 для этого хорошо. Если у вас есть быстрый способ получить это в базе данных и сделать это, я бы пошел по этому маршруту. VBA будет немного болезненным по сравнению с быстрым оператором SQL. – 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 
Смежные вопросы