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

我有这样的各种品牌的市场份额这个巨大的数据:

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

什么macros代码可以用来获得输出:

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

空单元也必须考虑。

也有可能得到其他工作表的输出?

更改为INDEX为较less处理器密集版本

在你想把数据复制到的任何表的第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是从顶部向下的行数(即,1代表第2行,2代表第3行,799代表第800行)
如果列数不同,请将4更改为适当的数字

从SeanC的答案修改(感谢伙计)变成一个广义的用法,使其他范围维度和起始单元格的人可以使用它:

将“$ RANGE $”replace为您的范围的引用将“$ CELL $”replace为输出列的第一个单元格:

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

拖下来。 当然,确保$ RANGE $和$ CELL $在行和列上都用'$'符号固定。

假设你的范围是A1:D4,这里是一个VBAmacros,可以做到这一点(只是把值放在列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“&k)”而不是“Cells(k,5)”,但Cells()稍微快一些,因为它不需要连接。

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