在Excel中,如何水平翻转一组列?

分享于 

4分钟阅读

电脑

  繁體

问题:

我有一个这样的表格:


X Y Z


1 4 9


2 7 2


3 4 8


3 4 9


...



我希望生成以下表格:


1 4 9 2 7 2 3 4 8 3 4 9



更好的是:


X Y Z X Y Z X Y Z X Y Z


1 4 9 2 7 2 3 4 8 3 4 9




回答 1:

你可以用公式来做。

enter image description here

对于列标题,E1中的公式为:


=OFFSET($A$1,0,MOD(COLUMN()-2,3))



根据需要进行复制。 COLUMN()-2 针对输出的起始列进行调整。 你希望第一个输出列调整为 3 ( 我的mine 5列开始) 值,这样MOD函数就会相对于第一个数据列返回 0 偏移量。 如果数据在A1中没有启动,则需要对它的进行调整。

输出值行使用相同的公式,但替换 0 行偏移量以增加数据行。 E2中的公式:


=OFFSET($A$1,CEILING((COLUMN()-4)/3),MOD(COLUMN()-2,3))



对于行增量,COLUMN()-4 调整列,以便第一个结果位置为 1 ( 我的mine 5列开始) 。 同样,如果源数据没有在A1中启动,则调整公式。

我保持这个简单,只要根据需要复制。 当你传递源数据的结尾时,结果将开始显示空白源单元格的零。


回答 2:

With X X,你可以拿出伸展到 array的CurrentRegion ( 数据岛) 。 剩下的只是循环和数学。


Option Explicit



Sub buildXYZ()



 Dim i As Long, j As Long, arr1 As Variant



 With Worksheets("sheet4")



 'collect source values


 arr1 =. Cells(1,"A").CurrentRegion.Value



 'create the target array


 ReDim arr2(1 To 2, 1 To (UBound(arr1, 1) - 1) * UBound(arr1, 2))



 'populate target from source using two loops


 For i = LBound(arr1, 1) + 1 To UBound(arr1, 1)


 For j = LBound(arr1, 2) To UBound(arr1, 2)


 arr2(1, j + (i - 2) * UBound(arr1, 2)) = arr1(1, j)


 arr2(2, j + (i - 2) * UBound(arr1, 2)) = arr1(i, j)


 Next j


 Next i



 'put target values back into worksheet


. Cells(1,"E").Resize(UBound(arr2, 1), UBound(arr2, 2)) = arr2



 End With



End Sub



enter image description here

如果你需要执行操作,那么直接使用工作表单元格,避免转换数组。


Option Explicit



Sub buildXYZ2()



 Dim i As Long, lr As Long



 With Worksheets("sheet4")



 'collect last data row


 lr =. Cells(.Rows.Count,"A").End(xlUp).Row



 'loop through the rows backwards, shifting the values up and right


 For i = lr To 3 Step -1


 With. Range(.Cells(i,"A"),. Cells(i,. Columns.Count).End(xlToLeft))


. Parent.Cells(i - 1,. Parent.Columns.Count).End(xlToLeft).Offset(0, 1).Resize(1,. Columns.Count) =. Value


. Clear


 End With


 Next i



 'AutoFill the headers across in a pattern


 With. Range(.Cells(1,"A"),. Cells(1,. Columns.Count).End(xlToLeft))


. AutoFill Destination:=.Resize(1,. Columns.Count * (lr - 1)), Type:=xlFillCopy


 End With



 End With



End Sub



enter image description here



COL  Excel  column  Group  FLIP  Groups  
相关文章