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

说,我原来的数据块是工作表(1).range(“A1:C100”),我想这个块的列堆成一个单一的列,也就是我先把第一列,然后第二列下面,最后是第三列。 最后,我应该有一个专栏,说是放在工作表(2).range(“A1:A300”)。 我想知道是否有任何聪明和快速的algorithm来实现这个?

没有VBA ,在Sheet2单元格A1中input:

=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 

可能有更好的办法,但我通常用一个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 

这对你来说可能够用了,希望它有帮助。

 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