ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-7-4 16:03 | 显示全部楼层 |阅读模式
本帖最后由 yiyiyicz 于 2013-1-30 17:30 编辑

怎么又快又准获得BOM,见
http://club.excelhome.net/forum.php?mod=viewthread&tid=737976&page=4&extra=#pid6695319

excelhome中有数以百计帖子涉及BOM
BOM是制造业信息化中肯定用到的东西,BOM理论又是信息化的基础理论,这许多的帖子让人眼花缭乱。本人选择了一些自己关心的帖子汇总如下

1,《把父子关系记录转为树形结构》
http://club.excelhome.net/viewthread.php?tid=142003&highlight=BOM

树状结构的表,原始数据往往只有父阶子阶。程序的目的是“显示任一阶的树状结构”
第一个例子中:在sheet1中。不太容易看出父子关系。在sheet3中,能看出父子关系的大概模样。需要耐心
例子中还有有用数组、find方法的

【第一个例子】
Private Sub CommandButton1_Click()
    Dim TempRag As Range
    Dim mycell, currentCell, nextCell As Range
    Dim TempMsgBox As VbMsgBoxResult
    Dim TempStr As String
    Dim I, J, K, M, N, temp, finalrow, finalcolumn As Integer
   
    Sheet2.Activate
    Sheet2.Cells.ClearContents   '初始化SHEET2
    Sheet2.Cells.NumberFormatLocal = "@"    '单元格格式设为文字?
    Sheet1.Activate
    Set TempRag = Sheet1.Application.Selection  '选择要查询的上阶
    If (TempRag.Column <> 1 Or Trim(TempRag.Value) = "") Then
        TempMsgBox = MsgBox("?请选择父阶", vbOKOnly, "错误选择")
        End
    End If
    finalrow = Range("A65536").End(xlUp).Row   '得到行数
    Sheet2.Cells(1, 1) = TempRag.Value     '把要找的父阶放在第一个位置
    I = 1  '初始行
    J = 1  '初始列?
    N = 2  '每一行的下阶个数,初始值为2是为了第一行能跑
    Do While (N > 1)  '如果上一列都没有下阶,说明已经展到底
       K = 1  '初始写到SHEET2的行
       N = 1  '每一行的下阶个数
       Do While (Sheet2.Cells(I, J) <> "")   '遍历每一列的非空值
          M = 1     '每一格的下阶个数
          For Each mycell In Sheet1.Range("A1:A" & finalrow)  '在SHEET1的第一列寻找下阶
                 If (mycell.Value = Mid(Sheet2.Cells(I, J), 4 * (J - 1) + 1, 4)) Then   '由于单元格的值是上下阶合并的,所以要取非空的最后四格
                    Sheet2.Cells(K, J + 1) = Sheet2.Cells(I, J) & mycell.Offset(, 1).Value   '把上阶和下阶合并
                    K = K + 1  '行加一
                    M = M + 1  '每一格的下阶个数
                    N = N + 1  '每一行的下阶个数
                 End If
          Next
          If M = 1 Then
             Sheet2.Cells(K, J + 1) = Sheet2.Cells(I, J)   '没有下阶的也要写到新的一行去
             K = K + 1
          End If
          I = I + 1   '行加一??
       Loop
       J = J + 1      '列加一
       I = 1
    Loop
   
    Sheet3.Activate
    Sheet3.Cells.ClearContents
    Sheet3.Cells.NumberFormatLocal = "@"
    Sheet2.Activate
    finalrow = Range("A65536").End(xlUp).Row
    K = 1
    If Sheet2.Range("B1").Value <> "" Then
        For Each mycell In Sheet2.Range("A1:A" & finalrow).Offset(, J - 2)
            For I = 1 To Len(mycell.Value) / 4
                Sheet3.Cells(K, I) = Mid(mycell.Value, 4 * (I - 1) + 1, 4)
            Next
            K = K + 1
        Next
    End If     '把SHEET2的最后一列的每一行按四位一分写到SHEET3
   
    Sheet3.Activate
    finalcolumn = Cells(1, 255).End(xlToLeft).Column   '得到列数
    For I = 1 To finalcolumn
        Set currentCell = Sheet3.Cells(1, I)
        Set nextCell = currentCell.Offset(1, 0)
        TempStr = Sheet3.Cells(1, I).Value
        Do While Not IsEmpty(nextCell)
            If nextCell.Value = TempStr Then
               nextCell.ClearContents
            Else
               TempStr = nextCell.Value
            End If
            Set currentCell = nextCell
            Set nextCell = currentCell.Offset(1, 0)
        Loop
    Next      '把SHEET3每一列有重复的值放空????
End Sub

[ 本帖最后由 yiyiyicz 于 2011-7-4 23:42 编辑 ]

评分

5

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-7-4 16:25 | 显示全部楼层
2《如何实现分级次任意合计》
http://club.excelhome.net/viewth ... p;extra=&page=1
为了解决数据出现跳跃的情况,如三级项目下面直接出现末级项目。
难点在于有的物料项向下展开时会跳层,末级以上的级次的合计数值可以是间断的
不能直接用查找下一个同级来判断的,这也是这个题目的怪点。高手的评论

3《如何用VBA实现类似BOM层次结构的分级显示》
http://club.excelhome.net/viewth ... 8&highlight=bom

