|
楼主 |
发表于 2016-12-27 00:36
|
显示全部楼层
本帖最后由 topman-gang 于 2016-12-27 00:44 编辑
继续求助!! 各位老师好!经过学习,现在能做到把第1层第1个物料逐级拆分到最后一层了。但是还没有做到所有物料拆分重组。如果哪位能赐教不胜感激!先谢过啦!
以下是笨鸟写的第7版代码。。。。可能和本人一样笨,见笑啦!
Sub BOMList7()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim lastRow As Long
Dim myFind As Range
Dim LayerNum, BomRow, ZDRow, i As Long
Sheets("BOM").UsedRange.Clear
'判定是否是BOM单,要求第二行第一列内容是顶层BOM名
lastRow = Sheets("总单").Range("A65535").End(xlUp).Row '计算BOM总单表总行数
If IsNumeric(Sheets("总单").Cells(2, 1).Value) = True Or Sheets("总单").Cells(2, 1).Value = "" Then '判断总单第2行第1列是否有字符,如果有,则内容就是顶层BOM
MsgBox "请确认顶层BOM号是否在第" & 2 & "列第" & 1 & "行!", , "技术部BOM格式化"
Sheets("总单").Cells(2, 1).Select
Exit Sub
End If
'复制"总单"表头和顶层BOM名到"BOM"表,并修改表头
Sheets("总单").Rows("1:2").Copy Sheets("BOM").Rows(1)
With Sheets("BOM")
.Cells(1, 1).Value = "层次"
.Cells(1, 2).Value = "BOM编码"
.Cells(2, 2).Value = .Cells(2, 1).Value
.Cells(2, 1).Value = 0
End With
'循环处理从1层第1个物料开始的逐层级第1个物料,直到最后一层所有物料停止
LayerNum = 1
BomRow = 3
ZDRow = 3
Do
i = 1
If Not Sheets("总单").Cells(ZDRow, 2) = "" Then '如果有第1层第1个物料,则开始拆分,否则提示错误并退出
Set myFind = Sheets("总单").Range("A1:A" & lastRow).Find(Worksheets("总单").Cells(ZDRow, 2), , , xlWhole)
If myFind Is Nothing Then '是最后一级物料时
If Sheets("总单").Cells(ZDRow + i, 2) = "" Then '同级物料最后一行第2列是空,则退出
Exit Do
Else
i = 1 '复制同级物料
Do
Do While Sheets("总单").Cells(ZDRow + i, 1) = ""
'总单当前行第1列是空值,则表示是替代物料,BOM表相应行第1列标"R"
Sheets("总单").Rows(ZDRow + i).Copy Sheets("BOM").Rows(BomRow)
Sheets("BOM").Cells(BomRow, 1) = "R"
Sheets("BOM").Cells(BomRow, 1).HorizontalAlignment = xlRight
ZDRow = ZDRow + 1
BomRow = BomRow + 1
If Sheets("总单").Cells(ZDRow + i, 2) = "" Then
Exit Sub
End If
Loop
Sheets("总单").Rows(ZDRow + i).Copy Sheets("BOM").Rows(BomRow)
Sheets("BOM").Cells(BomRow, 1) = LayerNum - 1
i = i + 1
BomRow = BomRow + 1
Loop Until Sheets("总单").Cells(ZDRow + i, 2) = ""
End If
Else '逐级复制每层第1个物料
If ZDRow = 3 Then '如果总单第3行是第1层物料,则复制到BOM第3行
Sheets("总单").Rows(ZDRow).Copy Sheets("BOM").Rows(BomRow)
Sheets("BOM").Cells(BomRow, 1) = LayerNum
BomRow = BomRow + 1
LayerNum = LayerNum + 1
End If
Sheets("总单").Rows(myFind.Row + i).Copy Sheets("BOM").Rows(BomRow)
Sheets("BOM").Cells(BomRow, 1) = LayerNum
i = i + 1
LayerNum = LayerNum + 1
BomRow = BomRow + 1
ZDRow = myFind.Row + 1
End If
Else
Sheets("BOM").UsedRange.Clear '清空BOM表
MsgBox "请确认是否有第1层物料!" '总单第3行第2列没有数据,报错
Exit Sub
End If
Loop
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
|
|