ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 用VBA对上万条明细按指定条件拆分成多个工作簿

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-5-23 12:31 | 显示全部楼层 |阅读模式
本帖最后由 ppzzww 于 2024-5-23 14:27 编辑

背景:
1、 因开票数量很大,购买方300个左右,每个购买方有几百上千条货物明细,总明细12万条左右。
2、 税务局开票系统每次最多只导入4500条以下的明细。
3、 开票明细表中:“1-发票基本信息”为购买方信息,每个购买方一行且不重复;“2-发票明细信息”是所有购买方对应的货物明细。
4、 开票明细表中,每个工作表的1-3行为固定行抬头,行列固定。


需求:将以下条件拆分的数据生成到“开票模板”中,保持1-3行抬头不变。注“开票模板”与“开票明细”都一样,只是模版中无明细数据。

第1步:“开票明细”表中“2-发票明细信息”表进行拆分:
1)  先对A列(该列4行及以下行)进行升序排序,其他列同时扩展变化。
2)  对所行(4行及以下行),每隔4000条(建议以A列计数)拆分为新的工作簿,并保存到当前文件夹中,新工作簿名:自然序号+年月日+零件开票拆分,如”1-240523-零件开票拆分“。

第2步:“开票明细”表中“1-发票基本信息“表:根据“2-发票明细信息”拆分的购买方,删除本表中其他的购买方,只保留本次拆分的购买方行信息。例如:第一步中拆分明细中A列有4个购买方(去重),本表只保留这4个的信息,其他信息删除。

如此循环上述第1-2步,直到全部拆分完。


注意:
1、拆分后生成的新工作簿中的:1-发票基本信息“、2-发票明细信息、3-特定业务信息、4-附加要素信息,这四个工作表名都要保留且表名不变、1-3行固定行列内容保持不变。
2,第1步第2点是对4行以下的所有行列拆分到新工作簿中,不是只对A列拆分。
3,新的工作表跟原模板中的所有工作表名及工作表数量及每个工作表抬头一致。

开票明细及开票模板.zip

681.84 KB, 下载次数: 9

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-23 12:58 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
补充:
1,第1步第2点是对4行以下的所有行列拆分到新工作簿中,不是只对A列拆分。
2,新的工作表跟原模板中的所有工作表名及工作表数量及每个工作表抬头一致。

TA的精华主题

TA的得分主题

发表于 2024-5-23 16:07 | 显示全部楼层
本帖最后由 ykcbf1100 于 2024-5-23 19:50 编辑

不需要模板。

附件更新一下。

开票明细及开票模板.7z

1.31 MB, 下载次数: 19

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-23 16:08 | 显示全部楼层
本帖最后由 ykcbf1100 于 2024-5-23 19:51 编辑

参与一下。。。
  1. Sub ykcbf()  '//2024.5.23
  2.     Application.ScreenUpdating = False
  3.     Application.DisplayAlerts = False
  4.     Set d = CreateObject("scripting.dictionary")
  5.     Set d1 = CreateObject("scripting.dictionary")
  6.     Set ws = ThisWorkbook
  7.     fn = [{"1-发票基本信息","2-发票明细信息","3-特定业务信息","4-附加要素信息"}]
  8.     Set sh = ws.Sheets("2-发票明细信息")
  9.     p = ThisWorkbook.Path & ""
  10.     With sh
  11.         r = .Cells(Rows.Count, 1).End(3).Row
  12.         Set Rng = .[a4].Resize(r - 3, 13)
  13.         Rng.Sort .[a4], 1
  14.         arr = Rng.Value
  15.     End With
  16.     p1 = 4000
  17.     For i = 1 To r
  18.         m = m + 1
  19.         If i = 1 Then n = 1: d(1) = Array(1, IIf(r - 3 < p1, r - 3, p1))
  20.         k = m / p1
  21.         If Int(k) = k And k > 0 Then
  22.             n = n + 1
  23.             d(n) = Array(m + 1, IIf(m + p1 > UBound(arr), UBound(arr), m + p1))
  24.         End If
  25.     Next
  26.     t = d.items
  27.     rq = Format(Date, "yymmdd")
  28.     On Error Resume Next
  29.     For k = 1 To d.Count
  30.         ws.Sheets(fn).Copy
  31.         Set wb = ActiveWorkbook
  32.         m = 0
  33.         ReDim brr(1 To 4000, 1 To 13)
  34.         d1.RemoveAll
  35.         With wb.Sheets(sh.Name)
  36.             .DrawingObjects.Delete
  37.             For i = d(k)(0) To d(k)(1)
  38.                 m = m + 1
  39.                 For j = 1 To UBound(arr, 2)
  40.                     brr(m, j) = arr(i, j)
  41.                 Next
  42.                 s = brr(m, 1)
  43.                 d1(s) = ""
  44.             Next
  45.             .Columns(3).NumberFormatLocal = "@"
  46.             .[a4].Resize(m, 13) = brr
  47.             .UsedRange.Offset(m + 3).Clear
  48.         End With
  49.         c = 0
  50.         With wb.Sheets(fn(1))
  51.             r = .Cells(Rows.Count, 1).End(3).Row
  52.             crr = .[a4].Resize(r - 3, 26)
  53.             .UsedRange.Offset(3).ClearContents
  54.             ReDim zrr(1 To UBound(crr), 1 To UBound(crr, 2))
  55.             For i = 1 To UBound(brr)
  56.                 s = crr(i, 1)
  57.                 If d1.exists(s) Then
  58.                     c = c + 1
  59.                     For j = 1 To UBound(crr, 2)
  60.                         zrr(c, j) = crr(i, j)
  61.                     Next
  62.                 End If
  63.             Next
  64.             .Columns(3).NumberFormatLocal = "@"
  65.             .[a4].Resize(c, 26) = zrr
  66.         End With
  67.         wb.SaveAs p & k & "-" & rq & "-零件开票拆分"
  68.         wb.Close
  69.     Next
  70.     Set d = Nothing
  71.     Application.ScreenUpdating = True
  72.     MsgBox "OK!"
  73. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-23 16:19 | 显示全部楼层
