ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 行业案例 > 生产管理 > 如何用VBA整理PCB行业软件包导出的BOM清单?

如何用VBA整理PCB行业软件包导出的BOM清单?

作者:绿色风 分类:生产管理 时间:2022-08-18 浏览:166
楼主
herelazy
Q:从PCB行业的cadence中导出的BOM不符合采购等需要,如何按照下列要求进行快速整理:
   1、在将A—F列的内容按照F-E-A优先顺序排序的基础上,把F列的物料名称去重后复制到H列;
   2、按照E列有无m,把A列分列在J,L列;采用相同物料的写在一个单元格中,互相之间用","间隔;
   3、在I,K列统计J,L列对应单元格中器件的个数。

A:
  1. Sub test()
  2. Dim Rng As Range, Arr, Arr2() As String, N&, I%, A&, B&, T&, Dic2 As Object, Str$
  3. Set Rng = Range("a1:f" & Cells(Rows.Count, 1).End(3).Row)
  4. With Rng
  5.     .Sort key1:=[f1], key2:=[e1], key3:=[a1]
  6.     Arr = Rng.Value
  7. End With
  8. Set Dic2 = CreateObject("scripting.dictionary")
  9. ReDim Arr2(1 To 5, 1 To 1)
  10. Arr2(1, 1) = "物料名称"
  11. Arr2(2, 1) = "数量"
  12. Arr2(3, 1) = "有m"
  13. Arr2(4, 1) = Arr2(2, 1)
  14. Arr2(5, 1) = "无m"
  15. For N = LBound(Arr) To UBound(Arr)
  16.     I = IIf(Arr(N, 5) = "m", 3, 5)
  17.     If Dic2.exists(Arr(N, 6)) Then
  18.         If Arr2(I, Val(Dic2(Arr(N, 6)))) = "" Then
  19.             Arr2(I, Val(Dic2(Arr(N, 6)))) = Arr(N, 1)
  20.             Arr2(I - 1, Val(Dic2(Arr(N, 6)))) = 1
  21.         Else
  22.             Arr2(I, Val(Dic2(Arr(N, 6)))) = Arr2(I, Val(Dic2(Arr(N, 6)))) & "," & Arr(N, 1)
  23.             Arr2(I - 1, Val(Dic2(Arr(N, 6)))) = Val(Arr2(I - 1, Val(Dic2(Arr(N, 6))))) + 1
  24.         End If
  25.     Else
  26.         ReDim Preserve Arr2(1 To 5, 1 To UBound(Arr2, 2) + 1)
  27.         Arr2(I, UBound(Arr2, 2)) = Arr(N, 1)
  28.         Arr2(I - 1, UBound(Arr2, 2)) = 1
  29.         Arr2(1, UBound(Arr2, 2)) = Arr(N, 6)
  30.         Dic2.Add Arr(N, 6), UBound(Arr2, 2)
  31.     End If
  32. Next N
  33. With CreateObject("vbscript.regexp")
  34.     .Global = True
  35.     For I = 3 To 5 Step 2
  36.         For N = LBound(Arr2, 2) + 1 To UBound(Arr2, 2)
  37.             If Arr2(I, N) <> "" Then
  38.                 .Pattern = "[A-Z]+"
  39.                 If .test(Arr2(I, N)) Then
  40.                     Str = .Execute(Arr2(I, N))(0).Value
  41.                     Arr = Split(Replace(Arr2(I, N), Str, ""), ",")
  42.                     For A = LBound(Arr) To UBound(Arr) - 1
  43.                         For B = A + 1 To UBound(Arr)
  44.                             If Val(Arr(A)) > Val(Arr(B)) Then
  45.                                 T = Arr(A)
  46.                                 Arr(A) = Arr(B)
  47.                                 Arr(B) = T
  48.                             End If
  49.                         Next B
  50.                     Next A
  51.                     .Pattern = "(\d+)"
  52.                     Arr2(I, N) = .Replace(Join(Arr, ","), Str & "$1")
  53.                 End If
  54.             End If
  55.         Next N
  56.     Next I
  57. End With
  58. [h1].Resize(UBound(Arr2, 2), 5) = Application.Transpose(Arr2)
  59. Set Dic = Nothing
  60. Set Dic2 = Nothing
  61. End Sub
效果图:

 


place_txt.rar



P.S.

PCB(PrintedCircuitBoard),中文名称为印制电路板印刷电路板印刷线路板电子元器件电子印刷电路板
cadence ,软件包。
BOM (Bill of Materials),物料清单。


2楼
成就滋味
必须顶起来,呵呵
3楼
eliane_lei
跟着小白学习!谢谢分享!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap