2016-10-10 5 views
1

年の列に年がない行を挿入しようとしています。この考えは、与えられたIDの最初の年から始まる、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'の最初の年が'90 'という値を持つ' 2015'であることを示していますが、あなたの望む結果は、説明できない値の '60'を持つ' a'の '2007'に戻るでしょう。 – 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 
関連する問題