ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用vba代码分级查找并显示成品各部件组成清单?

如何用vba代码分级查找并显示成品各部件组成清单?

作者:绿色风 分类: 时间:2022-08-17 浏览:126
楼主
kevinchengcw
Q: 如何用vba代码分级查找并显示成品各部件组成清单?
A: 代码如下:
  1. Sub test()
  2. Dim Arr, Arr2, N&, I&, C&, Dic As Object, Dic2 As Object, Rng As Range, Str$, Str2$
  3. Arr = Range("B2:E" & Cells(Rows.Count, 2).End(3).Row).Formula  '将源数据区域的文本装入数组
  4. Set Dic = CreateObject("scripting.dictionary")  '创建字典项目,字典1用于装载各项数据,字典2用于记录部件组成显示情况
  5. Set Dic2 = CreateObject("scripting.dictionary")
  6. For N = LBound(Arr) To UBound(Arr)  '循环数组各项
  7.     Str2 = Trim(Arr(N, 3))  '将组成部件的单元格内容去除可能存在的空格后赋值给变量
  8.     If Dic.exists(Str2 & vbTab & "Count") Then  '如果字典1中存在该项目的计数项,则计数值加1(key由数据及tab分隔符和"Count"计数关键字组成)
  9.         Dic(Str2 & vbTab & "Count") = Dic(Str2 & vbTab & "Count") + 1
  10.     Else  '如果不存在则添加,计数值为1
  11.         Dic(Str2 & vbTab & "Count") = 1
  12.     End If
  13.     Str = Trim(Arr(N, 1))  '将整体部件的单元格内容去除可能存在的空格后赋值给变量
  14.     If Dic.exists(Str) Then  '如果已存在该部件,则将组成部件的内容以tab符分隔后串接在item项后,并将组成部件的描述写入由组成部件名及tab分隔符和"Detail"关键字组成的key所对应的item项中
  15.         Dic(Str) = Dic(Str) & vbTab & Arr(N, 3)
  16.         Dic(Str2 & vbTab & "Detail") = Arr(N, 4)
  17.     Else  '否则添加该项目,并将组成部件作为item项,同时添加该项及该项目前对应行的组成部件对应的描述
  18.         Dic(Str) = Arr(N, 3)
  19.         Dic(Str & vbTab & "Detail") = Arr(N, 2)
  20.         Dic(Str2 & vbTab & "Detail") = Arr(N, 4)
  21.     End If
  22. Next N
  23. If Cells(Rows.Count, "W").End(3).Row > 1 Then  '如果W列存在需要查询的数据,则
  24.     Application.ScreenUpdating = False  '因为存在大量的单元格操作,故关闭屏幕刷新提高运行速度
  25.     C = 2  '设置偏移起始量,即第一份查询结果写入W列向右偏移2列的位置,即Y列
  26.     Range([w2].Offset(, C), Cells(Rows.Count, Columns.Count)).Clear  '清空结果区数据
  27.     For Each Rng In Range("w2:w" & Cells(Rows.Count, "W").End(3).Row)  '循环查询区各单元格
  28.         Str = Trim(Rng.Value)  '将查询内容去除可能存在的空格后赋值给变量
  29.         If Str <> "" Then  '如果是有效数据,则
  30.             If Dic.exists(Str) Then  '如果字典中存在该项目,则
  31.                 I = 0  '初始化行偏移值为0
  32.                 [w2].Offset(, C).Value = Str  '将当前查询数据写入结果区第一行
  33.                 Do  '循环从结果区第一行向下循环直到单元格无数据为止
  34.                     Str2 = Trim([w2].Offset(I, C).Formula)  '提取单元格有效数据赋值给变量
  35.                     If Dic.exists(Str2 & vbTab & "Detail") Then [w2].Offset(I, C + 1) = Dic(Str2 & vbTab & "Detail")  '如果存在该数据的描述,则将该描述写入到当前循环到的单元格右侧单元格中
  36.                     If Dic.exists(Str2) And Not Dic2.exists(Str2) Then  '如果存在该数据且该数据之前未曾列举过组成,则
  37.                         Arr2 = Split(Dic(Str2), vbTab)  '将该数据对应的组成拆分放入数组中
  38.                         If I > 0 Then  '如果行数非结果区第一行,则
  39.                             With Cells(Rows.Count, [w2].Offset(, C).Column).End(3).Offset(1)  '将另有组成的部件单元格列出到当前数据列最下方空白单元格中,并将单元格颜色设置为黄色
  40.                                 .Formula = Str2
  41.                                 .Interior.Color = vbYellow
  42.                             End With
  43.                         End If
  44.                         Cells(Rows.Count, [w2].Offset(, C).Column).End(3).Offset(1).Resize(UBound(Arr2) + 1) = Application.Transpose(Arr2)  '将组成内容转置到当前列的下方
  45.                         Dic2(Str2) = ""  '将该项目添加到字典2中,防止再次生成组成
  46.                     End If
  47.                     If Dic(Str2 & vbTab & "Count") = 1 Then [w2].Offset(I, C + 1).Interior.Color = vbRed  '如果在源数据列表中只出现一次,则将对应的描述列单元格设置成红色
  48.                     I = I + 1  '下移一行
  49.                 Loop While [w2].Offset(I, C) <> ""  '循环直到单元格为空值
  50.                 C = C + 2  '下一查询结果数据右移两列
  51.             End If
  52.         End If
  53.         Dic2.RemoveAll  '清空字典2中项目,以进行新的数据查询
  54.     Next Rng
  55.     Application.ScreenUpdating = True  '打开屏幕刷新
  56. End If
  57. Set Dic = Nothing  '清空字典项目
  58. Set Dic2 = Nothing
  59. End Sub
详见附件及素材源帖.
物料.rar



该帖已经同步到
2楼
亡者天下
先挖宝,再学习!
3楼
nzkboy
K大,经过深思熟虑后,发现一个BUG,查出来的最终子物料从所有子物料里只出现一次就标为专用物料(即红色部分),逻辑上有错误。因为个别物料虽然只出现过一次,但它对应的BOM上级编码出现过多次,这样的物料不能算为专用物料了。

希望K大还需要再进一步改进一下代码。
4楼
JOYARK1958
謝謝提供學習下載中

免责声明

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

评论列表
sitemap