ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如果返回产品的仓储记录?

如果返回产品的仓储记录?

作者:绿色风 分类: 时间:2022-08-17 浏览:140
楼主
liuguansky
Q:
平常我会购买一些材料、工具等等物品,这些物品我可能是买了之后直接放到了仓库,那么当我是新购买的时候,sheet1P列中就为空,证明是新购买的,而如果是从一个地方调拨到另一个地方去的话,那么就是调拨,那么在P列我就要写上是从哪个地方拿出来的,在Q列上,我就会写上拿到哪个地方去!那么如果是新购买的话,这样物品的总量肯定就会增加了,而如果是调拨的话,无论这个物品调到哪里去,总量肯定还是那么多,不会变动。如何来区别什么样的条件为1种物品呢?那就是GHIJ4列合并起来的值是唯一的时候,以此来判定这是一种物品。我现在就要知道,每一种物品在每一个地方有多少个,价格是按入库(购买时)的总金额除以入库(购买时)的总量来算平均值的

A:

用如下代码可以实现:


  1. Sub justtest()
  2.     Dim Arr, D, i&, StrTemp1$, StrTemp2$, ArrR(), K&, m&
  3.     On Error GoTo 100
  4.     Set D = CreateObject("scripting.dictionary") '创建字典项目
  5.     With Sheet1
  6.         Arr = .Range("g6:t" & .Cells(.Rows.Count, "g").End(3).Row).Value '获取待处理数据写入数组
  7.     End With
  8.     For i = 1 To UBound(Arr, 1) '循环
  9.         StrTemp1 = Arr(i, 1) & Arr(i, 2) & Arr(i, 3) & Arr(i, 4) & Arr(i, 11) '设定惟一值,加以产品区别
  10.         StrTemp2 = Arr(i, 1) & Arr(i, 2) & Arr(i, 3) & Arr(i, 4) & Arr(i, 10)
  11.         If D.exists(StrTemp1) Then '判断是否存在
  12.             ArrR(7, D(StrTemp1)) = ArrR(7, D(StrTemp1)) + Arr(i, 7) '存在即累加数量
  13.             If Len(Arr(i, 10)) Then '若是调转的
  14.                 m = Arr(i, 7) * ArrR(9, D(StrTemp2)) / ArrR(7, D(StrTemp2)) '确认平均单价后的金额
  15.                 ArrR(7, D(StrTemp2)) = ArrR(7, D(StrTemp2)) - Arr(i, 7) '调整转出地区数量
  16.                 ArrR(9, D(StrTemp1)) = ArrR(9, D(StrTemp1)) + m '调整转入地区金额
  17.                 ArrR(9, D(StrTemp2)) = ArrR(9, D(StrTemp2)) - m '调整转出地区金额
  18.                 Else: ArrR(9, D(StrTemp1)) = ArrR(9, D(StrTemp1)) + Arr(i, 9) '若非调转,直接累加金额
  19.             End If
  20.             Else: K = K + 1: ReDim Preserve ArrR(1 To 12, 1 To K) '不存在项目,则扩展动态数组
  21.             D.Add StrTemp1, K: ArrR(1, K) = K '添加字典项目,初始化数组各元素
  22.             ArrR(2, K) = Arr(i, 1): ArrR(3, K) = Arr(i, 2)
  23.             ArrR(4, K) = Arr(i, 3): ArrR(5, K) = Arr(i, 4)
  24.             ArrR(6, K) = Arr(i, 6): ArrR(7, K) = Arr(i, 7)
  25.             ArrR(10, K) = Arr(i, 11): ArrR(11, K) = Arr(i, 13): ArrR(12, K) = Arr(i, 14)
  26.             If Len(Arr(i, 10)) Then '判断是否为调转
  27.                 ArrR(9, K) = ArrR(7, K) * ArrR(9, D(StrTemp2)) / ArrR(7, D(StrTemp2)) '同前处理
  28.                 ArrR(7, D(StrTemp2)) = ArrR(7, D(StrTemp2)) - Arr(i, 7)
  29.                 ArrR(9, D(StrTemp2)) = ArrR(9, D(StrTemp2)) - ArrR(9, K)
  30.                 Else: ArrR(9, K) = Arr(i, 9)
  31.             End If
  32.         End If
  33.     Next i
  34.     For i = 1 To K
  35.         ArrR(8, i) = Format(ArrR(9, i) / ArrR(7, i), "0.00") '产生单价
  36.     Next i
  37.     With Sheet2
  38.         .Range("a6:l" & .Rows.Count).ClearContents
  39.         .Range("a6").Resize(K, 12) = Application.Transpose(ArrR)
  40.     End With
  41.     MsgBox "处理完毕.", vbOKOnly
  42.     Set D = Nothing
  43.     Exit Sub
  44. 100
  45.    MsgBox "存在未入库,直接调整拨记录,请查示!", vbOKOnly '错误提示
  46. End Sub



该贴已经同步到
2楼
JOYARK1958
謝謝提供學習下載中
3楼
kangguowei
长代码.

免责声明

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

评论列表
sitemap