Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
12
返回列表 发新帖
楼主: su77

[已解决]两个表格对应内容匹配乘积数据汇总在新表格中

[复制链接]
发表于 2022-12-7 11:20 | 显示全部楼层
应该是这个意思,你添加新的数据进去测试一下……

两个表格内容匹配乘积数据汇总在新表格中.rar

21.08 KB, 下载次数: 1

回复

使用道具 举报

 楼主| 发表于 2022-12-7 13:20 | 显示全部楼层
哥儿- 发表于 2022-12-7 11:20
应该是这个意思,你添加新的数据进去测试一下……

非常感谢,但运算结果还是差一步。还是需要在需求汇总里先把对应的产品明细列示在那里,才能算出对应的需求数量,如果需求汇总里清空了,就运算不出结果,需求汇总表会是空白的。我需要的是需求汇总原本是没有数据的,运算之后,把运算的结果放在里面。比如,第一次在需求明细里有产品A,产品B,产品C,产品D的需求数量,运算后需求汇总里就有产品A,产品B,产品C,产品D对应的产品明细的需求数量的乘积和;而第二次在需求明细里只有产品E,运算后需求汇总里就只有产品E对应的产品明细的需求数量的乘积和。麻烦您啦!
回复

使用道具 举报

发表于 2022-12-7 14:29 | 显示全部楼层
su77 发表于 2022-12-7 13:20
非常感谢,但运算结果还是差一步。还是需要在需求汇总里先把对应的产品明细列示在那里,才能算出对应的需 ...
  1. Sub test()
  2.     Dim arr, brr, dic As Object, d As Object, d1 As Object
  3.     Dim i&, j&, k, crr, temp$, num&, ik
  4.     arr = Sheet3.Range("A1").CurrentRegion
  5.     crr = Sheet1.Range("A1").CurrentRegion.Resize(, 4)
  6.     Set dic = CreateObject("scripting.dictionary")
  7.     Set d = CreateObject("scripting.dictionary")
  8.     Set d1 = CreateObject("scripting.dictionary")
  9.     ReDim brr(1 To 6)
  10.     For i = 2 To UBound(arr)
  11.         If Not dic.exists(arr(i, 2)) Then
  12.             For j = 2 To UBound(arr, 2) - 4
  13.                 brr(j - 1) = arr(i, j)
  14.             Next
  15.             d1(arr(i, 2)) = brr
  16.             Set dic(arr(i, 2)) = CreateObject("scripting.dictionary")
  17.         End If
  18.         dic(arr(i, 2))(arr(i, 1)) = arr(i, 10)
  19.     Next i
  20.     For i = 2 To UBound(crr)
  21.         d(crr(i, 1)) = crr(i, 4)
  22.     Next i
  23.     ReDim brr(1 To dic.Count, 1 To 8)
  24.     For i = 0 To dic.Count - 1
  25.         temp = dic.keys()(i)
  26.         For Each ik In d1(temp)
  27.             num = num + 1
  28.             brr(i + 1, num) = ik
  29.         Next ik
  30.         num = 0
  31.         For Each k In dic(temp).keys
  32.             brr(i + 1, 8) = brr(i + 1, 8) + d(k) * dic(temp)(k)
  33.         Next k
  34.     Next i
  35.     Sheet2.[a2:h10000].ClearContents
  36.     Sheet2.[a2].Resize(UBound(brr), UBound(brr, 2)) = brr
  37.     Set dic = Nothing
  38.     Set d = Nothing
  39.     Set d1 = Nothing
  40. End Sub
复制代码
试试
回复

使用道具 举报

 楼主| 发表于 2022-12-7 15:07 | 显示全部楼层

这个代码运行的结果会出现,产品D只有3个产品明细,但是如果在需求明细里,把产品A、B、C的需求数量清为空,只有产品D有需求数量100,在需求汇总表里还是所有的产品明细,只是产品D没有的需求数量都填为0;而我把产品A、B、C在需求明细里都删除,只留下产品D,需求汇总表里也还是所有明细,没有的需求数理都为0。如果想要需求明细里需求数量不为空的才进行乘积和的汇总,而需求数量为空的产品对应的产品明细不进行乘积汇总,即不在需求汇总里显示,这个代码如何改呢?
回复

使用道具 举报

发表于 2022-12-7 15:41 | 显示全部楼层
su77 发表于 2022-12-7 15:07
这个代码运行的结果会出现,产品D只有3个产品明细,但是如果在需求明细里,把产品A、B、C的需求数量清为 ...
  1. Sub test()
  2.     Dim arr, brr, dic As Object, d As Object, d1 As Object
  3.     Dim i&, j&, k, crr, temp$, num&, ik, sm, n
  4.     arr = Sheet3.Range("A1").CurrentRegion
  5.     crr = Sheet1.Range("A1").CurrentRegion.Resize(, 4)
  6.     Set dic = CreateObject("scripting.dictionary")
  7.     Set d = CreateObject("scripting.dictionary")
  8.     Set d1 = CreateObject("scripting.dictionary")
  9.     ReDim brr(1 To 6)
  10.     For i = 2 To UBound(arr)
  11.         If Not dic.exists(arr(i, 2)) Then
  12.             For j = 2 To UBound(arr, 2) - 4
  13.                 brr(j - 1) = arr(i, j)
  14.             Next
  15.             d1(arr(i, 2)) = brr
  16.             Set dic(arr(i, 2)) = CreateObject("scripting.dictionary")
  17.         End If
  18.         dic(arr(i, 2))(arr(i, 1)) = arr(i, 10)
  19.     Next i
  20.     For i = 2 To UBound(crr)
  21.         d(crr(i, 1)) = crr(i, 4)
  22.     Next i
  23.     ReDim brr(1 To dic.Count, 1 To 8)
  24.     For i = 0 To dic.Count - 1
  25.         temp = dic.keys()(i)
  26.         For Each k In dic(temp).keys
  27.             sm = sm + d(k) * dic(temp)(k)
  28.         Next k
  29.         If sm > 0 Then
  30.             n = n + 1
  31.             brr(n, 8) = sm
  32.             For Each ik In d1(temp)
  33.                 num = num + 1
  34.                 brr(n, num) = ik
  35.             Next ik
  36.             num = 0
  37.             sm = 0
  38.         End If
  39.     Next i
  40.     Sheet2.[a2:h10000].ClearContents
  41.     Sheet2.[a2].Resize(UBound(brr), UBound(brr, 2)) = brr
  42.     Set dic = Nothing
  43.     Set d = Nothing
  44.     Set d1 = Nothing
  45. End Sub
复制代码
调整了,测试一下……
回复

使用道具 举报

 楼主| 发表于 2022-12-7 16:21 | 显示全部楼层
哥儿- 发表于 2022-12-7 15:41
调整了,测试一下……

万分感谢,这个代码是对的!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-2 11:35 , Processed in 0.427717 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表