在 Excel 中将行并排放置的代码

Code to place rows next to each other in Excel

提问人:MSP 提问时间:11/16/2023 最后编辑:MSP 更新时间:11/17/2023 访问量:107

问:

我正在寻找一个简短的代码(或公式?),我可以用它来重新排列我的数据,特别是将行放在一起(见图)。

Rearrange rows next to each other

谢谢。

我发现的最接近的是一个结合了 MOD 和 OFFSET (https://www.youtube.com/watch?v=Tt4nUYVp2v0&ab_channel=MikeWong) 使用的公式,但这并不完全符合我的要求。

数据:

一个 B C
1
2 1 3112.5 947
3 2 3087.5 937.5
4 3 1271 1162
5 4 1086 1239
6 1 3112.5 947
7 2 3087.5 937.5
8 3 1271 1162
9 4 1086 1239
10 1 3112.5 947
11 2 3087.5 937.5
12 3 1271 1162
13 4 1086 1239
14 1 3112.5 947
15 2 3087.5 937.5
16 3 1271 1162
17 4 1086 1239
18 1 3112.5 947
19 2 3087.5 937.5
20 3 1271 1162
21 4 1086 1239
VBA Excel-公式 Office365

评论

0赞 CHill60 11/16/2023
我无法访问您的链接 - 您能否在您的问题中准确描述您要做什么
0赞 Ike 11/16/2023
我不确定:但是您的屏幕截图看起来不像“Excel 2010” - 您能否验证您使用的是哪个版本 - 它在解决您的问题的方法上有所不同
0赞 MSP 11/17/2023
@CHill60我的软件生成 4 行或行的数据点 (x,y),我希望这些 (x,y) 数据点在 1 行中彼此相邻。
0赞 MSP 11/17/2023
@Ike,对不起,这是Microsoft 365,我会改变的

答:

3赞 P.b 11/16/2023 #1

由于您标记了 Excel 2010,因此获取结果有点困难,如下所示(粘贴公式并向右/向下拖动):

=IFERROR(
         IF(COLUMN(A1)-1 / ((COLUMN(A1)-1)/2<=MAX($A$2:$A$21)) / (ROW(A1)<=(ROWS($A$2:$A$21)/MAX($A$2:$A$21))),
            INDEX($B$2:$C$21,
                  1+(ROW(A1)-1)*MAX($A$2:$A$21)+(COLUMN(A1)-2)/2,
                  1+ISODD(COLUMN(A1))),
            ROW(A1)),
         "")

enter image description here

使用 Office 365,这一切都可以变得容易得多:=LET(w,WRAPROWS(TOCOL(B2:C21),8),HSTACK(SEQUENCE(ROWS(w)),w))

或动态:

=LET(range,A2:C21,
     pattern,TAKE(range,,1),
     values,DROP(range,,1),
     n,MAX(pattern),
     wrap,WRAPROWS(TOCOL(values),n*COLUMNS(values)),
HSTACK(SEQUENCE(ROWS(wrap)),wrap))

在 Beta 版中,您还可以使用 PIVOTBY:=PIVOTBY(1+INT((ROW(B2:C21)-ROW(B2))/MAX(A2:A21)),A2:A21,B2:C21,SUM,,0,,0)

enter image description here

评论

1赞 Mayukh Bhattacharya 11/16/2023
出色的解决方案PIVOTBY()
0赞 P.b 11/16/2023
就我个人而言,我最喜欢包装行,但我也想尝试一下 PIVOTBY。
0赞 MSP 11/17/2023
@P.b 谢谢你,对不起,我弄错了,它是 Office 365 而不是 Excel 2010
0赞 P.b 11/17/2023
请确保下次发布问题时,不要虚假标记;正如你所看到的Excel 2010(答案的第一部分)和Office 365(以下单行)之间的区别。如果我的答案或 Horseyrides 的答案对您有所帮助,请勾选答案左侧的绿色 V 号来标记该答案。
1赞 horseyride 11/16/2023 #2

PowerQuery 加载项由 Microsoft 在 Excel 2013 中引入,并与 Excel 2010 向后兼容。安装后,将数据引入 powerquery,注意它没有标头。在以后的excel版本中,直接使用数据..从表/范围...

将此代码粘贴到主页中...高级编辑器...

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content], // preserve your first row from what is autogenerated in place of this row
#"Added Index" = Table.AddIndexColumn(Source, "Index", 0, 1, Int64.Type),
RowIndex = Table.TransformColumns(#"Added Index", {{"Index", each Number.IntegerDivide(_, 4), Int64.Type}}),
Part1 = Table.SelectColumns(RowIndex,{"Column1", "Column2", "Index"}),
Part2=  Table.TransformColumns(Table.RenameColumns(Table.SelectColumns(RowIndex,{"Column1", "Column3", "Index"}),{{"Column3", "Column2"}}),{{"Column1",each _ + .5, type number}}),
#"Sorted" = Table.Sort(Part1&Part2,{{"Column1", Order.Ascending}}),
#"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Sorted", {{"Column1", type text}}, "en-US"), List.Distinct(Table.TransformColumnTypes(#"Sorted", {{"Column1", type text}}, "en-US")[Column1]), "Column1", "Column2", List.Sum)
in #"Pivoted Column"

加载带有 file ...关闭并加载....进入 excel 并通过右键单击或通过 VBA 刷新 powerquery 进行刷新

enter image description here

评论

0赞 MSP 11/17/2023
感谢您的回答,但我弄错了,它是 Excel 2021 (Microsoft 365) 而不是 Excel 2010。道歉。我尝试了 @P.b 的 WRAPROWS 解决方案,它奏效了。
0赞 horseyride 11/17/2023
根据您的喜好,但此答案仍然适用于 excel 2021