ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 如何运用VBA交叉对比订单和发货表,并汇总计算交货率

如何运用VBA交叉对比订单和发货表,并汇总计算交货率

作者:绿色风 分类: 时间:2022-08-18 浏览:137
楼主
xmyjk
Q:
1、从ME2N工作簿SHEET1中将以上A-G列复制过来,复制字段为黄色标识背景的内容。
2、按照CD列的采购凭证与项目去mb51中找对应项AB列,应该能找出多个H列的过帐日期
3、将找出来的过账时期与当前表格的交货日期去比较,早于或等于交货日期的将N列的数量相加后写入准时交货数,大于交货日期的,将N列的数量相加后写入延时交货数;
4、最终将H列准时交货数的总和除以E列的总数量算出准时交货率写入J6,将I列的延时交货数求和除以E列的总和求得百分比和写入K列

各表样式如图。
订单表:
 
发货表:
 
结果表:
 

A:
  1. Sub t()
  2. Dim d, wb As Workbook, arr, brr(), i&, ls, j&
  3. Application.ScreenUpdating = False
  4. Set d = CreateObject("scripting.dictionary")
  5. Set wb = Workbooks.Open(ThisWorkbook.Path & "\mb51.xlsx") '打开发货表,讲发货表数据导入arr数组。
  6. arr = wb.Sheets("mb51").UsedRange.Value
  7. For i = 2 To UBound(arr)
  8.    If Not d.exists(arr(i, 1) & arr(i, 2)) Then '运用字典以采购凭证+项目为关键字,讲每个关键字对应的所有发货数据以数组形式记录在字典的ITEM中。
  9.       d(arr(i, 1) & arr(i, 2)) = Array(Replace(arr(i, 8), ".", "-") & "|" & arr(i, 14))
  10.    Else
  11.       ls = d(arr(i, 1) & arr(i, 2))
  12.       ReDim Preserve ls(UBound(ls) + 1)
  13.       ls(UBound(ls)) = Replace(arr(i, 8), ".", "-") & "|" & arr(i, 14)
  14.       d(arr(i, 1) & arr(i, 2)) = ls
  15.       Erase ls
  16.    End If
  17. Next
  18. wb.Close: Erase arr
  19. Set wb = Nothing
  20. Set wb = Workbooks.Open(ThisWorkbook.Path & "\me2n.xlsx") '打开订单表,按照结果表样式,生成结果数组
  21. arr = wb.Sheets("Sheet1").UsedRange.Value
  22. ReDim brr(1 To UBound(arr) - 1, 1 To 9)
  23. For i = 2 To UBound(arr)
  24.    brr(i - 1, 1) = arr(i, 1): brr(i - 1, 2) = arr(i, 2): brr(i - 1, 3) = arr(i, 4)
  25.    brr(i - 1, 4) = arr(i, 5): brr(i - 1, 5) = arr(i, 12): brr(i - 1, 6) = arr(i, 14)
  26.    brr(i - 1, 7) = arr(i, 15)
  27.    If d.exists(brr(i - 1, 3) & brr(i - 1, 4)) Then '以订单表的采购凭证+项目,调出之前字典记录的发货数据数组,历遍数组,按记账日期与交货日期比对,记录数据
  28.       ls = d(brr(i - 1, 3) & brr(i - 1, 4))
  29.       For j = 0 To UBound(ls)
  30.          If CDate(Replace(brr(i - 1, 7), ".", "-")) >= CDate(Split(ls(j), "|")(0)) Then
  31.              brr(i - 1, 8) = brr(i - 1, 8) + Val(Split(ls(j), "|")(1))
  32.          Else
  33.              brr(i - 1, 9) = brr(i - 1, 9) + Val(Split(ls(j), "|")(1))
  34.          End If
  35.       Next
  36.       Erase ls
  37.    End If
  38. Next
  39. wb.Close: Erase arr
  40. Set wb = Nothing
  41. Set d = Nothing
  42. [a2].Resize(UBound(brr), UBound(brr, 2)) = brr '导出结果,并计算发货率
  43. [a65536].End(3).Offset(1, 9).Formula = "=-SUM(H2:H" & UBound(brr) + 1 & ")/SUM(E2:E" & UBound(brr) + 1 & ")"
  44. [a65536].End(3).Offset(1, 10).Formula = "=-SUM(I2:I" & UBound(brr) + 1 & ")/SUM(E2:E" & UBound(brr) + 1 & ")"
  45. Erase brr
  46. Application.ScreenUpdating = True
  47. End Sub


该帖已经同步到

Desktop.rar
2楼
lrlxxqxa
强大
3楼
eliane_lei
顶一个!
4楼
jxcaixiaomeng
谢谢楼主,哈哈                  
5楼
nzkboy
我提供的问题资源还是满好的呀,哈哈
6楼
JOYARK1958
謝謝提供學習下載中

免责声明

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

评论列表
sitemap