ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] excel自动实现多层级BOM物料分解

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-9-25 11:38 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
输入产品月度需求,用excel分解得出最终使用的所有原料数量;目前主要使用vlookup逐级引用,遇到多级BOM,非常繁琐(实际的BOM有上万行),各位高手有没有好的方法,可以实现一次分解到最底层物料,不用多次分解。

BOM示例.rar

11.73 KB, 下载次数: 654

TA的精华主题

TA的得分主题

发表于 2015-9-25 11:42 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-9-25 17:05 | 显示全部楼层
本帖最后由 opiona 于 2015-9-25 17:10 编辑

代码适用于三级工序:成品、半成品、零件
需求中可以有:成品、半成品、零件,
代码的区别是:开头分别为:03/02/01,
也可以是其他形式,在代码中相应修改
原理:
1、将需求的成品03根据BOM分解为02和01
2、将需求中直接是:半成品02
3、将步骤1和2中的半成品02合并,再根据Bom分解为:零件01
4、需求中直接就是:零件01
5、将步骤1中03分解出来的01、步骤3中02分解出来的01、步骤4中直接是01 全部汇总求和

部分代码如下:

  1. '*********************************
  2. '*******  北极狐工作室出品  ******
  3. '*******  QQ:14885553      ******
  4. '*********************************

  5. Sub Opiona()

  6. 'On Error Resume Next    '// 发生错误,自动执行下一句,就是忽略错误
  7. Application.ScreenUpdating = False '//关闭屏幕刷新
  8. Application.DisplayAlerts = False '//关闭系统提示
  9. t = Timer   '//开始时间

  10.     Set SH0 = Sheets("BOM示例")  '//数据源
  11.     Set SH1 = Sheets("需求")     '//需求
  12.     Set SH2 = Sheets("所有原料数量")
  13.     SH2.Range("A2:Z65536").ClearContents
  14.    
  15.     Str_coon = "Provider=Microsoft.JET.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=yes';Data Source=" & ThisWorkbook.FullName      '//OFFICE2003
  16.     StrSQL = ""

  17.    
  18.     Rem 需求表中03转化为02和01
  19.     StrSQL1 = StrSQL1 & "SELECT 子物料编码,子单位,SUM(单耗AA) AS 单耗AC,SUM(单耗BA) AS 单耗AD FROM ("
  20.     StrSQL1 = StrSQL1 & "SELECT A.物料编码,B.子物料编码,B.子单位,A.计划AA*B.单耗 AS 单耗AA,A.计划BA*B.单耗 AS 单耗BA FROM ("
  21.     StrSQL1 = StrSQL1 & "SELECT 物料编码,[" & SH1.Cells(1, 4) & "] AS 计划AA,[" & SH1.Cells(1, 5) & "] AS 计划BA FROM [" & SH1.Name & "$] WHERE MID(物料编码,1,2)='03'"
  22.     StrSQL1 = StrSQL1 & ") AS A LEFT JOIN ("
  23.     StrSQL1 = StrSQL1 & "SELECT 物料编码,子物料编码,子单位,单耗 FROM [" & SH0.Name & "$]"
  24.     StrSQL1 = StrSQL1 & ") AS B ON A.物料编码=B.物料编码"
  25.     StrSQL1 = StrSQL1 & ") GROUP BY 子物料编码,子单位"
  26.    
  27.    
  28.     Rem 全部01汇总:
  29.     StrSQL = StrSQL & "SELECT 子物料编码 AS 物料编码,子单位 AS 单位,SUM(单耗BC) AS 计划AA,SUM(单耗BD) AS 计划BB FROM ("
  30.    
  31.     Rem 02转换为01:
  32.     StrSQL = StrSQL & "SELECT D.子物料编码,D.子单位,C.单耗AC*D.单耗 AS 单耗BC,C.单耗AD*D.单耗 AS 单耗BD FROM ("
  33.    
  34.     Rem 03提取后结果中的02
  35.     StrSQL = StrSQL & "SELECT 子物料编码 AS 物料编码,单耗AC,单耗AD FROM (" & StrSQL1 & ") WHERE MID(子物料编码,1,2)='02'"
  36.     StrSQL = StrSQL & " UNION ALL "
  37.     Rem 需求表中直接是02的
  38.     StrSQL = StrSQL & "SELECT 物料编码,[" & SH1.Cells(1, 4) & "] AS [单耗AC],[" & SH1.Cells(1, 5) & "] AS [单耗AD] FROM [" & SH1.Name & "$] WHERE MID(物料编码,1,2)='02'"
  39.    
  40.     StrSQL = StrSQL & ") AS C LEFT JOIN ("
  41.     StrSQL = StrSQL & "SELECT 物料编码,子物料编码,子单位,单耗 FROM [" & SH0.Name & "$] WHERE MID(物料编码,1,2)='02'"
  42.     StrSQL = StrSQL & ") AS D ON C.物料编码=D.物料编码"
  43.    
  44.     Rem 03提取后结果中的01
  45.     StrSQL = StrSQL & " UNION ALL "
  46.     StrSQL = StrSQL & "SELECT 子物料编码,子单位,单耗AC AS 单耗BC,单耗AD AS 单耗BD FROM (" & StrSQL1 & ") WHERE MID(子物料编码,1,2)='01'"
  47.    
  48.     Rem 需求表中直接是01的
  49.     StrSQL = StrSQL & " UNION ALL "
  50.     StrSQL = StrSQL & "SELECT 物料编码 AS 子物料编码,单位 AS 子单位,[" & SH1.Cells(1, 4) & "] AS 单耗BC,[" & SH1.Cells(1, 5) & "] AS 单耗BD FROM [" & SH1.Name & "$] WHERE MID(物料编码,1,2)='01'"
  51.   
  52.     StrSQL = StrSQL & ") GROUP BY 子物料编码,子单位 ORDER BY 子物料编码"
  53.    
  54.     SQLARR = GET_SQL_To_Arr(StrSQL, Str_coon, False)
  55.     SH2.Range("B2").Resize(UBound(SQLARR, 1) + 1, UBound(SQLARR, 2) + 1) = SQLARR
  56.    
  57.     Rem 序号
  58.     For I = 2 To SH2.Range("B65536").End(3).Row
  59.         SH2.Cells(I, 1) = I - 1
  60.     Next I
  61.    
  62. Application.ScreenUpdating = True '//恢复屏幕刷新
  63. Application.DisplayAlerts = True '//恢复系统提示
  64. MsgBox "一共用时:" & Format(Timer - t, "#0.0000") & " 秒", , "北极狐提示!!"  '//提示所用时间
  65. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-9-25 17:11 | 显示全部楼层
