如何将多行订单数据规整为单行?多商品订单需复制关联信息
订单数据表规整解决方案
一、VBA宏实现(适合大数据量高效处理)
直接运行以下宏即可批量完成数据规整,核心逻辑是识别主行订单信息,批量匹配下方商品行并生成独立记录,最终输出到新工作表。
Sub 规整订单数据() Dim 原表 As Worksheet, 新表 As Worksheet Dim 主行号 As Long, 当前行 As Long, 新行号 As Long Dim 餐饮编号 As String, 客户姓名 As String, 客户地址 As String Set 原表 = ActiveSheet Set 新表 = ThisWorkbook.Sheets.Add(After:=原表) ' 自定义表头,需和你的数据表列对应 新表.Range("A1:F1") = Array("餐饮编号", "客户姓名", "客户地址", "商品名称", "商品价格", "备注") 新行号 = 2 主行号 = 2 ' 假设表头在第1行,数据从第2行开始 Do While 原表.Cells(主行号, 1).Value <> "" ' 以A列餐饮编号非空判断主行 ' 提取主行核心信息 餐饮编号 = 原表.Cells(主行号, 1).Value 客户姓名 = 原表.Cells(主行号, 2).Value 客户地址 = 原表.Cells(主行号, 3).Value ' 遍历下方商品行,直到遇到下一个主行或空行 当前行 = 主行号 + 1 Do While 原表.Cells(当前行, 1).Value = "" And 原表.Cells(当前行, 4).Value <> "" ' 以D列商品名称非空判断商品行 ' 写入新表 新表.Cells(新行号, 1).Value = 餐饮编号 新表.Cells(新行号, 2).Value = 客户姓名 新表.Cells(新行号, 3).Value = 客户地址 新表.Cells(新行号, 4).Value = 原表.Cells(当前行, 4).Value 新表.Cells(新行号, 5).Value = 原表.Cells(当前行, 5).Value ' 若有其他商品字段,可继续添加对应列赋值 新行号 = 新行号 + 1 当前行 = 当前行 + 1 Loop 主行号 = 当前行 Loop ' 自动调整列宽 新表.Columns.AutoFit MsgBox "数据规整完成!" End Sub
使用步骤
- 打开订单数据表,按
Alt+F11打开VBA编辑器 - 右键当前工作簿→插入→模块,粘贴上述代码
- 根据你的实际列位置,修改代码中的表头内容、列号判断条件(比如A列是餐饮编号、D列是商品名称,需和你的表对应)
- 返回工作表,按
Alt+F8选择宏并运行
二、Excel公式实现(无需启用宏)
假设你的数据结构:
- A列:餐饮编号(主行有值,商品行空)
- B列:客户姓名(主行有值,商品行空)
- C列:客户地址(主行有值,商品行空)
- D列:商品名称(主行空,商品行有值)
- E列:商品价格(主行空,商品行有值)
步骤1:添加辅助列标记主行关联编号
在原表F2单元格输入公式,下拉填充至所有行:
=IF(D2<>"",MAX($F$1:F1)+(A2<>""),IF(A2<>"",ROW(),""))
该公式会给每个主行及对应商品行分配同一个关联编号,方便后续匹配。
步骤2:在新工作表生成规整数据
新建工作表(比如Sheet2),在对应单元格输入以下公式:
- A2(餐饮编号):
=INDEX(Sheet1!A:A,MATCH(ROW(A2)-1,Sheet1!F:F,0))
- B2(客户姓名):
=INDEX(Sheet1!B:B,MATCH(ROW(A2)-1,Sheet1!F:F,0))
- C2(客户地址):
=INDEX(Sheet1!C:C,MATCH(ROW(A2)-1,Sheet1!F:F,0))
- D2(商品名称):
=INDEX(Sheet1!D:D,SMALL(IF(Sheet1!F:F=ROW(A2)-1,ROW(Sheet1!F:F)),COUNTIF(Sheet1!F:F,"<"&ROW(A2)-1)+1))
- E2(商品价格):
=INDEX(Sheet1!E:E,SMALL(IF(Sheet1!F:F=ROW(A2)-1,ROW(Sheet1!F:F)),COUNTIF(Sheet1!F:F,"<"&ROW(A2)-1)+1))
注意:D2、E2为数组公式,输入后需按Ctrl+Shift+Enter确认,再下拉填充直到出现错误值(表示所有数据处理完成)
内容的提问来源于stack exchange,提问作者Theo S
相关产品推荐
相关产品推荐

