如何使用VBA将电子表格中的数据矩阵转换为单个列?

时间:2016-04-09 12:44:25

标签: excel vba excel-vba

说,我的原始数据块是工作表(1).range(“A1:C100”),我想将这个块的列堆叠成一列,也就是说,我先放入第一列,然后第二列下面,最后是第三列。最后,我应该有一个列,比如放在工作表(2).range(“A1:A300”)中。我想知道是否有任何智能和快速算法来实现这一目标?

3 个答案:

答案 0 :(得分:1)

可能有更好的方法,但我通常会使用Offset

I=0

For Each A in Worksheets(1).Range("A1:A100").Cells
  Worksheets(2).Range("A1").Offset(I,0) = A.Value
  I = I + 1
Next
For Each B in Worksheets(1).Range("B1:B100").Cells
  Worksheets(2).Range("A1").Offset(I,0) = B.Value
  I = I + 1
Next
For Each C in Worksheets(1).Range("C1:C100").Cells
  Worksheets(2).Range("A1").Offset(I,0) = C.Value
  I = I + 1
Next

答案 1 :(得分:1)

不使用 VBA ,在 Sheet2 单元格 A1 中输入:

=OFFSET(Sheet1!$A$1,MOD(ROWS($1:1)-1,100),ROUNDUP(ROWS($1:1)/100,0)-1,)

并复制下来。

并使用 VBA

Sub copy_table_to_column()
    Dim s As String

    s = "=OFFSET(Sheet1!$A$1,MOD(ROWS($1:1)-1,100),ROUNDUP(ROWS($1:1)/100,0)-1,)"

    With Worksheets("Sheet2").Range("A1:A300")
        .Formula = s
        .Value = .Value
    End With
End Sub

答案 2 :(得分:0)

这对你来说可能已经足够了...... 希望它有所帮助。

Option Explicit

'Define the test function...
Sub test()

Dim vData As Variant
Dim r As Range

Set r = Sheet1.Range("A1:C100")
vData = ConcatinateColumns(r)

End Sub

'Define the function to concatinate columns.
Public Function ConcatinateColumns(ByVal Data As Range)

Dim vTemp As Variant
Dim i As Integer, j As Long, k As Long

'Get the data for each cell to a variant.
vTemp = Data.Value
ReDim vData(1 To (UBound(vTemp, 1) - LBound(vTemp, 1) + 1) * (UBound(vTemp, 2) - LBound(vTemp, 2) + 1), 1 To 1) As Variant

For i = LBound(vTemp, 2) To UBound(vTemp, 2)
    For j = LBound(vTemp, 1) To UBound(vTemp, 1)
        k = k + 1
        vData(k, LBound(vData, 1)) = vTemp(j, i)
    Next
Next
ConcatinateColumns = vData

End Function