如何分割WPS中某个项目的分数据?

如何分割WPS中某个项目的分数据?

站长可乐
3月18日发布

以门店商品列表为例,我们可以通过筛选自提门店字段的数据,对文档进行分割成门店单数据文件。
步骤 1:打开宏编辑器(正确操作)
打开你的订单表格,按 Alt + F11 打开 VBA 编辑器(WPS/Excel 都支持);
左侧「工程资源管理器」→ 右键你的工作簿名称 → 插入 → 模块;
在模块里粘贴下面的 VBA 代码(已适配路径、门店名称、报错处理):

Sub SplitOrderByStore_WPS()
    ' 声明所有变量(WPS兼容版)
    Dim ws As Worksheet
    Dim dict As Object
    Dim lastRow As Long, storeCol As Long, i As Long, j As Long
    Dim storeName As String, savePath As String
    Dim newWB As Workbook, newWS As Worksheet
    Dim rowNum As Long
    Dim rowArr As Variant
    Dim keyArr As Variant ' 存储字典所有key的数组
    
    ' 1. 初始化工作表和字典
    Set ws = ActiveSheet
    Set dict = CreateObject("Scripting.Dictionary")
    dict.CompareMode = 1 ' 忽略大小写
    
    ' 2. 定位「自提门店」列(严格匹配表头)
    On Error Resume Next
    storeCol = ws.rows(1).Find(What:="自提门店", LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False).Column
    On Error GoTo 0
    If storeCol = 0 Then
        MsgBox "错误:未找到「自提门店」列,请检查表头(无空格/错别字)!", vbExclamation
        Exit Sub
    End If
    
    ' 3. 检查数据有效性
    lastRow = ws.Cells(ws.rows.Count, storeCol).End(xlUp).Row
    If lastRow < 2 Then
        MsgBox "错误:没有可拆分的订单数据(数据需从第2行开始)!", vbExclamation
        Exit Sub
    End If
    
    ' 4. 存储每个门店对应的行号(用字典分组)
    For i = 2 To lastRow
        storeName = Trim(ws.Cells(i, storeCol).Value)
        ' 过滤空门店名
        If storeName <> "" Then
            If Not dict.Exists(storeName) Then
                dict(storeName) = "" ' 初始化行号字符串
            End If
            dict(storeName) = dict(storeName) & i & "," ' 拼接行号(用逗号分隔)
        End If
    Next i
    
    ' 5. 若没有有效门店,直接退出
    If dict.Count = 0 Then
        MsgBox "错误:未识别到任何门店名称!", vbExclamation
        Exit Sub
    End If
    
    ' 6. 选择文件保存文件夹
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "选择拆分文件的保存文件夹"
        .AllowMultiSelect = False
        If .Show <> -1 Then Exit Sub ' 用户取消选择则退出
        savePath = .SelectedItems(1) & "\"
    End With
    
    ' 7. 把字典Keys转为数组(核心:用下标遍历替代For Each)
    keyArr = dict.Keys ' 提取所有门店名到数组
    
    ' 8. 批量导出每个门店的文件(纯下标遍历)
    Application.ScreenUpdating = False ' 关闭屏幕刷新,提速
    For j = 0 To UBound(keyArr) ' 遍历门店数组(下标从0开始)
        storeName = keyArr(j)
        
        ' 创建新工作簿和工作表
        Set newWB = Workbooks.Add
        Set newWS = newWB.Sheets(1)
        newWS.Name = "订单数据"
        
        ' 复制表头到新文件
        ws.rows(1).Copy newWS.rows(1)
        
        ' 拆分该行门店的所有行号,并用下标遍历
        rowNum = 2 ' 新表从第2行开始粘贴数据
        rowArr = Split(Left(dict(storeName), Len(dict(storeName)) - 1), ",") ' 去掉最后一个逗号
        
        ' 下标遍历行号数组(替代For Each)
        For i = 0 To UBound(rowArr)
            ws.rows(CLng(rowArr(i))).Copy newWS.rows(rowNum)
            rowNum = rowNum + 1
        Next i
        
        ' 处理门店名特殊字符(避免保存失败)
        Dim safeName As String
        safeName = Replace(Replace(Replace(Replace(storeName, "/", ""), "\", ""), ":", ""), "*", "")
        safeName = Replace(Replace(Replace(Replace(safeName, "?", ""), """", ""), "<", ""), ">", "")
        safeName = Replace(safeName, "|", "")
        
        ' 保存文件(兼容Excel/WPS格式)
        newWB.SaveAs Filename:=savePath & safeName & ".xlsx", FileFormat:=xlOpenXMLWorkbook
        newWB.Close SaveChanges:=False ' 关闭新文件
    Next j
    
    Application.ScreenUpdating = True ' 恢复屏幕刷新
    MsgBox "拆分成功!所有文件已保存到:" & vbCrLf & savePath, vbInformation
    
    ' 释放对象,避免内存泄漏
    Set ws = Nothing
    Set dict = Nothing
    Set newWB = Nothing
    Set newWS = Nothing
End Sub

步骤 2:点击编辑器顶部的「运行」按钮(▶️),或按F5;
步骤 3:在弹出的对话框中选择空文件夹(建议新建),点击「确定」;
步骤 4:等待几秒,弹出「拆分成功」提示后,去目标文件夹查看即可。

© 版权声明
THE END
喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
OωO
取消