|
楼主 |
发表于 2017-7-17 09:47
|
显示全部楼层
Sub 一键CCS库存核销V2()
Dim ar As Variant 'BMS苏国通检测表
Dim br As Variant 'CCS当前库存表
Dim d1 As Object, dsum As Object, dbr As Object
Dim x&, s$, cr, y&, z&, s1$, k&
Dim aSum, bSum, aBr, bBr
Dim arRes '结果存放数组
Dim nResult&
Dim lSpl '拆分存在于CCS数据表中的型号
Dim d5 As Object '修正商品编码和商品名称
Dim k5 '记录最终输出至工作表的行数
Dim ConToNum As Integer 'BMS数据表的销售数量由文本转换为数值型
Set d1 = CreateObject("scripting.dictionary") '检查CCS数据表中的型号是否能与BMS数据表的型号一一对应
Set d5 = CreateObject("scripting.dictionary")
Set dsum = CreateObject("scripting.dictionary") 'BMS数据表处理
Set dbr = CreateObject("scripting.dictionary") 'CCS数据表处理
ActiveSheet.[a1].Resize(65530, 18).ClearContents '清空原有的数据区域
ActiveSheet.[a1].Resize(, 18).Font.ColorIndex = 0
If MsgBox("下面请将当月BMS苏国通检测表装入数组ar!", vbYesNo + vbQuestion + vbDefaultButton1) = vbYes Then GoTo 10 Else Exit Sub
10:
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
If .Show Then p = .SelectedItems(1) Else: Exit Sub
End With
With GetObject(p): ar = .Sheets(1).[a1].CurrentRegion: .Close False: End With 'BMS数据表装入数组ar
For x = 2 To UBound(ar)
ConToNum = ar(x, 9) * 1 'BMS数据表的销售数量由文本转换为数值型
If InStr(ar(x, 7), "通程") Then
s = "K00056076" & "," & "长沙通程控股股份有限公司株洲县通程电器渌口向阳广场店" & "," & "CRSW054" & "," & "通程电器代销仓" & "," & ar(x, 4): If Not dsum.exists(s) Then dsum(s) = ar(x, 9) * 1 Else dsum(s) = dsum(s) + ar(x, 9) * 1
ElseIf InStr(ar(x, 7), "国美") Then
s = "K00093487" & "," & "湖南国美电器有限公司株洲美的时代广场店" & "," & "CRSW055" & "," & "国美电器代销仓" & "," & ar(x, 4): If Not dsum.exists(s) Then dsum(s) = ar(x, 9) * 1 Else dsum(s) = dsum(s) + ar(x, 9) * 1
ElseIf InStr(ar(x, 7), "苏宁") Then
s = "K00056093" & "," & "株洲苏宁云商商贸有限公司攸县步行街连锁店" & "," & "CRSW050" & "," & "苏宁店代销仓" & "," & ar(x, 4): If Not dsum.exists(s) Then dsum(s) = ar(x, 9) * 1 Else dsum(s) = dsum(s) + ar(x, 9) * 1
End If
Next x
If MsgBox("下面请将当月CCS库存表装入数组br!", vbYesNo + vbQuestion + vbDefaultButton1) = vbYes Then GoTo 100 Else Exit Sub
100:
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
If .Show Then p = .SelectedItems(1) Else: Exit Sub
End With
With GetObject(p): br = .Sheets(1).[a1].CurrentRegion: .Close False: End With 'CCS数据表装入数组br
With GetObject("C:\Users\Administrator\AppData\Roaming\Microsoft\AddIns" & "\单品名称和型号标准数据表.xlsx")
cr = .Sheets("CCS系统型号与BMS系统型号匹配数据库").[a1].CurrentRegion: .Close False
End With
'把型号标准数据装入字典d1
For y = 2 To UBound(cr): d1(cr(y, 1)) = cr(y, 2): Next
ReDim Preserve br(1 To UBound(br), 1 To UBound(br, 2) + 1) 'ccs数据表型号检查
For z = 2 To UBound(br)
If d1.exists(br(z, 5)) Then br(z, UBound(br, 2)) = d1(br(z, 5)) Else s1 = s1 & "第" & z & "行" & br(z, 5) & vbCr
Next '检查CCS数据表中的型号是否能与BMS数据表的型号一一对应
For x1 = 2 To UBound(br) '将CCS数据表的型号分门店求和
If Len(br(x1, 13)) Then
If InStr(br(x1, 2), "通程") Then
sbr = "K00056076" & "," & "长沙通程控股股份有限公司株洲县通程电器渌口向阳广场店" & "," & "CRSW054" & "," & "通程电器代销仓" & "," & br(x1, 13): If Not dbr.exists(sbr) Then dbr(sbr) = br(x1, 8) Else dbr(s) = dbr(s) + br(x, 8)
ElseIf InStr(br(x1, 2), "国美") Then
sbr = "K00093487" & "," & "湖南国美电器有限公司株洲美的时代广场店" & "," & "CRSW055" & "," & "国美电器代销仓" & "," & br(x1, 13): If Not dbr.exists(sbr) Then dbr(sbr) = br(x1, 8) Else dbr(s) = dbr(s) + br(x, 8)
ElseIf InStr(br(x1, 2), "苏宁") Then
sbr = "K00056093" & "," & "株洲苏宁云商商贸有限公司攸县步行街连锁店" & "," & "CRSW050" & "," & "苏宁店代销仓" & "," & br(x1, 13): If Not dbr.exists(sbr) Then dbr(sbr) = br(x1, 8) Else dbr(s) = dbr(s) + br(x, 8)
End If
End If
Next
aSum = dsum.keys: bSum = dsum.items '读取BMS数据表关键字和键值
aBr = dbr.keys: bBr = dbr.items '读取CCS数据表关键字和键值
'ReDim arRes(1 To UBound(aBr), 1 To 18) '待导入模板列数为18
ReDim arRes(1 To 65530, 1 To 18) '待导入模板列数为18
For x3 = 0 To UBound(aSum) '如果BMS中的数据存在于CCS中 则执行下面程序
If dbr.exists(aSum(x3)) Then
k1 = k1 + 1
lSpl = Split(aSum(x3), ",")
m = dbr(aSum(x3)) 'CCS中的数量
n = bSum(x3) * 1 'BMS中的数量
If m > n Then nResult = n Else nResult = m
arRes(k1, 2) = lSpl(0): arRes(k1, 3) = lSpl(1): arRes(k1, 4) = lSpl(2): arRes(k1, 11) = lSpl(2)
arRes(k1, 5) = lSpl(3): arRes(k1, 12) = lSpl(3): arRes(k1, 10) = lSpl(4): arRes(k1, 6) = "JVSUO0001"
arRes(k1, 7) = "长沙市容声电器经销有限公司": arRes(k1, 13) = nResult: arRes(k1, 17) = "否"
End If
Next
'==========================处理单据号=====================
EndD = DateSerial(Year(DateSerial(Year(Now()), Month(Now()) - 1, _
Day(Now()))), Month(DateSerial(Year(Now()), Month(Now()) - 1, Day(Now()))) + 1, 0)
NoTC = "CRSC" & Format(EndD, "yymmdd") & "001"
NoSN = "CRSC" & Format(EndD, "yymmdd") & "002"
NoGM = "CRSC" & Format(EndD, "yymmdd") & "003"
For x4 = 1 To UBound(arRes)
If arRes(x4, 2) = "K00056093" Then '苏宁
arRes(x4, 1) = NoSN
ElseIf arRes(x4, 2) = "K00093487" Then '国美
arRes(x4, 1) = NoGM
ElseIf arRes(x4, 2) = "K00056076" Then '通程
arRes(x4, 1) = NoTC
End If
Next
'==========================处理单据号=====================
'=====================处理商品名称和商品编码====================
For x5 = 2 To UBound(br)
If Len(br(x5, 13)) Then If Not d5.exists(br(x5, 13)) Then d5(br(x5, 13)) = Array(br(x5, 4), br(x5, 5))
Next
For x6 = 1 To UBound(arRes)
If d5.exists(arRes(x6, 10)) Then: k5 = k5 + 1: m1 = d5(arRes(x6, 10)): arRes(x6, 9) = "'" & m1(0): arRes(x6, 10) = m1(1)
Next
'=====================处理商品名称和商品编码====================
With ActiveSheet
.[a1].Resize(, UBound(arRes, 2)) = [{"单据号","客户编码","客户名称","代销仓头表编码","代销仓头表名称","部门编码","部门名称","备注","商品编码","商品名称","代销仓行表编码","代销仓行表名称","结算量","单价(折前)","折扣率","折扣金额","是否赠品","行表备注"}]
.[a2].Resize(k5, UBound(arRes, 2)) = arRes
.[a1].Font.ColorIndex = 3: .[b1].Font.ColorIndex = 3
.[d1].Font.ColorIndex = 3: .[f1].Font.ColorIndex = 3
.[i1].Font.ColorIndex = 3: .[k1].Font.ColorIndex = 3
.[m1].Font.ColorIndex = 3: .[q1].Font.ColorIndex = 3
.Cells.Font.Size = 9
.Cells.EntireColumn.AutoFit
.[a1].CurrentRegion.Borders.LineStyle = 1
End With
MsgBox s1
MsgBox "OK!若上面的信息中包含型号,说明该型号在CCS数据表中有而BMS数据表中无,请至加载宏下完善[CCS系统型号与BMS系统型号匹配数据库]"
'MsgBox s1 & "OK!", vbInformation + vbOKOnly, "若下面的信息中包含型号,说明该型号在CCS数据表中有而BMS数据表中无,请至加载宏下完善[CCS系统型号与BMS系统型号匹配数据库]"
End Sub |
|