2015-01-24 2 views
0

У меня есть файл первенствовать, содержащий две колонки активность & РезультатКак разбить столбец с несколькими атрибутами на несколько столбцов?

активность столбец строки, которая содержит три возможных значения говорят a, b и c.

Результат столбец содержит значения из формы представления сгруппированы вместе следующим образом:

Result 
option1: 2; option2: 4; option3: 2 

Варианты не являются одинаковыми для всех строк. Параметры зависят от значения в Активность column. Таким образом, образец файл выглядит

Activity,Result 
a  , "a1: 1; a2: 4; a3: 5" 
a  , "a1: 3; a2: 1; a3: 5" 
a  , "a1: 4; a2: 3; a3: 5" 
b  , "b1: 2; b2: 4; b3: 2" 
b  , "b1: 3; b2: 4; b3: 2" 
b  , "b1: 1; b2: 3; b3: 1" 

Я хочу, чтобы преобразовать этот файл в формат, который содержит опции в виде столбцов следующего

Activity, a1, a2, a3, b1, b2, b3 
a  , 1, 4, 5, , , 
a  , 3, 1, 5, , ,  
b  , , , , 2, 4, 3 

Есть ли способ сделать это в Excel? Кроме того, я не против создания отдельных файлов для каждого из вариантов (a, b и c).

ответ

0

Разместите ваши данные, как показано на листе 1, создать лист 2 и оставить это поле пустым, следующий код даст выход вы обрисовали ...

ActiveWorkbook.Sheets(2).Cells.ClearContents 
ActiveWorkbook.Sheets(2).Cells(1, 1).Value = "Activity" 
ActiveWorkbook.Sheets(2).Cells(1, 2).Value = "a1" 
ActiveWorkbook.Sheets(2).Cells(1, 3).Value = "a2" 
ActiveWorkbook.Sheets(2).Cells(1, 4).Value = "a3" 
ActiveWorkbook.Sheets(2).Cells(1, 5).Value = "b1" 
ActiveWorkbook.Sheets(2).Cells(1, 6).Value = "b2" 
ActiveWorkbook.Sheets(2).Cells(1, 7).Value = "b3" 

Dim c() As String 
c = Split("a1,a2,a3,b1,b2,b3", ",") 

Dim firstActivity, lastActivity, t1, t2 As Integer 
firstActivity = 2 
lastActivity = ActiveWorkbook.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row 

Dim Result As String 

For i = 2 To lastActivity 
    Result = ActiveWorkbook.Sheets(1).Cells(i, 2).Value 
    ActiveWorkbook.Sheets(2).Cells(i, 1).Value = ActiveWorkbook.Sheets(1).Cells(i, 1).Value 
    For i2 = 0 To 5 
     t1 = InStr(1, Result, c(i2), 1) 
     If (t1 = 0) Then GoTo skip 
     t1 = InStr(t1, Result, " ", 1) 
     t2 = InStr(t1, Result, ";", 1) 
      If (t2 = 0) Then 
      t2 = InStr(t1, Result, """", 1) 
      End If 
     ActiveWorkbook.Sheets(2).Cells(i, i2 + 2).Value = Mid(Result, t1, t2 - t1) 
skip: 
    Next i2 
    Next i 

Входной (лист 1)

Activity ,Result 
a , "a1: 1; a2: 4; a3: 5" 
a , "a1: 3; a2: 1; a3: 5" 
a , "a1: 4; a2: 3; a3: 5" 
b , "b1: 2; b2: 4; b3: 2" 
b , "b1: 3; b2: 4; b3: 2" 
b , "b1: 1; b2: 3; b3: 1" 

Выход (Лист 2)

Activity a1 a2 a3 b1 b2 b3 
a 1 4 5   
a 3 1 5   
a 4 3 5   
b    2 4 2 
b    3 4 2 
b    1 3 1 

Не обращайте внимания на столбцы, которые они выстроились отлично, но форматирование сайта испортило его, когда я вставляю его здесь. Вы даже можете сделать это с помощью формул вместо VBA, но макрос, который я написал выше, выполняет именно то, что вы наметили, если есть детали, которые вы забыли упомянуть, и хотите, чтобы я изменил код, скажите, пожалуйста. Конечно, лучшим решением является, если возможно, прекратить вводить данные таким образом.

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