ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 178|回复: 7

[求助] 按生产单号拆分出现越界问题求改代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-5-11 13:24 | 显示全部楼层 |阅读模式
本帖最后由 jaxpqh 于 2024-5-11 13:58 编辑

  这是我上一个帖子(https://club.excelhome.net/thread-1691403-1-1.html?_dsign=aad8323c)的延续,我需要按生产单号拆分表格,原来的要求确实有些复杂,我改变了思路,按每个生产单号一个工作簿进行拆分,同一个月的生产单放在同一个文件夹,而且实现了自动插入图片。如果一个生产单号只有一行内容,我可以拆分出来。现在的问题是,一个生产单号有多行内容时,需要以货品名称来区分,拆分后的表格放在同一工作簿的不同工作表,但写出来的代码运行出错,下标越界,找不出是什么原因。请哪位大师帮我修改一下代码。先谢谢了!

拆分生产单.rar

1.66 MB, 下载次数: 23

TA的精华主题

TA的得分主题

发表于 2024-5-11 13:30 | 显示全部楼层
不能SQL,等其他大佬的数组与字典法。

TA的精华主题

TA的得分主题

发表于 2024-5-11 14:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这是我的理解,仅供参考
image.png
image.png

生产单.zip

39.43 KB, 下载次数: 4

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-11 15:18 | 显示全部楼层
到我的主题里面去找找,有一个拆分工具可以选择主拆分关键字和次拆分关键字拆分,可以满足你的需求

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-11 17:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub 批量拆分()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set fso = CreateObject("Scripting.FileSystemObject")
Set d = CreateObject("scripting.dictionary")
Set dc = CreateObject("scripting.dictionary")
Set sh = ThisWorkbook.Worksheets("模板")
lj = ThisWorkbook.Path & "\生产单\"
tt = Timer
With ThisWorkbook.Worksheets("总表")
    .AutoFilterMode = False
    r = .Cells(.Rows.Count, 4).End(xlUp).Row
    c = .Cells(1, .Columns.Count).End(xlToLeft).Column
    arr = .Range("a1").Resize(r, c)
End With
For i = 2 To UBound(arr)
    If arr(i, 3) <> "" Then
        If IsDate(arr(i, 3)) Then
            nf = Year(arr(i, 3))
            yf = Month(arr(i, 3))
            dc(nf & "|" & yf) = ""
        End If
    End If
Next i
For Each kc In dc.keys
    rr = Split(kc, "|")
    ny = rr(0)
    yf = rr(1)
    wjj_1 = lj & nf & "年"
    wjj_2 = lj & nf & "年\" & yf & "月"
    If Not fso.folderexists(wjj_1) Then fso.CreateFolder wjj_1
    If Not fso.folderexists(wjj_2) Then fso.CreateFolder wjj_2
Next kc
For i = 2 To UBound(arr)
    If arr(i, 1) <> "" Then
        If Not d.exists(arr(i, 1)) Then Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
        d(arr(i, 1))(arr(i, 7)) = i
    End If
Next i
rr = Array([b3].Address, [e3].Address, [h3].Address, [b4].Address, [e4].Address, [h4].Address, [b5].Address, [e5].Address, [h5].Address, [c6].Address, [c7].Address, [c8].Address, [h8].Address)
For Each k In d.keys
    m = 0
    For Each kk In d(k).keys
        xh = d(k)(kk)
        nf = Year(arr(xh, 3))
        yf = Month(arr(xh, 3))
        m = m + 1
        If m = 1 Then
            sh.Copy
            Set wb = ActiveWorkbook
        ElseIf m > 1 Then
            sh.Copy after:=wb.Worksheets(wb.Worksheets.Count)
        End If
        With wb.ActiveSheet
            .Name = kk
            For j = 1 To 13
                .Range(rr(j - 1)) = arr(xh, j)
            Next j
            h = 9
            For j = 14 To 18 Step 2
                h = h + 1
                .Cells(h, 2) = arr(xh, j)
                .Cells(h, 7) = arr(xh, j + 1)
            Next j
            h = 13
            For j = 20 To 24 Step 2
                h = h + 1
                .Cells(h, 2) = arr(xh, j)
                .Cells(h, 7) = arr(xh, j + 1)
            Next j
            h = 17
            For j = 26 To 30 Step 2
                h = h + 1
                .Cells(h, 2) = arr(xh, j)
                .Cells(h, 7) = arr(xh, j + 1)
            Next j
            h = 21
            For j = 32 To 35 Step 1
                h = h + 1
                .Cells(h, 2) = arr(xh, j)
            Next j
            End With
        Next kk
    wb.SaveAs Filename:=lj & nf & "年\" & yf & "月\" & k & ".xlsx"
    wb.Close
Next k
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "导出完毕,用时:" & Format(Timer - tt, "#0.00") & " 秒", , "棋子提示"
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-11 17:21 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-5-11 17:22 | 显示全部楼层
代码仅仅提供一个解决问题的思路,插入图片的代码没有写,自己添加吧,供参考,

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-12 20:13 | 显示全部楼层
3190496160 发表于 2024-5-11 17:20
Sub 批量拆分()
Application.ScreenUpdating = False
Application.DisplayAlerts = False

  老师的代码高大上,可我看不太懂!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-23 10:19 , Processed in 0.042358 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表