ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] excelhome中有关BOM的部分内容

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-9-13 12:13 | 显示全部楼层
好东东,楼主辛苦了。

TA的精华主题

TA的得分主题

发表于 2012-12-22 21:43 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-30 14:49 | 显示全部楼层
本帖最后由 yiyiyicz 于 2013-1-31 08:07 编辑

上面的帖子都是围绕BOM展开的
可是实际运用中,怎么到的BOM,却是比BOM展开难得多
难就难在,随时能从数据库中提取正确的BOM(准确率100%);或者应客户的要求,设计做一些变更,变更后的BOM快速获得(几十分钟之内,准确率100%)。BOM是包括工艺内容的,没有工艺内容的BOM,生产部门还是不能做计划。
介绍一种获得BOM 的方法,这个方法适宜机械类,也可能只适用于它。
思路
机械制造需要图纸,产品、部件、零件,都用图纸说话。
图纸中的主要内容是几何形状。而这些形状具有“相似性”的特点,比方一个杯子是中空的圆柱体。那么只要有一个基础模型(圆柱体),改一改圆柱体高度又是一个杯子,改一改厚度,改一改粗细,那么杯子要多少规格就有有多少
现在,我们就是要想办法充分利用基础的几何形状(模型),在使用计算机软件的背景下,通过修改高度、厚度、粗细等几个参数,自动得到形状相似,尺寸不同的形状
更通俗的解释:我们事先把重复性、规律性的东西先行做好。等到订单来了后,改一下(尺寸/配置),全部技术文档都出来了。关键是很多工作提前做好了,而不是每次订单来后,整个靠人工再来一遍。所以快,所以准。民间居家有这么一句话,叫做“闲了置、忙了用”。就是这个意思。
    编码
对于零件,形状是五花八门。但是可以归纳出一些基本的形状(这是专业技术人员的基本功),由这些形状可以拼装成五花八门的形状。
现在,我们要给这些形状起名字。目的是能找出来已经有的形状。这名字就是编码(给计算机识别)
针对实际应用,名字(编码值)不光是指明形状,还要指明尺寸大小,还有其他。
为此,可以用现成的工具---“事物特性表”。它有ISO标准,有GB标准,在使用是需要花些心思,使得在形成新BOM时,能自动生成新的码值
    模型
靠修改几个参数,生成新形状(产品),必须是建立在模型的基础之上。也就是需要先建立模型。这里有个根本性的转变,从面向图样转变为面向模型
1,建立几何形状
除了上面提到,五花八门形状由几个基本形状拼装组成外;还有就是准确的数量关系的刻画,比如齿轮传动、叶轮的叶片、壳体箱体等。要想做到参数驱动,必须有参数间关系的函数关系。这点着实考验机械基本功和数学功底
2,选定参数
即哪些参数作为自变量、哪些作为因变量。自变量越少越好,函数关系如果出现循环就难处理了。而稍不注意这种情况就会出现
3,参数传递
参数传递的处理,有几种方法:有向无环图、类继承,还有更复杂的。这个必须处理,否则整个产品无法被参数驱动。注意不仅仅是零件的问题
4,为工艺图做好基础
工艺图也是由形状组成,与零部件图密切相关。为此,一般是采取在3D模型中隐藏特征来实现工艺图。
5,与编码联系
在形状(特征)关联时,千万不要把编码丢掉。一般是不容易漏掉的,但是顺畅的自然的融合在一起。需要费点脑子

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-30 16:49 | 显示全部楼层
本帖最后由 yiyiyicz 于 2013-1-31 08:30 编辑

    工艺
