Vou mostrar-lhe duas maneiras de fazer isso. A primeira é apenas dar o que você pediu - mostrando como incorporar um loop no código que você já possui. A segunda maneira é como eu faria isso de uma maneira mais eficiente.
Método de copiar / colar:
Primeiro, aqui está seu código adaptado. A chave é primeiro identificar quantos dados você tem. Esta informação é armazenada na variável n
. A segunda é descobrir como indexar seu loop para que você selecione apenas os blocos de 5 que deseja, sem repetir ou pular nada. Finalmente, você deve descobrir como usar esses mesmos valores de índice para imprimir sua saída na linha apropriada. Então, aqui está o código:
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
Primeiro, n
é calculado usando a função da planilha COUNTA
. Isso funciona porque seus dados são contíguos e começam na linha 1.
O próximo é o loop for, que vai de 1 a n
por 5s - assim, pela primeira iteração i = 1
, pela segunda iteração i = 6
, pela terceira iteração i = 11
e assim por diante.
A chave para selecionar os dados certos é usar o método .Offset
do objeto Range
. Esse método permite deslocar o intervalo em um número especificado de linhas e colunas. Você deseja deslocar a seleção para ser copiada em 5 linhas cada iteração. Um deslocamento de i - 1
fornece o que você deseja.
Finalmente, você tem que usar .Offset
para ajustar a saída abaixo de 1 linha para cada iteração. Como i
está avançando em 5s e você não deseja que sua saída seja espaçada em 5 linhas, é necessário reduzir o i
em 1/5 como o deslocamento. Aqui (i - 1)/5 + 1
fornece o deslocamento de linha necessário.
Método de processamento de matrizes:
Aqui está outra maneira de abordar o mesmo problema que não usa o método copiar / colar. Ele realiza a transformação nos arrays VBA em vez de trabalhar diretamente na planilha. Isso é muito mais eficiente e, para dados grandes, haverá uma diferença muito notável no tempo de execução.
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
A maioria das diferenças entre as duas formas é notada nos comentários do segundo Sub. A indexação no loop é um pouco mais complicada no segundo, mas a ideia é essencialmente a mesma em ambos.