我的意思是我有一个包含 4 行的 Excel 文档
A B C D
1 Data1 Data2 Data3 Data4
2 Data5 Data6 Data7 Data8
我希望每个D行数据都进入下面一行并变成这样。
A B C
1 Data1 Data2 Data3
2 Data4 // First Data of D row on below line moved on line 2
3 Data5 Data6 Data7
4 Data8 // Second Data of D row on below line moved on line 4.
无论如何这可以做到吗?
提前致谢。-> 我使用 Excel 2007,但我想知道是否可以在较新版本的 Excel 上完成此操作。
编辑:所以我录制了一个宏来为一列完成此操作。如果我在两列之后再次运行它,它是否按我想要的方式完成。
The code of the macro is this:
Sub Μακροεντολή3()
'
' Μακροεντολή3 Μακροεντολή
'
'
Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
ActiveCell.Offset(-1, 3).Range("A1").Select
Selection.Cut
ActiveCell.Offset(1, -3).Range("A1").Select
ActiveSheet.Paste
End Sub
您能帮我循环遍历所有列直到步骤 2 结束吗?
提前致谢。
答案1
此公式可用于您的示例。它可用于创建一个新表,其中最后一列的每个值之前都添加了“换行符”。
=IFERROR(INDEX($A$1:$D$20,TRUNC((ROW()-ROW($F$1)+2)/2,0),COLUMN()-COLUMN($F$1)+1+MOD((ROW($F$1)-ROW()),2)*(COLUMNS($A$1:$D$20)-1)),"")
$A$1:$D$20
源表是否
$F$1
是新表的第一个单元格
对于上面使用的范围:将公式插入单元格 F1 并延伸到 H40。您可以通过在记事本中替换范围和起始单元格地址来调整公式(CTL+H 是您的好帮手)。
怎么运行的?
- 请参阅 INDEX 函数 Excel 帮助。
- 线条参数为:
TRUNC((ROW()-ROW($F$1)+2)/2,0)
,将其放置在任意单元格中并向下拉伸 - 它返回从 1 开始以 1 为增量的数字。此值每两行相同。 COLUMN()-COLUMN($F$1)+1+MOD((ROW($F$1)-ROW()),2)*(COLUMNS($A$1:$D$20)-1))
有点令人困惑,但它由两部分组成。第一部分:COLUMN()-COLUMN($F$1)+1
仅返回结果表中的行索引。第二部分:MOD((ROW($F$1)-ROW()),2)*(COLUMNS($A$1:$D$20)-1))
仅在偶数行上“有效”(因为MOD((ROW($F$1)-ROW()),2)
=1
,在奇数行中是MOD((ROW($F$1)-ROW()),2)
=0
并乘以最后一部分(COLUMNS($A$1:$D$20)-1)
,表示源表中的行数减 1。因此,当此公式在偶数行(第一列)时,INDEX 函数的列参数就是"column index in result table"+1*"column count in source table -1")
最后1+1*(4-1)
一列的索引。- IFERROR函数用于用空白单元格替换错误代码(当INDEX函数超出范围时)
""
。
PS:当您将结果表拉伸到与源表相同的列数时,您会在最后一列中得到不需要的值(可以通过使用一个 IF 函数来防止这种情况,但结果公式将更加复杂/混乱)
PPS:抱歉我的英语不好
答案2
@Lluser 的回答令人印象深刻。
我的答案可能更简单。同样,您可以通过将数据复制到另一个表(或一组列)来实现此目的。
您可以在三个新列 F、G 和 H 中使用三个公式,如下所示:
F1: =IF(MOD(ROW(),2)=1,INDIRECT(CONCATENATE("A",(ROUNDDOWN(ROW()/2,0))+1)),INDIRECT(CONCATENATE("D",(ROUNDDOWN(ROW()/2,0)))))
G1: =IF(MOD(ROW(),2)=1,INDIRECT(CONCATENATE("B",(ROUNDDOWN(ROW()/2,0))+1)),"")
H1: =IF(MOD(ROW(),2)=1,INDIRECT(CONCATENATE("C",(ROUNDDOWN(ROW()/2,0))+1)),"")
并将其填充为原始表的行数的两倍。
因此,它看起来应该有点像这样:
一些解释:
- 您将发现当前行是奇数还是偶数。新表中的每个奇数/偶数对都对应于原始表的一行(如果奇数行号“MOD(ROW(),2)=1”,则为真)。
- 如果新表中有奇数行,则您将从 AB 和 C 列中获取值。
- 如果新表中有偶数行并且您位于 G 或 H 之一中,那么您只会得到一个空字符串。
- 如果新表中有偶数行并且您在 F 列,那么您将取原始表的第 4 个值(D 列)。
第 2 点是通过以下方式实现的:
INDIRECT(CONCATENATE("A",(ROUNDDOWN(ROW()/2,0))+1))
它只是引用您要定位的行。“间接”是 Excel 从字符串(如 A1、A2 等)构建引用的特殊方法。在本例中,我使用 A 和新表要定位的行号构建一个字符串。
点 4 与点 2 非常相似,只是它在新表中对的第二行起作用。
希望这会有所帮助并能被理解。
答案3
答案4
当我尝试了您的所有答案时,我遵循了 Excel 上的宏构建。我做了一些事情,然后得到了堆栈,所以我在 stackoverflow 上发布了不同但仍然相同的问题。所以这是答案。 https://stackoverflow.com/questions/38085058/getting-a-column-on-the-next-row-on-excel-with-macro/38095470?noredirect=1#comment63633911_38095470
Sub ConvertColDtoRow()
'Note that this code is written specifically for column D, but it can be adjusted as needed by changing the column specified
Dim Count As Long, LastRow As Long
Count = 1
LastRow = ActiveSheet.UsedRange.Rows.Count
Do While Count <= LastRow
If Not IsEmpty(ActiveSheet.Cells(Count,4)) Then
Range(Cells(Count,4).Address).Offset(1,0).EntireRow.Insert
Cells(Count + 1,1).Value = Cells(Count,4).Value
Cells(Count,4).Value = ""
Count = Count + 2
LastRow = LastRow + 1
Else
Count = Count + 1
End If
Loop
End Sub
感谢@RGA。非常感谢大家抽出时间。