工艺也需要采用相似性原理,多了一个映射关系。这是因为虽然零件的形状相似、尺寸不同,其不同尺寸所对应的加工工艺却可能有变化。不过一般不会出现原理性的变化。例如建立一个表,1米以内的轴用1米长床身的机床;2米到1米的轴,用2米长床身的机床,等等。由于实际情况变化多端,所以需要采取关系映射。这可既要考验机械设计、工艺的基本功;又要考验解决实际问题的能力。很多按实际情况简化了的数学模型,可以大大简化计算机软件。如果不做这样的简单化,软件可能搞不下去
记住:越贴近实际,用数学模型越难
方案
简而言之,就怎么简单、怎么容易怎么来
比如要想弄得普遍适用,太难了,至今没有见过有人实际成功过;企业生产所面对的产品种类,不会漫无边际,所以针对几种、几十种基本类型做工作,难度可以大大降低而效率大幅度提高。这有成功的先例
比如编码方案。整个工作毫无疑问要处理以前的设计、工艺资料,图纸一般都在几十万张,这时要处理好重建和沿用的关系。千方百计要做到编码方案包容之前的内容,尽量不要节外生枝。
这个工作需要重建。重建指的是图纸全部重画(是在参数驱动下重新画),但是不是重新设计。国内再牛B的企业,图纸都不能深究。最好的办法是只处理几何关系,不处理强度等物理设计。物理设计的结果都会反映在几何尺寸上。所以只要在几何尺寸上留下变动空间足以。比如齿轮传动的变位系数,自动设计可以,用电子封闭图。而电子封闭图上怎么取数值,则由人工处理。冒险进入物理设计领域,可能把自己装进去(切不可逞一时之勇,就是有10个博士头衔怕是也难解决企业所有深层的技术问题)。因为多数企业物理设计的验证是做不了的,因为物理设计从不同角度着眼会有不同的处理程式。但是,最终客户会检验,真到那时好心一定不得好报
软件
做成插件比较好。一边连接3DCAD,一边连接PDM
那么用excel+VBA行不行呢?个人认为可以。但是在处理类继承时,需要用jscript
另外,处理有向图时,也可以用jscript
在数据结构处理时,由于机械领域的数据大多数是树形结构,用XML是个不错选择
jscript和XML在excel中都可以通过添加引用来实现
为了使用者操作更加方便,类模块将扮演重要的角色
最后封装成.dll .exe不是容易事
用VB.NET+框架可能是更好的选择,

最后,要达到的效果:
根据订单,在用户界面修改若干个参数,就能同时给出全套的设计图纸、全套的工艺文档。变化包括配置和尺寸;时间应该是几十分钟。目前还需要人工干预
为技术管理考虑:自动给出物料编码,在对技术文件新添、修改之后,始终保持基础数据正确(这最重要)
为ERP考虑:自动给出工艺BOM和工艺路线,做计划用
为采用标准成本法核算考虑:工艺文件需要增强
为质量文件适应循环改进:工艺文件需要增强

TA的精华主题

TA的得分主题

发表于 2014-6-12 07:44 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-5-28 14:04 | 显示全部楼层
本帖最后由 yiyiyicz 于 2013-5-28 19:36 编辑

用XML整理BOM
可与1楼代码比较
  1. Sub tt02()
  2. Dim Arr, Brr
  3. Dim Tt As New MSXML2.DOMDocument, Rt As IXMLDOMElement, Ndt As IXMLDOMElement, Ndtt As IXMLDOMElement
  4. Dim T As New MSXML2.DOMDocument, R As IXMLDOMElement, Nd As IXMLDOMElement

  5.     Arr = Range("a1").CurrentRegion
  6.     Set Rt = Tt.createElement("root")
  7.     Tt.appendChild Rt
  8.     For i = 2 To UBound(Arr)
  9.         Set Ndt = Tt.createElement(Arr(i, 1))
  10.         Rt.appendChild Ndt
  11.         Set Ndtt = Tt.createElement(Arr(i, 2))
  12.         Ndtt.setAttribute "numb", Arr(i, 3)
  13.         Ndt.appendChild Ndtt
  14.         Set Ndt = Nothing: Set Ndtt = Nothing: Set Txtt = Nothing
  15.     Next i

  16.     Set R = T.createElement("rt")
  17.     T.appendChild R
  18.     Set Nd = T.createElement(Arr(2, 1))
  19.     Nd.setAttribute "numb", 1
  20.     Nd.setAttribute "id", 0
  21.     R.appendChild Nd
  22.     an = 0
  23.     Do
  24.         Set tlist = T.selectNodes("//*[@id=" & an & "]")
  25.         If tlist.Length = 0 Then Exit Do
  26.         For Each tls In tlist
  27.             Set temp = Tt.selectNodes("/*/" & tls.nodeName)
  28.             For Each tep In temp
  29.                 Set cd = tep.childNodes.Item(0).CloneNode(True)
  30.                 cd.setAttribute "id", an + 1
  31.                 tls.appendChild cd
  32.                 Set cd = Nothing
  33.             Next
  34.         Next
  35.         an = an + 1
  36.     Loop
  37.     Set abc = T.selectNodes("//*[@*]")
  38.     ReDim Brr(1 To abc.Length, 1 To 3)
  39.     nn = 1
  40.     For Each Ac In abc
  41.         Brr(nn, 1) = Ac.Attributes(1).nodeValue
  42.         Brr(nn, 2) = Ac.nodeName
  43.         Brr(nn, 3) = Ac.Attributes(0).nodeValue
  44.         nn = nn + 1
  45.     Next
  46.     Range("m1").Resize(UBound(Brr), UBound(Brr, 2)) = Brr
  47. End Sub
