2014-01-23 2 views
-1

У меня есть большой группу данных, которая выглядит как:Транспонирование группы данных в Excel или Access

M. Item Num 
A  a  3 
A  b  2 
A  c  1 
B  a  4 
B  b  2 
B  c  3 
B  d  1 
C  a  1 
C  b  2 

Мне нужно, чтобы преобразовать их в формат, как:

M. Item Num Item Num Item Num Item Num 
A  a  3  b  2  c  1 
B  a  4  b  2  c  3  d  1 
C  a  1  b  2 
+0

Изменено ваша маркировка ... «pivot» - это то, что вы ищете. есть ли какой-либо верхний предел для количества предметов, которые может иметь M. – Twelfth

+0

Спасибо за ваш комментарий. Как я уже говорил, это большая группа. Если вы запрашиваете количество строк в первом формате, число может превышать 10 000. Если во втором формате количество строк будет больше 800. – inori

ответ

1
Sub Reformat() 

    Dim arr, d1, d2, arrOut(), r As Long, ub As Long 
    Dim r2 As Long, c As Long 

    arr = Selection.Value 'select the source data first 
    ub = UBound(arr, 1) 
    Set d1 = distinct(arr, 1) 
    Set d2 = distinct(arr, 2) 
    ReDim arrOut(1 To d1.Count, 1 To 1 + (d2.Count * 2)) 

    For r = 1 To ub 
     r2 = d1(arr(r, 1)) 
     c = 2 + (d2(arr(r, 2)) - 1) * 2 
     arrOut(r2, 1) = arr(r, 1) 
     arrOut(r2, c) = arr(r, 2) 
     arrOut(r2, c + 1) = arr(r, 3) 
    Next r 

    With ThisWorkbook.Sheets("out") 
     .Range("A2").Resize(UBound(arrOut, 1), UBound(arrOut, 2)).Value = arrOut 
    End With 

End Sub 

'get all distinct values in a "column" of a 2-d array 
Function distinct(arr As Variant, colNum) As Object 
    Dim r As Long, ub As Long, i As Long, d 
    Set d = CreateObject("scripting.dictionary") 
    ub = UBound(arr, 1) 
    i = 1 
    For r = 1 To ub 
     If Not d.exists(arr(r, colNum)) Then 
      d.Add arr(r, colNum), i 
      i = i + 1 
     End If 
    Next r 
    Set distinct = d 
End Function 
+0

Спасибо Тиму за ваш ответ. Я попытался запустить макросы, но получил сообщение об ошибке «ub = UBound (arr, 1)» ... Пожалуйста, дайте мне знать, если я не использовал его правильно. – inori

+0

Вы выбрали все исходные данные перед запуском макроса? –

+0

Упс ... Теперь я застрял в «With ThisWorkbook.Sheets (« out »)» ... – inori

Смежные вопросы