2014-07-10 5 views
0

나는 여러 행에서 자체의 복사 된 버전으로 현재 엑셀에서 하나의 행에 저장 연간 비용 데이터를 트랜스해야합니다.트랜스 부분?

Name Title Year1Expense Year2Expense Year3Expense Year4Expense other1 other 2 etc 
Bob  Tech  30,000  17,000  20,000  18,000 

나는 이름의 수천이

Name Title Year Expense other1 other2 etc 
Bob  Tech  1  30,000 
Bob  Tech  2  17,000 
Bob  Tech  3  20,000 
Bob  Tech  4  18,000 

처럼 보이도록 데이터가 필요하고, : 내가 무엇을 의미하는지 명확히하기 위해, 여기

원래 데이터 소스가이 반환하는 예제입니다 가져온 데이터는 거의 항상 이름의 다른 카운트, 그래서 동적으로뿐만 아니라이 데이터를 변환 할 수 있어야합니다. VBA를 사용하여 Excel에서 비슷한 작업을 한 사람이 있습니까?

+0

누구나 VBA를 사용하여 Excel에서 비슷한 작업을 했습니까? * 예. 많은 사람들이 가질 것입니다. 문제는 코드가 어디에 있으며이 문제에 어떤 노력을 쏟은 것입니까? 어떤 오류가 발생하고 코드가 멈추는가? – hnk

답변

0

그냥 원래 데이터 소스에 버튼을 생성하고 클릭 할 때이 매크로를 사용하도록 설정 사전에 어떤 응답을 주셔서 감사합니다.

Sub Transpose_Click() 

Dim numberOfRows, numberOfColumns, numberOfYears, counter, nextRow As Integer, originalSheet As String 
originalSheet = ActiveSheet.Name 
nextRow = 2 
numberOfColumns = Range("A1").End(xlToRight).Column 
numberOfYears = 0 
counter = 5 
For i = 1 To numberOfColumns 
    If LCase(Left(CStr(Cells(1, i).Value), 4)) = "year" Then 
     numberOfYears = numberOfYears + 1 
    End If 
Next 
numberOfRows = Range("A1").End(xlDown).Row 

Dim wsSheet As Worksheet 
On Error Resume Next 
Set wsSheet = Sheets("TransposedData") 
On Error GoTo 0 
If Not wsSheet Is Nothing Then 
MsgBox "Sheet already exists, overwriting" 
Else 
MsgBox "Creating new sheet" 
Sheets.Add.Name = "TransposedData" 
End If 

With Sheets("TransposedData") 
    .Cells.Delete 
    .Range("A1").Value = "Name" 
    .Range("B1").Value = "Title" 
    .Range("C1").Value = "Year" 
    .Range("D1").Value = "Expense" 
    For i = numberOfYears + 3 To numberOfColumns 
     .Cells(1, counter).Value = Sheets(originalSheet).Cells(1, i).Value 
     counter = counter + 1 
    Next 
    For i = 2 To numberOfRows 
     For j = 1 To numberOfYears 
      .Cells(nextRow, 1).Value = Sheets(originalSheet).Cells(i, 1).Value 
      .Cells(nextRow, 2).Value = Sheets(originalSheet).Cells(i, 2).Value 
      .Cells(nextRow, 3).Value = j 
      .Cells(nextRow, 4).Value = Sheets(originalSheet).Cells(i, 2 + j).Value 
      For k = 1 To (numberOfColumns - 2 - numberOfYears) 
       .Cells(nextRow, 4 + k).Value = Sheets(originalSheet).Cells(i, 2 + numberOfYears + k).Value 
      Next 
      nextRow = nextRow + 1 
     Next 
    Next 
End With 

End Sub