如何基于另一列唯一值复制数据范围并粘贴到Excel其他工作表
你原有代码已经完成了序列号提取和去重的前置步骤,补充遍历、筛选、导出逻辑即可实现拆分需求,完整可运行代码如下:
Sub SplitDataByReceiptNumber() Dim wsSource As Worksheet Dim wsTemp As Worksheet Dim lastRowA As Long, lastRowAA As Long Dim i As Long Dim receiptNum As String Dim savePath As String ' 绑定数据所在工作表 Set wsSource = ActiveSheet ' 自定义拆分后csv的保存路径,默认和当前Excel文件同目录 savePath = ThisWorkbook.Path & "\" ' 保留你原有排序、提取序列号的逻辑 wsSource.Range("A:A").Sort Key1:=wsSource.Range("A:A"), Order1:=xlDescending, Header:=xlYes wsSource.Range("W1").Value = "Receipt Number" lastRowA = wsSource.Cells(Rows.Count, 1).End(xlUp).Row With wsSource.Range("W2:W" & lastRowA) .Formula = "=Left(A2, 4)" .Calculate .Value = .Value End With ' 提取不重复的序列号到AA列 wsSource.Range("W1:W" & lastRowA).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=wsSource.Range("AA1"), Unique:=True lastRowAA = wsSource.Cells(Rows.Count, "AA").End(xlUp).Row ' 逐个处理每个唯一序列号 For i = 2 To lastRowAA receiptNum = wsSource.Cells(i, "AA").Value ' 新建临时工作表存储对应序列号的数据 Set wsTemp = Workbooks.Add(xlWBATWorksheet).Sheets(1) ' 筛选当前序列号对应的所有行 wsSource.Range("A1:W" & lastRowA).AutoFilter Field:=23, Criteria1:=receiptNum ' 复制表头+筛选后的可见内容到临时表 wsSource.Range("A1:W" & lastRowA).SpecialCells(xlCellTypeVisible).Copy Destination:=wsTemp.Range("A1") ' 临时表另存为csv,文件名为对应序列号 wsTemp.SaveAs Filename:=savePath & receiptNum & ".csv", FileFormat:=xlCSVUTF8 wsTemp.Parent.Close SaveChanges:=False ' 清除筛选,处理下一个序列号 wsSource.AutoFilterMode = False Next i ' 可选:删除生成的W、AA辅助列 wsSource.Range("W:W").Delete wsSource.Range("AA:AA").Delete MsgBox "所有文件拆分完成,保存路径:" & savePath, vbInformation End Sub
使用注意:
- 运行前请确保当前活动工作表是你导入了combined.csv数据的页面
- 如果你的数据列数超过W列,把代码中所有
Range("A1:W" & lastRowA)里的W修改为你实际数据的最后一列列标即可 - 代码默认导出UTF-8编码的csv避免乱码,如有特殊编码需求可以自行修改
FileFormat参数
内容的提问来源于stack exchange,提问作者Lucas Biggio
相关产品推荐
相关产品推荐

