基于订单发货次数生成动态多行表格的实现方案求助
解决方案:拆分订单号为多行(按发货次数)
一、Excel公式实现(优先推荐,支持复制粘贴数据)
1. 动态数组公式(Excel 365/2021及以上版本)
假设原数据在A列(订单号)和B列(发货次数),表头在第1行,数据从第2行开始:
- 在新表格的第一个单元格(比如
D2)输入以下公式,按回车后会自动生成所有拆分后的订单号:
=TOCOL(IF(SEQUENCE(,MAX(B:B))<=B:B,A:A,""),2)
- 公式说明:
SEQUENCE(,MAX(B:B))生成列数等于最大发货次数的序列IF(...)判断每个订单的发货次数是否大于等于序列数值,是则返回订单号,否则为空TOCOL(...,2)提取所有非空值,生成单列结果
2. 兼容旧版Excel的数组公式
如果使用无动态数组的旧版Excel:
- 在新表格的
D2单元格输入数组公式,按Ctrl+Shift+Enter确认(不要直接按回车):
=INDEX($A$2:$A$100,SMALL(IF($B$2:$B$100>=ROW(INDIRECT("1:"&MAX($B$2:$B$100))),ROW($B$2:$B$100)-ROW($B$2)+1,""),ROW(A1)))
- 拖动
D2单元格的填充柄向下,直到出现#NUM!错误为止,停止拖动即可
二、VBA代码实现
若公式无法满足需求,可使用VBA宏批量处理:
- 按
Alt+F11打开VBA编辑器 - 插入新模块,粘贴以下代码:
Sub SplitShipments() Dim srcSheet As Worksheet, destSheet As Worksheet Dim lastSrcRow As Long, currentRow As Long, destRow As Long, shipCount As Long '指定原表和新表的工作表名,根据实际修改 Set srcSheet = ThisWorkbook.Worksheets("原表") Set destSheet = ThisWorkbook.Worksheets("拆分结果") '清空新表原有数据(表头除外) destSheet.Range("A2:B" & destSheet.Rows.Count).ClearContents '写入新表表头 destSheet.Cells(1, 1).Value = "Order No." destSheet.Cells(1, 2).Value = "Shipment Sequence" '发货序号,可选 lastSrcRow = srcSheet.Cells(srcSheet.Rows.Count, "A").End(xlUp).Row destRow = 2 '新表数据从第2行开始 '遍历原表数据 For currentRow = 2 To lastSrcRow shipCount = srcSheet.Cells(currentRow, "B").Value '按发货次数复制订单号 For i = 1 To shipCount destSheet.Cells(destRow, "A").Value = srcSheet.Cells(currentRow, "A").Value destSheet.Cells(destRow, "B").Value = i '写入发货序号,不需要可删除此行 destRow = destRow + 1 Next i Next currentRow End Sub
- 修改代码中
原表和拆分结果为实际工作表名称 - 按
F5运行宏,即可生成拆分后的表格
内容的提问来源于stack exchange,提问作者Lawrence Ferguson
相关产品推荐
相关产品推荐

