在Excel中将多行转换为单个堆栈列

时间:2013-01-22 16:59:57

标签: excel excel-vba rows transpose vba

我有各种品牌的市场份额的大量数据,如下所示:

1111 2222 3333 4444
5555      7777 8888
9999 0001 0002
0004 0005 0006 0007

可以使用哪些宏代码来输出:

1111
2222
3333
4444
5555
<emptyCell>
7777
8888
9999
0001
0002
<emptyCell>
0004
0005
0006
0007

还必须考虑空单元格。

是否有可能在其他工作表中获取输出?

4 个答案:

答案 0 :(得分:6)

更改为INDEX以获得处理器密集程度较低的版本

在要将数据复制到的任何工作表的第1行中:

=INDEX($A$1:$D$4,INT((ROW()-1)/4)+1,MOD(ROW()-1,4)+1)

将其复制下来,一旦零开始出现,你就到了最后。 (这是唯一的问题 - 空白单元格将变为零。如果您也希望保留空白,那么您需要这个:

  

= IF(ISBLANK(INDEX($ A $ 1:$ d $ 4,INT((ROW() - 1)/ 4)+ 1,MOD(ROW() - 1,4)+1)) “” ,INDEX($ A $ 1:$ d $ 4,INT((ROW() - 1)/ 4)+ 1,MOD(ROW() - 1,4)+1))

如果你不是从第一行开始,那么将ROW()更改为ROW()-X,其中X是从顶部向下的行数(即第2行为1,第3行为2,行800的799)
如果列数不同,请将4更改为适当的数字

答案 1 :(得分:1)

从SeanC的答案(感谢好友)修改为一般化用法,以便具有其他范围维度和起始单元格的人可以使用它:

将'$ RANGE $'替换为对您的范围的引用 将'$ CELL $'替换为输出列的第一个单元格:

=INDEX( $RANGE$ ,INT((ROW()-ROW( $CELL$ ))/COLUMNS( $RANGE$ ))+1,MOD(ROW()-ROW( $CELL$ ),COLUMNS( $RANGE$ ))+1)

向下拖动它。当然,确保$ RANGE $和$ CELL $都固定在行和列上的'$'符号。

答案 2 :(得分:1)

Sub Makealist()

Application.ScreenUpdating = False

Dim rng As Range
' Destination of List
Worksheets("SomeWorksheet1").Activate
Worksheets("SomeWorksheet1").Range("SomeRange1").Select

' Range to Convert to list
Set rng = Worksheets("SomeWorksheet2").Range("SomeRange2")

' Makes sure that all "Blank cells are really Blank"
For Each c In rng.Cells
    If Len(c) = 0 Then
        c.Value = ""
    End If
Next

' Creates the list
For Each c In rng.Cells
    If IsEmpty(c.Value) = False Then
        Selection.Value = c.Value
        Selection.Offset(1, 0).Select
    End If
Next

Application.ScreenUpdating = True

End Sub

答案 3 :(得分:0)

假设您的范围是A1:D4,这是一个可以执行此操作的VBA宏(只需将值放在E列中)。

Sub RangeToColumn()

Dim varray As Variant
Dim i As Long, j As Long, k As Long

Application.ScreenUpdating = False
k = 1

varray = Range("A1:D4").value
For i = 1 To UBound(varray, 1)
    For j = 1 To UBound(varray, 2)
        Cells(k, 5).value = varray(i, j)
        k = k + 1
    Next
Next

Application.ScreenUpdating = True

End Sub

您可能会喜欢并使用字典对象并将数组转置到列上,但这更简单,字典对象在Mac上不起作用。您也可以使用“Range(”E“&amp; k)”而不是“Cells(k,5)”,但Cells()稍快一些,因为它不需要连接。

请注意,通过关闭屏幕更新,这将运行得更快。