复制代码

用XML整理BOM.rar

9.94 KB, 下载次数: 561

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-5-28 19:50 | 显示全部楼层
之前的代码,几乎都是用数组+字典的方法来处理BOM问题
虽然可以解决问题,但是比较啰嗦
XML天生就是树形结构,而离散生产遇到的BOM无一例外也都是树形结构
用MSXML_DOM处理BOM有天生的优势,直观,速度快

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-5-29 20:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
用MSXML DOM 展开树形BOM
  1. Sub bzk01() '树形BOM展开_XML
  2. Dim Arr, Brr1
  3. Dim T As New MSXML2.DOMDocument, R As IXMLDOMElement, Nd As IXMLDOMElement
  4. Dim Tep As IXMLDOMElement, Temp As IXMLDOMNodeList
  5. Dim A1, A2
  6. Dim Dret As New Dictionary, Ti, K
  7.     Arr = Range("m1:o22").Value
  8.     '====将Arr中数据转换成XML树
  9.     Set R = T.createElement("root")
  10.     T.appendChild R
  11.     Set Nd = T.createElement(Arr(1, 2)) '物料代码
  12.     Nd.setAttribute "level", Arr(1, 1) 'BOM层级
  13.     Nd.setAttribute "require", Arr(1, 3) '需要数量
  14.     Nd.setAttribute "product", 1
  15.     R.appendChild Nd
  16.     For i = 2 To UBound(Arr)
  17.         Set Nd = T.createElement(Arr(i, 2))
  18.         Nd.setAttribute "level", Arr(i, 1)
  19.         Nd.setAttribute "require", Arr(i, 3)
  20.         Set Temp = T.selectNodes("//*[@level=" & Arr(i, 1) - 1 & "]")
  21.         Temp(Temp.Length - 1).appendChild Nd
  22.     Next i
  23.     '====对XML树做BOM展开计算
  24.     nn = 1
  25.     Do
  26.         Set Temp = T.selectNodes("//*[@level=" & nn & "]")
  27.         If Temp.Length = 0 Then Exit Do
  28.         For Each Tep In Temp
  29.             A1 = Val(Tep.parentNode.Attributes.Item(2).nodeValue)
  30.             A2 = Val(Tep.Attributes.Item(1).nodeValue)
  31.             Tep.setAttribute "product", A1 * A2
  32.         Next Tep
  33.         nn = nn + 1
  34.     Loop
  35.     Range("l25") = "BOM展开数量"
  36.     Set Temp = T.selectNodes("//*[@*]")
  37.     ReDim Brr1(1 To Temp.Length, 1 To 4)
  38.     For i = 1 To UBound(Brr1)
  39.         Brr1(i, 1) = Temp.Item(i - 1).Attributes(0).nodeValue
  40.         Brr1(i, 2) = Temp.Item(i - 1).nodeName
  41.         Brr1(i, 3) = Temp.Item(i - 1).Attributes(1).nodeValue
  42.         Brr1(i, 4) = Temp.Item(i - 1).Attributes(2).nodeValue
  43.     Next
  44.     Range("l26").Resize(UBound(Brr1), UBound(Brr1, 2)) = Brr1
  45.     '====物料汇总计算
  46.     Set Temp = T.selectNodes("//*[@*]")
  47.     For Each Tep In Temp
  48.         Dret(Tep.nodeName) = Dret(Tep.nodeName) + Val(Tep.Attributes.Item(2).nodeValue)
  49.     Next Tep
  50.     K = Dret.Keys
  51.     Ti = Dret.Items
  52.     [p25] = "物料汇总"
  53.     Range("p26").Resize(Dret.Count, 1) = Application.Transpose(K)
  54.     Range("q26").Resize(Dret.Count, 1) = Application.Transpose(Ti)
  55. End Sub