两表同时打开,没有排序语句,请手动排序后运行开票明细里的过程test。
image.png

开票明细.zip

692.34 KB, 下载次数: 9

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-23 16:51 | 显示全部楼层
ykcbf1100 发表于 2024-5-23 16:07
不需要模板。

附件供参考。。。

感谢,大哥。
我发现拆分的工作簿有以下问题:
1、第一个拆分的明细是4000条,但从第二个拆分的表开始就是8000,12000,而不是每个拆分的表明细都是4000或以下。(我需要拆分出来的每个表最多不超过4000行)

2、“1-发票基本信息”,这个表没有任何变化,麻烦看看能做到以下要求吗?相当于“2-发票明细信息”拆分后,”1-发票基本信息”这个表也同时按以下要求更新。
条件:“1-发票基本信息“表:根据“2-发票明细信息”拆分的购买方,删除本表中其他的购买方(A列),只保留本次拆分的购买方行信息。例如:本次拆分后“2-发票明细信息”中A列有4个购买方(去重),本表“1-发票基本信息“表只保留这4个的信息,其他信息删除。

3、麻烦生成的新工作簿自动放在当前文件夹中。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-23 17:24 | 显示全部楼层
半百 发表于 2024-5-23 16:19
两表同时打开,没有排序语句,请手动排序后运行开票明细里的过程test。

谢谢,能否对在目前的基础上对”1-发票基本信息”实现以下要求,谢谢。

“1-发票基本信息”,这个表没有任何变化,麻烦看看能做到以下要求吗?相当于“2-发票明细信息”拆分后,”1-发票基本信息”这个表也同时按以下要求更新。
条件:“1-发票基本信息“表:根据“2-发票明细信息”拆分的购买方,删除本表中其他的购买方(A列),只保留本次拆分的购买方行信息。例如:本次拆分后“2-发票明细信息”中A列有4个购买方(去重),本表“1-发票基本信息“表只保留这4个购买方的信息,其他购买方信息删除。

TA的精华主题

TA的得分主题

发表于 2024-5-23 19:52 | 显示全部楼层
ppzzww 发表于 2024-5-23 16:51
感谢,大哥。
我发现拆分的工作簿有以下问题:
1、第一个拆分的明细是4000条,但从第二个拆分的表开始 ...

代码更新。。。

开票明细及开票模板.7z

1.31 MB, 下载次数: 27

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-24 09:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ppzzww 发表于 2024-5-23 17:24
谢谢,能否对在目前的基础上对”1-发票基本信息”实现以下要求,谢谢。

“1-发票基本信息”,这个表没 ...

不好意思,后边加两句
image.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-24 11:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

太完美了,另外,有一个需要变化,麻烦再帮忙看看(最后一个需求,其他需求不变)

表”2-发票明细信息“,第每一个4000行拆分时,可能会出现A列同一个购买方被拆分到下一个表中,能否判断一下,如果拆分时A列同一个购买方明细刚好被拆分,刚本次不取4000行拆分,而是折分到最近的一个购买方,本次不拆分就放到下一个拆分表中。

其实简单理解就是:A列的同一个购买方放在一起,即一个表中(不会被拆分到下一表中),且不超过4000行。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 09:28 , Processed in 0.056733 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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