Я собираюсь показать вам два способа сделать это. Первый - просто дать вам то, о чем вы просили - показать, как включить цикл for в код, который у вас уже есть. Второй способ - как бы я делал это более эффективно.
Метод копирования / вставки:
Во-первых, вот ваш адаптированный код. Ключ должен сначала определить, сколько данных у вас есть. Эта информация хранится в переменной n
. Во-вторых, нужно выяснить, как индексировать цикл for, чтобы вы выбирали только те куски, которые вам нужны, без повторения или пропуска чего-либо. Наконец, вы должны выяснить, как использовать те же самые значения индекса, чтобы вывести ваш вывод в соответствующую строку. Итак, вот код:
Sub XX()
Dim n As Long
n = [COUNTA(A:A)]
For i = 1 To n Step 5
Range("A1:A5").Offset(i - 1, 0).Select
Selection.Copy
Range("B10").Offset((i - 1) / 5 + 1, 0).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Next i
End Sub
Во-первых, n
рассчитывается с использованием функции листа COUNTA
. Это работает, потому что ваши данные являются смежными и начинаются со строки 1.
Далее следует цикл for, который идет от 1 до n
на 5 с - так, для первой итерации i = 1
, для второй итерации i = 6
, для третьей итерации i = 11
и т.д.
Ключом к выбору правильных данных является использование .Offset
объекта Range
. Этот метод позволяет сместить диапазон на указанное количество строк и столбцов. Вы хотите сдвинуть выделенную область на 5 строк на каждую итерацию. Смещение i - 1
дает вам то, что вы хотите.
Наконец, вы должны использовать .Offset
для регулировки вывода на 1 строку для каждой итерации. Поскольку i
шагаю в 5 с, и вы не хотите, чтобы ваш вывод был разнесен на 5 строк, вы должны уменьшить i
на 1/5 в качестве смещения. Здесь (i - 1)/5 + 1
дает вам необходимое смещение строки.
Метод обработки массива:
Вот еще один способ решения той же проблемы, который не использует метод копирования / вставки. Он выполняет преобразование для массивов VBA вместо того, чтобы работать непосредственно с рабочим листом. Это гораздо более эффективно, и для больших данных во время выполнения будет очень заметная разница.
Sub Reorganize()
Dim colData() As Variant, i As Long
Dim outData() As Variant, j As Long
'Store all data from column in array for fast processing
colData = Range("A1").Resize([COUNTA(A:A)], 1).Value
'Size output array to match data
ReDim outData(1 To Int((UBound(colData, 1) - 1) / 5) + 1, 1 To 5) As Variant
'Loop through array and print values to corresponding indices in output array
For i = LBound(colData, 1) To UBound(colData, 1)
outData(Int((i - 1) / 5) + 1, ((i - 1) Mod 5) + 1) = colData(i, 1)
Next i
'Print reorganized data to sheet
Range("B10").Resize(UBound(outData, 1), UBound(outData, 2)).Value = outData
End Sub
Большая часть различий между этими двумя способами отмечена в комментариях ко второму подпункту. Индексирование в цикле немного сложнее в последнем, но идея по сути одинакова в обоих.