я хотел бы дублировать строки по количеству, указанному в столбцах. у меня проблемы с этим
до сих пор мне удавалось дублировать строки по количеству, но я не смог добавить, для какого «блока» предназначена эта строка.
это данные: введите описание изображения здесь
ожидаемый результат: введите описание изображения здесь
это код, который я использую. это скорректированная версия другого кода
Подблоки копирования () Dim StartRow, LastRow, NewSheetRow As Long Dim n, i как целое число
Worksheets("test").Activate
LastRow = Cells(Rows.Count, 7).Row
NewSheetRow = 10
For StartRow = 10 To LastRow
n = CInt(Worksheets("test").Range("AA" & StartRow).Value)
For i = 1 To n
Worksheets("test2").Range("C" & NewSheetRow).Value = Worksheets("test").Range("g" & StartRow).Value
Worksheets("test2").Range("D" & NewSheetRow).Value = Worksheets("test").Range("H" & StartRow).Value
Worksheets("test2").Range("E" & NewSheetRow).Value = Worksheets("test").Range("I" & StartRow).Value
Worksheets("test2").Range("F" & NewSheetRow).Value = Worksheets("test").Range("J" & StartRow).Value
Worksheets("test2").Range("G" & NewSheetRow).Value = Worksheets("test").Range("K" & StartRow).Value
NewSheetRow = NewSheetRow + 1
Next i
Next StartRow
Конец сабвуфера
у вас когда-нибудь было число больше 1 в вашей кросс-таблице?
В SQL это будет UNPIVOT. Используйте это как ссылку для поиска VB
1-й поиск. excel-university.com/unpivot-excel-данные Очевидно, вы можете сделать это только в графическом интерфейсе без VBA.
@РайанБ. да, цифры могут быть любыми. но скорее всего под 20
Если вы используете Excel 2016, вы можете использовать PowerQuery, чтобы очень хорошо развернуть этот набор данных. У Кита есть очень полезная ссылка для вас в комментариях. Отфильтруйте нули, и вы почти у своего решения. В игру вступает небольшая сложность с возможностью появления этих повторяющихся рядов. Функция List.Numbers поможет вам в этом, если вы заинтересованы в том, чтобы немного проникнуть в суть языка M.
Тем не менее, это также не так уж сложно взломать в VBA. Я бы предложил немного другую стратегию, которая заключается в том, чтобы просто перебирать диапазон вашей кросс-таблицы, выдергивая заголовки строк и столбцов, когда вы набираете количество больше 0.
Sub foo()
Dim outputRow As Integer
'start your output at whatever row is best
outputRow = 1
'set your range to cover the counts in your crosstab
For Each c In Range("A1:Z99")
If c.Value > 0 Then
For i = 1 To c.Value
'write the values off the current row headers over to comparable positions in your output row
Worksheets("test2").Cells(outputRow, 3).Value = Cells(c.Row, 1).Value
Worksheets("test2").Cells(outputRow, 4).Value = Cells(c.Row, 2).Value
.
.
.
'write the values off the current column headers into output row
Worksheets("test2").Cells(outputRow, 8).Value = Cells(1, c.Column).Value
outputRow = outputRow + 1
Next i
End If
Next c
End Sub
Удачи, надеюсь поможет
Если вы используете power query unpivot, вот пост о повторении строк столько раз, сколько у вас есть в ваших подсчетах. mrexcel.com/forum/power-bi/977045-pq-repeat-rows-n-times.html
Спасибо. у меня нет Power Query, но я пытался использовать предоставленный вами код, просто не уверен, что вы установили Dim 'c' As
Вам не нужно указывать размер c, но если вы следуете правилам, вы можете Dim c as Range
Не могли бы вы, отредактируйте свой вопрос, предоставить код, который у вас есть?