如何重复“将范围(A1:A5)复制到范围 B 并进行变换(列到行)”?

如何重复“将范围(A1:A5)复制到范围 B 并进行变换(列到行)”?

我有范围 A 中的数据

1 a1
2 a2
3 a3
4 a4
5 a5
6 b1
7 b2
8 b3
9 b4
10 b5

我将 A1 复制到 A5 到范围 B10,将 B1 复制到 B5 到范围 B11,将 C1 复制到 C5 到范围 B12 等等,并进行变换(从列到行)

a1 a2 a3 a4 a5
b1 b2 b3 b4 b5
n1 n2 n3 n4 n5

对于一个数据文件,代码如下所示:

Sub XX
    Range("A1:A5").Select
    Selection.Copy
    Range("B10").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
End Sub

我应该如何在 VBa 中使用“for next”对整个数据文件重复此过程?

我不知道该如何定义“i”。

答案1

您想知道如何定义i?我猜您指的i是通常用来命名整数的那个?如果是这样,那么我想您想使用 VBa 但拥有更多的控制权?

这应该能满足你的要求,或者给你一个良好的开端

Option Explicit
Sub DoTheThingThePersonWantsWithExcel()

Dim resultsRow As Integer
resultsRow = 10 ' this is where the results will be shown

Dim resultsColumn As Integer
resultsColumn = 66

Dim currentRow As Integer
currentRow = 1

Dim previousCharacter As String
previousCharacter = ""

Do While (Range("A" & currentRow).Value <> "")

    Dim currentValue As String
    currentValue = Range("A" & currentRow).Value

    Dim currentCharacter  As String
    currentCharacter = Left(currentValue, 1)

    If previousCharacter = "" Then
        previousCharacter = currentCharacter
    End If

      If (currentCharacter <> previousCharacter) Then
        previousCharacter = currentCharacter
        resultsColumn = 66
        resultsRow = resultsRow + 1
      End If

      If (currentCharacter = previousCharacter) Then
        Range(Chr(resultsColumn) & resultsRow).Value = currentValue
        resultsColumn = resultsColumn + 1
      End If

    currentRow = currentRow + 1
Loop

End Sub

在此处输入图片描述

代码运行后

在此处输入图片描述

答案2

我将向您展示两种方法。第一种方法只是提供您所需的内容 - 向您展示如何将 for 循环合并到您已有的代码中。第二种方法是我将以更有效的方式执行此操作的方法。

复制/粘贴方法:
首先,这是您的改编代码。关键是首先确定您有多少数据。此信息存储在变量中n。其次是弄清楚如何索引您的 for 循环,以便您只选择您想要的 5 个块,而不会重复或跳过任何内容。最后,您必须弄清楚如何使用这些相同的索引值将输出打印到适当的行。所以,这是代码:

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 循环,以n5 秒为单位从 1 进行 - 因此,对于第一次迭代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

这两种方式之间的大部分差异都在第二个 Sub 的注释中指出了。后者的循环中的索引稍微复杂一些,但两者的思想本质上是相同的。

相关内容