|
楼主 |
发表于 2017-3-16 12:46
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 lzhuohui 于 2017-3-16 13:08 编辑
完成多层BOM表的查询。请指教
Sub 按钮1_Click()
Dim objDic As Object, objDicXm As Object: Dim ArrBom, ArrXm
Dim BomMm$, BomZm$ '父件与子件
Application.DisplayAlerts = False
i = Worksheets("配置BOM").Range("B" & Cells.Rows.Count).End(xlUp).Row
ArrBom = Worksheets("配置BOM").Range("B3:F" & i)
i = Worksheets("工程项目").Range("B" & Cells.Rows.Count).End(xlUp).Row
ArrXm = Worksheets("工程项目").Range("B3:D" & i)
Set objDicBom = CreateObject("scripting.dictionary")
Set objDicXm = CreateObject("scripting.dictionary")
For i = 1 To UBound(ArrBom) '装入配置BOM
BomMm = ArrBom(i, 1) & vbTab & ArrBom(i, 2) '母件名称、型号
BomZm = ArrBom(i, 3) & vbTab & ArrBom(i, 4) '子名称、型号
BomZs = ArrBom(i, 5) '子件数量
If Not objDicBom.exists(BomMm) Then
Set objDicBom(BomMm) = CreateObject("scripting.dictionary")
End If
If Not objDicBom(BomMm).exists(BomZm) Then
objDicBom(BomMm)(BomZm) = BomZs '子件数量
End If
objDicXm(BomMm) = 0
objDicXm(BomZm) = 0
Next
For i = 1 To UBound(ArrXm) '装入工程项目
XmMm = ArrXm(i, 1) & vbTab & ArrXm(i, 2)
objDicXm(XmMm) = ArrXm(i, 3) '工程项目数量
Next
For i = 1 To objDicXm.Count '计量
For Each d In objDicXm '历遍工程项目名称
If objDicBom.exists(d) And objDicXm(d) Then
For Each d1 In objDicBom(d) '历遍配置BOM名称
objDicXm(d1) = objDicXm(d1) + objDicBom(d)(d1) * objDicXm(d) '数量汇总
Next
objDicXm(d) = 0
End If
Next
Next
For Each d In objDicXm '清除无用数据
If objDicXm(d) = 0 Then objDicXm.Remove d
Next
Worksheets("采购清单").Activate
i = Range("B" & Cells.Rows.Count).End(xlUp).Row
Range("A3:D" & i).ClearContents
[B3].Resize(objDicXm.Count) = Application.Transpose(Array(objDicXm.keys)) '输出名称、型号
[D3].Resize(objDicXm.Count) = Application.Transpose(Array(objDicXm.items)) '输出汇总数量
Range("B3:B" & i).TextToColumns [B3:B3] '拆分名称型号
Range("A3:A" & i) = "=row()-2" '加序号
Application.DisplayAlerts = True
End Sub
|
|