ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 缺料表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-4-27 09:30 | 显示全部楼层
h749600173 发表于 2018-4-26 16:32
对求缺料表的BOM作一下说明,可能这样表达比较直观。

看不懂BOM表
习惯看这种:
1.jpg

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-27 13:04 | 显示全部楼层

代码要放在哪里运行?我再把资料重新整理及作相应的说明,看看对你写码有没有帮助?

BOM1及物料需求-说明.rar

939.77 KB, 下载次数: 83

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-27 13:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
opiona 发表于 2018-4-27 09:30
看不懂BOM表
习惯看这种:

我再把资料重新整理及作相应的说明,看看对你写码有没有帮助?看上一楼,谢谢!

TA的精华主题

TA的得分主题

发表于 2018-4-27 15:32 | 显示全部楼层
h749600173 发表于 2018-4-24 10:03
因为BOM为多阶层,好多成品下的半品是共用的,采购物料大部分也是共用的。

亲,你的BOM表的建立就有问题呀.
如果在第二阶中是共用的, 那就要把这个在存货中也建立,才能被索引.

TA的精华主题

TA的得分主题

发表于 2018-4-27 19:34 来自手机 | 显示全部楼层
h749600173 发表于 2018-4-27 13:04
代码要放在哪里运行?我再把资料重新整理及作相应的说明,看看对你写码有没有帮助?

你计算的结果和我的不一样的很多,不知道你是如何得出这些结果的。你如果有试验的数据需要运行比对,可以,按照我的stu.xls.zip里excel文件的格式把数据准备好发给我,我在服务器上运行。

TA的精华主题

TA的得分主题

发表于 2018-4-27 19:38 来自手机 | 显示全部楼层
我是手机,那位老师下载了22楼的附件,方便把代码贴出来,大家学习学习吧,先谢谢了。

TA的精华主题

TA的得分主题

发表于 2018-4-27 20:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zpy2 发表于 2018-4-27 19:38
我是手机,那位老师下载了22楼的附件,方便把代码贴出来,大家学习学习吧,先谢谢了。

只是一种方式,结果不一定正确
思路是论坛的,不过很好用!

代码太长,给出主要函数

  1. Private Function Get_data(PN, QTY, DATEX)
  2.     Rem 编码,用量
  3.     Rem 在BOM表中找
  4.     Dim DOU2 As Double
  5.     Dim A As Long
  6.    
  7.     For A = 0 To UBound(Arr_BOM, 1)
  8.         Rem 存在此编码
  9.         If Arr_BOM(A, 0) = PN Then
  10.             If Dic_temp.exists(Arr_BOM(A, 2)) Then
  11.                 Rem 如果词典中存在子件,就进行递归
  12.                 Get_data = Get_data(Arr_BOM(A, 2), Deduct_Stock(Arr_BOM(A, 2), Arr_BOM(A, 3), Arr_BOM(A, 4), QTY, DATEX), DATEX)
  13.             Else
  14.                 Rem 如果已经是最底层,则操作公用数组
  15.                 Rem 加一个一行
  16.                 If IsNull(Arr_BOM(A, 3)) = True Then Arr_BOM(A, 3) = " "
  17.                 DOU2 = Deduct_Stock(Arr_BOM(A, 2), Arr_BOM(A, 3), Arr_BOM(A, 4), QTY, DATEX)
  18.                
  19.                 ReDim Preserve Arr_结果(0 To UBound(Arr_结果, 1), 0 To UBound(Arr_结果, 2) + 1)
  20.                 Arr_结果(0, UBound(Arr_结果, 2)) = Arr_BOM(A, 2)
  21.                 Arr_结果(1, UBound(Arr_结果, 2)) = Arr_BOM(A, 3)
  22.                 Arr_结果(2, UBound(Arr_结果, 2)) = DATEX
  23.                 Arr_结果(3, UBound(Arr_结果, 2)) = DOU2
  24.                 Arr_结果(4, UBound(Arr_结果, 2)) = "BOM"
  25.             End If
  26.         End If
  27.     Next A
  28.    
  29.    
  30. End Function


  31. Private Function Deduct_Stock(PN, NAME, Usage, Demand_Qty, DATEX)
  32.     Rem 检查库存,将需求从库存中扣除
  33.     Dim DOU1, DOU2 As Double
  34.     Dim A As Long
  35.     Dim DATE1 As Date
  36.     DOU1 = Usage * Demand_Qty
  37.     DOU2 = 0
  38.     If IsNull(Usage) = True Then Usage = 0
  39.     If IsNull(NAME) = True Then NAME = " "
  40.    
  41.     For A = LBound(Arr_库存, 1) + 1 To UBound(Arr_库存, 1)
  42.         Rem 找到此父件,日期
  43.         If Arr_库存(A, 2) = PN Then
  44.             If Arr_库存(A, 4) >= DOU1 Then
  45.                 Rem 如果库存大于所需,库存中扣减掉此次用量
  46.                 DOU2 = Usage * Demand_Qty
  47.             Else
  48.                 Rem 如果库存小于所需,库存=0,扣减库存后数量向BOM表找
  49.                 DOU2 = Arr_库存(A, 4)
  50.             End If
  51.             Arr_库存(A, 4) = Arr_库存(A, 4) - DOU2
  52.             If DOU2 > 0 And DOU1 > 0 Then
  53.                 ReDim Preserve Arr_结果(0 To UBound(Arr_结果, 1), 0 To UBound(Arr_结果, 2) + 1)
  54.                 Arr_结果(0, UBound(Arr_结果, 2)) = PN
  55.                 Arr_结果(1, UBound(Arr_结果, 2)) = NAME
  56.                 Arr_结果(2, UBound(Arr_结果, 2)) = DATEX
  57.                 Arr_结果(3, UBound(Arr_结果, 2)) = DOU2
  58.                 Arr_结果(4, UBound(Arr_结果, 2)) = "库存"
  59.                 DOU1 = DOU1 - DOU2
  60.             End If
  61.         End If
  62.     Next A
  63.    
  64.     Rem 如果库存无数据,则全部向BOM表找
  65.     Deduct_Stock = DOU1  '//Usage * Demand_Qty - DOU2
  66. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-4-27 20:41 | 显示全部楼层