opiona 发表于 2015-9-25 17:05
代码适用于三级工序:成品、半成品、零件
需求中可以有:成品、半成品、零件,
代码的区别是:开头分别为 ...

我的个天,你这是根据他的写出来的吗?

TA的精华主题

TA的得分主题

发表于 2015-9-25 17:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
完整代码见附件: BOM示例三级.rar (22.39 KB, 下载次数: 1257)

BOM表有点改动,标题不能有重复

TA的精华主题

TA的得分主题

发表于 2018-2-6 11:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
厉害,收藏了

TA的精华主题

TA的得分主题

发表于 2018-4-15 11:19 | 显示全部楼层
本帖最后由 h749600173 于 2018-4-15 11:32 编辑
opiona 发表于 2015-9-25 17:12
完整代码见附件:

BOM表有点改动,标题不能有重复

请教OPIONA,如果BOM有8~9阶,应如何操作?如果可以,在扣除库存后,把每一层的成品,半品,物料的需求分别计算出来,谢谢!

TA的精华主题

TA的得分主题

发表于 2018-4-15 11:53 | 显示全部楼层
本帖最后由 opiona 于 2018-4-15 11:58 编辑
h749600173 发表于 2018-4-15 11:19
请教OPIONA,如果BOM有8~9阶,应如何操作?如果可以,在扣除库存后,把每一层的成品,半品,物料的需求分 ...

找到高手的递归方式,没有级别限制的!
BOM各层需求计算,需要扣除每层的库存和在线后再往下展开需求-原始.rar (29.58 KB, 下载次数: 1025)

我做的附件还没加入扣除库存

BOM拆解-基本代码.rar (23.55 KB, 下载次数: 685)


TA的精华主题

TA的得分主题

发表于 2018-4-16 19:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
opiona 发表于 2018-4-15 11:53
找到高手的递归方式,没有级别限制的!

谢谢OPIONA!

TA的精华主题

TA的得分主题

发表于 2018-4-16 23:14 | 显示全部楼层

OPIONA,再次谢谢你。请帮按附件的内容及要求写个代码,实现库存 (缺料表)中的那个要求。谢谢!



BOM1及物料需求问题.zip

991.07 KB, 下载次数: 288

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-25 21:04 , Processed in 0.035540 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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