复制代码

用XML整理BOM.rar

14.27 KB, 下载次数: 377

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-5-29 20:32 | 显示全部楼层
本帖最后由 yiyiyicz 于 2013-5-30 05:55 编辑

还是自顶向下展开计算,用数组+字典
详细情况见 http://club.excelhome.net/forum.php?mod=viewthread&tid=1001240&extra=&authorid=313292&page=2
用msxml dom 概念直观,编程简单
另外,要解决真实的BOM问题贴,大量的时间是用在源数据上面
对于没有掌握BOM概念 ,甚至运算逻辑都一团浆糊,那么发帖救助的与回帖解决问题的,完全是鸡对鸭说。因为发帖的连自己也不知道正确的答案
  1. Sub zz()
  2. Dim xlApp As Excel.Application, wbTarget As Excel.Workbook
  3. Dim pathSource As String, FileName() As String
  4. Dim Level, Code, Quantity, Mark(1 To 8), Result, myRow As Integer, ParentCode
  5. Dim Dic As New Dictionary, K, T
  6. '====文件夹“订单明细”中,只有子表。每个文件存放数据的工作表只有一张,表名为sheet1,格式相同
  7. '====采用自顶向下展开BOM,mark数组根据叶节点赋值0
  8.     pathSource = ActiveWorkbook.Path & "\订单明细"
  9.     With Application.FileSearch
  10.         .LookIn = pathSource
  11.         .FileType = msoFileTypeExcelWorkbooks
  12.         If .Execute > 0 Then
  13.             ReDim FileName(1 To .FoundFiles.Count)
  14.             For i = 1 To .FoundFiles.Count
  15.                 FileName(i) = .FoundFiles(i)
  16.             Next i
  17.         Else
  18.             MsgBox "在《订单明细》下没有发现excel文件!"
  19.         End If
  20.     End With
  21.    
  22.     For i = 1 To UBound(FileName)
  23.         Set xlApp = New Excel.Application
  24.         xlApp.EnableEvents = False
  25.         Set wbTarget = xlApp.Workbooks.Open(FileName(i))
  26.         With wbTarget.Worksheets("母件结构表-多阶")
  27.             myRow = .Range("a65536").End(3).Row
  28.             ReDim Result(1 To myRow)
  29.             Level = .Range("a6:a" & myRow)
  30.             Code = .Range("e6:e" & myRow)
  31.             Quantity = .Range("i6:i" & myRow)
  32.             ParentCode = .Range("a4")
  33.             For j = 1 To UBound(Code)
  34.                 Dic(Code(j, 1)) = Dic(Code(j, 1))
  35.             Next j
  36.             '====自顶向下展开计算
  37.             Mark(1) = 1
  38.             For j = 1 To UBound(Code)
  39.                 temp = Len(CStr(Level(j, 1))) + 1
  40.                 Mark(temp) = Quantity(j, 1) * Mark(temp - 1)
  41.                 Result(j) = Mark(temp)
  42.                 For K = temp + 1 To 8
  43.                     Mark(K) = 0
  44.                 Next K
  45.             Next j
  46.         End With
  47.         wbTarget.Close savechanges:=False
  48.         Set wbTarget = Nothing
  49.         Set xlApp = Nothing
  50.         For j = 1 To UBound(Code)
  51.             Dic(Code(j, 1)) = Dic(Code(j, 1)) + Result(j)
  52.         Next j
  53.         K = Dic.Keys: T = Dic.Items
  54.         Sheet2.Range("a1").Offset(0, (i - 1) * 2) = Right(CStr(FileName(i)), Len(CStr(FileName(i))) - Len(pathSource))
  55.         Sheet2.Range("a2").Offset(0, (i - 1) * 2).Resize(Dic.Count, 1) = Application.Transpose(K)
  56.         Sheet2.Range("b2").Offset(0, (i - 1) * 2).Resize(Dic.Count, 1) = Application.Transpose(T)
  57.         Dic.RemoveAll
  58.         Erase Level
  59.         Erase Code
  60.         Erase Quantity
  61.         Erase Mark
  62.     Next i
  63. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-5-22 00:35 | 显示全部楼层
LZ相关的计算,好象都是毛需求的计算,是否有相关净需求计算的案例?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 07:41 , Processed in 0.034691 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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