我在 Excel 中拥有交错格式的数据。最左侧列中有一个客户 ID,该客户的详细信息位于不同列中的不同行中。我需要将数据重新排列到每个客户所在的一行中。所有其他客户的格式都相同。
CustomerID FirstName LastName Education Training TrainingYear City State Zip
1 John C Masters
1 SAP
1 2017
1 LA
1 CA
1 91433
2 Max G Bachelors
2 Oracle
2 2015
2 NR
2 CA
2 91234
答案1
用这个
=INDIRECT(CONCATENATE("A", ROW()*6-10))
将“A”更改为相应的列(B 表示名字、C 表示姓氏、D 表示教育背景,等等),并将“-10”更改为相应的列(-10 表示教育背景、-9 表示培训、-8 表示培训年份,...,-5 表示邮政编码)
适用于培训专栏
=INDIRECT(CONCATENATE("E", ROW()*6-9))
对于 Zip 列
=INDIRECT(CONCATENATE("H", ROW()*6-6))
致谢修复者1234评论。
这种直观的方法不起作用(或者至少不太方便,因为自动填充不能识别简单的 6 步骤模式):
CustomerID | Firstname | Lastname | Education | Training | TrainingYear | City | State | Zip
----------------------------------------------------------------------------------------------
=A2 | =B2 | =C2 | =D2 | =E3 | =F4 | =G5 | =H6 | =I7
=A8 | =B8 | =C8 | =D8 | =E9 | =F10 | =G11 | =H12 | =I13
答案2
我需要将数据重新排列到每个客户所在的一行。所有其他客户的数据格式都相同。
如果您熟悉运行宏。这是一个简单的嵌套循环:
Sub moveAndCleanup()
Call move
Call cleanup
End Sub
Sub move()
Dim row, col, i, j As Integer
row = 2
col = 4
j = 6
Do While Cells(row, 1).Value <> ""
For i = 1 To 5
Cells(row, col + i).Value = Cells(row + i, col + i).Value
Next i
row = row + j
Loop
End Sub
Sub cleanup()
Dim row, col, i, j As Integer
row = 2
col = 4
j = 6
Do While Cells(row, 1).Value <> ""
For i = 1 To 5
Cells(row + i, col + i).Value = ""
Cells(row + i, 1).Value = ""
Next i
row = row + j
Loop
End Sub
但请记住先复制您的数据或复制您的工作簿,因为您无法撤消宏。
答案3
这可以使用一些公式来实现,这些公式根据行计算要使用的单元格,就像 Adi Nugroho 的答案那样。事实上,您可以更进一步,对所有单元格使用一个公式。
1:单一配方解决方案
以下是一个示例(可以使用多种方法)。将列标题复制到另一张表。然后在 A2 中输入此公式:
=OFFSET(Sheet1!$A$2,ROW()*6-12+(COLUMN()>4)*(COLUMN()-4),COLUMN()-1)
将其复制到各列,然后根据需要复制行。它为您提供:
解释:
OFFSET 函数将新表固定到原始数据的第一个单元格,然后将每个单元格定义为距该单元格的偏移量。
ROW()*6-12
将原来的六行模式转换为单行间隔。
(COLUMN()>4)*(COLUMN()-4)
增加 E 列及以后的行引用。第一个括号包含一个逻辑测试,用于判断您是否超出了第 4 列,1
如果为真则返回,0
如果为假则返回。将其乘以超出 4 的列号以反映数据模式(第 5 列删除一行)。
COLUMN()-1
将实际列调整为偏移量(结果的第 1 列0
与数据的第 1 列偏移)。
因此,单一公式可以为结果中的每个单元格找到正确的源单元格。
2:无需脑细胞的解决方案
作为替代方案,有一个非常简单的解决方案,不需要任何花哨的功能。
从 Sheet1 中的数据开始:
将列标题复制到新工作表。
对于第一行,输入 Sheet 1 中数据的第一个单元格引用(在 A2 中):
=sheet1!A2
将其复制到 B2、C2 和 D2。然后将其复制到 E3、F4、G5、H6 和 I7。这将自动将单元格指向正确的位置。然后将 E 列到 I 列中的单元格拖(移动)到第 2 行,公式将保留。因此第 2 行将包含:
A2: =sheet1!A2
B2: =sheet1!B2
C2: =sheet1!C2
D2: =sheet1!D2
E2: =sheet1!E3
F2: =sheet1!F4
G2: =sheet1!G5
H2: =sheet1!H6
I2: =sheet1!I7
- 选择第 2 行的值并将它们复制到页面下方,复制的行数与工作表 1 上的数据相同。它看起来像这样:
它包含单行数据,但位于每个六行组的前几行中。请注意,如果 A 列的格式为数字(这不是问题),则 B 至 I 列中的行可能为零,而不是空白行。
我们通过另一个步骤消除多余的行。
- 选择整个表格并打开过滤。
- 在 B 列上进行过滤,并选择仅显示空单元格(或零,如果是空单元格)。过滤器将隐藏包含您值的行,并看起来像这样(或看起来像除 A 列之外的零行);即,仅显示额外的行:
- 选择所有可见数据行并通过右键菜单删除行:
- 现在关闭过滤,您将得到结果: