2017-01-12 11 views
2

У меня есть что-то данные, как это в Excel,Как применять группу по значениям в столбцах Excel

class   Subject 
A     maths 
A     science 
A     english 
B     maths 
B     science 

Ожидаемый выход в Эксел:

Class    Subject1   subject2   subject3 
A     maths    science   english 
B     maths    science 

Я попробовал в группе опций первенствует, но не работает. Пожалуйста, дай мне знать, как я могу получить ожидаемый выходную

+1

Вы должны увидеть user3886251 [ответить здесь] (http://stackoverflow.com/a/25007876/5588347). –

ответ

1

Поскольку это StackOverflow, ватные & Сайта для программирования, я думал, что VBA решения может применяться:

БУДЬТЕ ОСТОРОЖЕН, этот код будет меняться ваш макет даты, сделайте копию перед ее запуском!

Public Sub GroupByExpandingColumn() 
    Dim ws As Worksheet 
    Dim row, col As Long 

    'Assuming range for your data is A1:B6 

    ' Change this to reflect your Sheet if needed (i.e by name like Set ws = Workbooks("sheet name")) 
    Set ws = ActiveWorkbook.ActiveSheet 

    'First of all, make sure the data is ordered according to the group by column, in this case CLASS - A column 
    ' This can probably be achieved in a simpler way, I've just hacked this code from a recorded macro 
    ws.Range("A1:B1").Select 
    ws.Range(Selection, Selection.End(xlDown)).Select 
    With ws.Sort 
     .SortFields.Clear 
     .SortFields.Add Key:=Range("A2:A6"), _ 
      SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
     .SetRange Range("A1:B6") 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 

    'Now that the data is ordered, let's do our magic 
    row = 3 
    While Len(ws.Cells(row, 1).Value) > 0 
     If ws.Cells(row, 1).Value = ws.Cells(row - 1, 1).Value Then 
      'same class than previous row, group in a new column 
      col = 3 
      While Len(ws.Cells(row - 1, col).Value) > 0 
       col = col + 1 
      Wend 
      ws.Cells(row - 1, col).Value = ws.Cells(row, 2).Value 
      ws.Range(row & ":" & row).Delete 
     Else 
      'Next class 
      row = row + 1 
     End If 
    Wend 

    Set ws = Nothing 
End Sub 
+0

Perfect :) Рабочие –