2016-03-04 2 views
0

Мне нужно транспонировать или преобразовывать зубчатый массив в несколько столбцов в excel, и у меня возникают некоторые трудности. Мои данные следующим образом:Excel Transpose - Jagged Array

Round A1 A2 A3 A4 A5 
1  1 2 3 
2  4  5 
3  6   7 
4  8  9 

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

SeqNum A1 A2 A3 A4 A5 
1  1 
2  2 
3   3 
4  4 
5    5 
6 6 
7    7 
8  8 
9   9 

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

У меня есть следующий алгоритм, который я хотел бы реализовать в Excel

int numOfTotalElements = 0; 
List<int> flattened = new List<int>(); 
int numRows = matrix.length; 
for(int i=0; i<matrix.length; i++){ 
    for(int j=0; j<matrix[i].length; j++){ 
    flattened.add(matrix[i][j]) 
    }//end cols 
}// end rows 

foreach(int i in flattened){ 
    System.Console.WriteLine(i); 
} 
+1

Существует большая разница между * 'возникли некоторые трудности' * и * 'фишинг для кого-то, кто сделает мою работу для меня *. Любой, кто просит код на этом форуме ** ожидается **, чтобы показать оригинальные усилия, а не только список требований. Помимо всего прочего, ваш профиль показывает историю отказа от ваших вопросов, как только вы получили ответ (см. [this] (http: // stackoverflow.com/help/someone-answers)). Ваш вопрос был интересным; это позор, что вы не приложили к нему никаких усилий. – Jeeped

+0

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

+1

Я голосую, чтобы закрыть этот * 'gimme teh codez' * запрос как не относящийся к теме, потому что он явно неадекватен как вопрос [SO] (http://goo.gl/whPhMk) и никоим образом не может принести никакой пользы в будущем зритель. ОП не продемонстрировал даже рудиментарного знания платформы; не показал никаких первоначальных усилий за пределами списка требований и выборочных данных. Этот вопрос бесполезен для [SO] (http://goo.gl/whPhMk) на каждом уровне, на который измеряется вопрос. – Jeeped

ответ

0

Смотрите, если один из них получает вас, где вы пытаетесь идти.

Option 1:

Sub expandFlatten() 
    Dim c As Long, i As Long, j As Long 
    Dim vals As Variant, nuvals As Variant 

    With Worksheets("sheet2") 
     With .Cells(1, 1).CurrentRegion 
      vals = .Cells.Value2 
     End With 
     c = UBound(vals, 2) + 2 
     .Cells(1, c).CurrentRegion.Clear 
     .Cells(1, c).Resize(UBound(vals, 1), UBound(vals, 2)) = vals 
     With .Cells(1, c).CurrentRegion 
      .Cells(1, 1) = "SeqNum" 
      .Offset(1, 1).ClearContents 
      .Cells(2, 1).Resize(Application.Max(.Parent.Cells(1, 1).CurrentRegion), 1) _ 
       .DataSeries Rowcol:=xlColumns, Type:=xlLinear, Step:=1 
     End With 
     With .Cells(1, c).CurrentRegion 
      ReDim nuvals(1 To .Rows.Count - 1, 1 To .Columns.Count - 1) 
      For i = LBound(vals, 1) + 1 To UBound(vals, 1) 
       For j = LBound(vals, 2) + 1 To UBound(vals, 2) 
        If Not IsEmpty(vals(i, j)) And IsNumeric(vals(i, j)) Then 
         nuvals(vals(i, j), j - 1) = vals(i, j) 
        End If 
       Next j 
      Next i 
      .Offset(1, 1).Resize(UBound(nuvals, 1), UBound(nuvals, 2)) = nuvals 

     End With 
     .Activate 
     .Cells(1, 1).Select 
    End With 
End Sub 

Option 2:

После воссоздания метки заголовков столбцов и последовательность чисел вниз с правой стороны (до MAX(B:F)), поместите эту стандартную формулу в Р2,

=IFERROR(INDEX(B:B, MATCH($O2,B:B, 0)), "") 

Заполните как справа, так и вниз.


expandFlatten
исходные данныеexpandFlatten()INDEX (..., MATCH (...


+0

Это, вероятно, не имеет значения, но я бы предложил загрузить все содержимое ячейки в массив памяти (с помощью 'vals = Range (« A2 »). Resize (5,6) .Value2'), а также кэширование всех' UBOUND() 'в переменных. – ja72

+0

Jeeped, я считаю, что ваше решение работает с номером 2. Вариант 1 Я не тестировал, поскольку я не знаю VBA, поэтому я не смог бы его модифицировать. Я попробую, хотя, так как вы все равно прилагаете усилия. Еще раз спасибо. Теперь, как я могу отметить это как ответ. –

+0

John, если вы заинтересованы в упорядочении очереди вопросов, нажмите ссылку, указанную в моем первоначальном комментарии по этому вопросу. Дружелюбный совет: признавая ответ, поскольку «принятый ответ» является строго добровольным действием, он повышает вашу собственную репутацию в этом сообществе и может поставить ваши будущие вопросы в более благоприятную перспективу с точки зрения людей, которые созерцают время ответить. – Jeeped