调用函数:

  1.     Rem ===============================================================================================初始化结果
  2.     ReDim Arr_结果(0 To 4, 0 To 0)
  3.     Arr_结果(0, 0) = "编码"
  4.     Arr_结果(1, 0) = "名称"
  5.     Arr_结果(2, 0) = "日期"
  6.     Arr_结果(3, 0) = "数量"
  7.     Arr_结果(4, 0) = "出处"
  8.    
  9.    
  10.     Rem ===============================================================================================将Bom表初始化到词典
  11.     Set Dic_temp = CreateObject("Scripting.Dictionary")
  12.     For C = LBound(Arr_BOM, 1) To UBound(Arr_BOM, 1)
  13.         If Not Dic_temp.exists(Arr_BOM(C, 0)) Then
  14.             Dic_temp(Arr_BOM(C, 0)) = ""
  15.         End If
  16.     Next C
  17.    
  18.     Rem ===============================================================================================获得初步结果
  19.     For B = 3 To UBound(Arr_需求, 2) Step 2
  20.         For A = 1 To UBound(Arr_需求, 1)
  21.             SkuTemp = Arr_需求(A, 0)  '//父件名
  22.             NameTemp = Arr_需求(A, 1) '//父件名
  23.             DemandDate = Arr_需求(A, B) '//需求日期
  24.             Rem 存在需求
  25.             If Arr_需求(A, B + 1) > 0 Then
  26.                 Rem  提示信息,在状态栏显示
  27.                 Application.StatusBar = "正在拆解BOM数据,当前父件编码:" & SkuTemp
  28.                 DoEvents
  29.                 Rem 扣除库存后的
  30.                 Call Get_data(Arr_需求(A, 0), Deduct_Stock(SkuTemp, NameTemp, 1, Arr_需求(A, B + 1), DemandDate), DemandDate)
  31.             End If
  32.         Next A
  33.     Next B
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-28 17:13 | 显示全部楼层
zpy2 发表于 2018-4-27 19:34
你计算的结果和我的不一样的很多,不知道你是如何得出这些结果的。你如果有试验的数据需要运行比对,可以 ...

我给出的只是格式,数据是不对的,请先按照我昨天发的最新资料(可能您在这之前对BOM结构的理解有些许偏差)作了BOM的结构说明)及需求写码,谢谢!。

TA的精华主题

TA的得分主题

发表于 2018-4-28 18:15 来自手机 | 显示全部楼层
h749600173 发表于 2018-4-20 18:41
没有人去开发这一块,每次用人工算,好烦锁。所以求各位大师帮写个代码。谢谢!

没看懂附件表的逻辑关系

库存那里有很多行,但是需求只有不到20行

最好你说一下你们怎么算的,比如良率是什么??
从沙发二楼开始,大家都想知道你们是这么算的,所以,问题不再编程,代码都已经写好了,当然,可能距离你的需求有差距。vba你们也运行了,差距在哪也不明确。
bom这一块,以前,我就是准备数据源然后上传到服务器,键入tCode运行的,一般都是一个订单一个bom,当时,我也对这个bom计算比较好奇,听说是咨询公司定制的。你们这个是涉及到半阶产品,也比较有趣,你自己也挺想解决问题的,只是这样感觉不在一个频道上,你自己也看到了代码也不算是很复杂的,所以,如果就这些信息,可能也只有这样了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 12:32 , Processed in 0.049933 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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