![Excel:数据布局之间的转换](https://linux22.com/image/1345649/Excel%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%B8%83%E5%B1%80%E4%B9%8B%E9%97%B4%E7%9A%84%E8%BD%AC%E6%8D%A2.png)
我的情况如下。有几组行。每组上方都有一个小“标题”,描述该组内所有行共有的数据字段。我想创建一个包含所有内容的数据透视表并包含该字段(GroupID),因此我想要该表的第二个版本。有没有办法不录制宏就做到这一点?或者有没有办法直接创建数据透视表?
我有:
群组编号 4 姓名 电子邮件 喜欢 不喜欢 herpina 某物蛋糕 Excel derpina 某物 Cake Excel 群组编号 5 姓名 电子邮件 喜欢 不喜欢 大笑某事蛋糕嗯 roflomg 某事 烘焙测试 testtttt 某事 睡眠 22 群组编号 1 姓名 电子邮件 喜欢 不喜欢 OAG 某事 OAB 不适用 OAB 某事 N/A/A
期望:
姓名 电子邮件 喜欢 不喜欢 GroupID herpina 某物蛋糕 Excel 4 derpina 某物 Cake Excel 4 大笑某事蛋糕嗯 5 roflomg 某事烘焙测试 5 testtttt 某事 睡眠 22 5 OAG 某事 OAB N/A 1 OAB 某事 N/AN/A 1
答案1
这是尽可能短的宏
- 打开 Excel 并按ALT+F11
- 将下面的代码插入到工作表1或者你的数据在哪里
关闭 VBA 编辑器并按ALT+F8并执行宏
Sub deletelines() Range("A4:D4").Copy Range("A1").Insert Shift:=xlToRight For i = 2 To Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row c = Cells(i - counter, 1) if IsNumeric(c) And c <> "" Then groupID = c If c = "" Or c = "Name" Or c = "GroupID" Or IsNumeric(c) Then Rows(i - counter).Delete counter = counter + 1 Else Cells(i - counter, 5) = groupID End If Next i End Sub
由于这是一个问答网站,我描述了代码。这样,其他人就可以轻松调整和自定义代码,这可能会有所帮助。
- 1+14 行:开始和结束宏(子程序)
- 第 2+3 行:复制范围 [A4:D4] 并将其插入到 [A1] 之前。这构成了标题行
Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
确定最后使用的单元格。在您的示例中,其为 22- 第 4 行:是一个从 2 开始到 22 结束的循环。
i
用作行索引 - 第 5 行:保存当前行的第一个单元格。一般语法是
cells(rownumber,columnnumber)
注意:由于我们删除了行,因此我们必须减去已经删除的行数。 - 第 6 行:查看是否
c
为数字,并将其保存为我们当前的 groupID,直到找到另一个数字 - 第 7 行:是检查当前单元格值是否为“名称”、“GroupID”、空白或数字的条件。
- 第 8 行:如果条件为真,则删除整行
- 第 9 行:如果条件为真,则计算我们的删除了多少行柜台
- 第 10-12 行:如果条件为假,那么这必须是我们想要保留的良好数据行
- 第 13 行:循环到下一行
i
,代表当前行