[ 本帖最后由 yiyiyicz 于 2011-7-5 00:46 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-7-4 16:33 | 显示全部楼层
《如何整理多层次BOM》
http://club.excelhome.net/viewth ... ight=BOM&page=1
http://club.excelhome.net/viewth ... 4&highlight=BOM
只提供了一种实际情况,但没有很好的解决

[ 本帖最后由 yiyiyicz 于 2011-7-4 16:40 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-7-4 16:41 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-7-4 16:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
《BOM递归续 增加对应产品》
http://club.excelhome.net/viewth ... 1&highlight=bom
递归调用
Pid---母件名称(或产品名称),注意:它是相对的,本层的子件即为下一层的母件。
N----从顶层产品累积的本层的需求数量。
iTab---层级,可以忽略。在这儿出现,主要是防止BOM表中存在母件-子件环。
进入BOM子程序后,首先判别该产品(Pid)有无子项,即在主程序中创建的BOM字典中查看是否存在该项目。如果存在,表明它不是终端物料,否则为终端物料。
对于非终端物料,将该物料在BOM字典中的项取出来,并将其分割成一个一维数组(temp1),再在这个数组中循环。在循环体中,将temp1 的元素再次分割为数组temp2,其中就二个元素,temp2(0)为子件名称,temp2(1)为子件用量,用temp2(0)作为进入下一层的母件名称--Pid的输入参数,用temp2(1)和本层的输入参数N的乘积作为进入下一层的需求数量--N的输入参数。递归调用BOM子程序,进入下一层。
对于终端物料,将输入参数N累加到需求字典dicM中

笔者认为,递归的问题比较重要
在机械产品BOM表中,递归不会出现环的问题。但是化工产品,不能保证不出环
在机械设计深入到尺寸层时(成组技术),父子关系非常可能出现环。
所以上述方法只能在有限的场合使用
但是,递归的思路很重要

[ 本帖最后由 yiyiyicz 于 2011-7-4 16:53 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-7-4 16:54 | 显示全部楼层
《BOM表设置的方式》
http://club.excelhome.net/viewth ... p;extra=&page=1
编制BOM表,习惯的编制格式都是纵横表,就是说表中行字段是成品,列字段是物料,表内值为耗用。这样的好处是一张表内就可以显示多种成品的构成,比较直观,输入也方便。
但从数据库的角度,这样是不行的,将纵横表变为数据库格式的样板,比较方便地解决了问题。该样板自动能检查表中变化,提示是否保存变化,且双击代码就能显示代码的属性,主要缺点就是最多只能显示254种成品(这我也没办法,是EXCEL本身的原因,但通常都用户都会用增加属性字段的方法作出分类输入的吧),材料能显示60000余种(这应该够用了吧)。样板是用ADO引用Access数据库的,需引用ADO2.x,请自己引用。

[ 本帖最后由 yiyiyicz 于 2011-7-4 16:57 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-7-4 17:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
《EXCEL如何实现计算BOM表中某一制成品各构成料件的数量?》
http://club.excelhome.net/viewth ... 6&highlight=bom
个人认为这个问题并不好解决
但是在特定的场合,excel也许能给出巧妙的方法

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-7-4 17:18 | 显示全部楼层
《谁能帮我把BOM整理好,谁就是EXCEL高手》
http://club.excelhome.net/viewth ... 9&highlight=bom
“要把其半成品和底层物料整理出来”的贴主解释
“底层物料整理规律是这样的:半成品对应“半成品整理”表中“0级半成品”(即没有下级的半成品),其对应的物料是从“BOM明细”表中一一对应粘贴过来的(太麻烦了!)。哪些是某个半成品的底层物料,要看BOM明细表中“层级”,如某一半成品的层级是1,那么到另一个层级1前除了其二级半成品的底层物料外(如果有的话)全部都属于是它的底层物料。例如半成品“装配定子D411000982B”(代表其上级“定子组件1”)层级是1,那么到下一个层级1前(见明细表中74行)前除了其二级半成品“引线组件成品1”的底层物料外都属于它的底层物料,如果底层物料都是其二级半成品的,那么”装配一级半成品“的底层物料显示为空,如表中“装配前盖D632000485B0”,表示该半成品没有底层物料,有加工费等。最后把挑剩的底层物料全部放到“产品编码-ZP”这个半成品上。
问题是:怎样把根据BOM明细表和半成品整理表把某个半成品与其对应的底层物料一一对应过来???
一个一个对应粘贴过来实在是太麻烦了,一天整理不到10个BOM,要知道我整理的BOM有1000多个啊!麻烦请各位高手帮我想想办法,不然这个月我可以惨了!在下先拜谢了!”
这是实际应用中典型情况,还不算复杂
好像没有解决的太好。可能是费时间,或者对生产管理理解的问题

[ 本帖最后由 yiyiyicz 于 2011-7-4 17:21 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-7-4 17:24 | 显示全部楼层
《多级物料清单(BOM)的比较》
http://club.excelhome.net/viewth ... ight=bom&page=1
在零件发生设计变更时,想通过BOM比较了解其变化点
这也是实际应用的典型情况
有意思的是,对BOM提问的几乎都是“初级”

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-7-4 17:27 | 显示全部楼层
《十个硬骨头,挑战高手,解决一个是一个》
http://club.excelhome.net/thread-576282-1-1.html
都是生产管理中的实际问题
看来,这里找思路是个好地方,如果想找到完整的解决实例,难
好多问题,看上去并不难,可要编程,就复杂了。当然,真正理解问题后,还是有巧妙的方法

[ 本帖最后由 yiyiyicz 于 2011-7-4 17:30 编辑 ]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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