Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2013|回复: 3

[已解决]希望用数组或字典实现求和和查询填充

[复制链接]
发表于 2016-5-21 21:57 | 显示全部楼层 |阅读模式
本帖最后由 longchaowu 于 2016-5-22 09:25 编辑

现有这个表格的查询和求值我都是用公式做的,数据越来越多,也越来越卡,我抽取了其中三个,望朋友们能用数组或字典帮实现,谢谢!已更新模拟结果
最佳答案
2016-5-22 06:04
  1. Sub Macro1()
  2. Dim arr, ar, brr, crr, d, d2, i&, n&
  3. Set d = CreateObject("scripting.dictionary")
  4. Set d2 = CreateObject("scripting.dictionary")
  5. Sheet1.Activate
  6. arr = Sheet2.UsedRange
  7. brr = Sheet3.UsedRange
  8. crr = Sheet4.UsedRange
  9. ReDim ar(1 To UBound(arr), 1 To 5)
  10. w = Array("呆滞及不良品仓", "售后配件仓", "售后报废仓", "退料仓", "报废仓", "售后不良品仓")
  11. For i = 0 To UBound(w)
  12.     d(w(i)) = ""
  13. Next
  14. For i = 3 To UBound(arr)
  15.     If Not d.exists(arr(i, 2)) Then
  16.         If Not d2.exists(arr(i, 3)) Then
  17.             s = s + 1
  18.             d2(arr(i, 3)) = s
  19.             ar(s, 1) = arr(i, 4)
  20.             ar(s, 2) = arr(i, 5)
  21.             ar(s, 3) = arr(i, 12)
  22.         Else
  23.             n = d2(arr(i, 3))
  24.             ar(n, 3) = ar(n, 3) + arr(i, 12)
  25.         End If
  26.     End If
  27. Next
  28. For i = 3 To UBound(brr)
  29.     If d2.exists(brr(i, 15)) Then
  30.         n = d2(brr(i, 15))
  31.         ar(n, 4) = ar(n, 4) + brr(i, 8)
  32.     End If
  33. Next
  34. For i = 2 To UBound(crr)
  35.     If d2.exists(crr(i, 7)) Then
  36.         n = d2(crr(i, 7))
  37.         ar(n, 5) = ar(n, 5) + crr(i, 23) - crr(i, 30)
  38.     End If
  39. Next
  40. For i = 2 To Range("b65536").End(xlUp).Row
  41.     If d2.exists(Cells(i, 2).Value) Then
  42.         n = d2(Cells(i, 2).Value)
  43.         Cells(i, 3) = ar(n, 1)
  44.         Cells(i, 4) = ar(n, 2)
  45.         Cells(i, "h") = ar(n, 3)
  46.         Cells(i, "j") = ar(n, 4)
  47.         Cells(i, "k") = ar(n, 5)
  48.     End If
  49. Next
  50. End Sub
复制代码
发表于 2016-5-22 06:04 | 显示全部楼层    本楼为最佳答案   
  1. Sub Macro1()
  2. Dim arr, ar, brr, crr, d, d2, i&, n&
  3. Set d = CreateObject("scripting.dictionary")
  4. Set d2 = CreateObject("scripting.dictionary")
  5. Sheet1.Activate
  6. arr = Sheet2.UsedRange
  7. brr = Sheet3.UsedRange
  8. crr = Sheet4.UsedRange
  9. ReDim ar(1 To UBound(arr), 1 To 5)
  10. w = Array("呆滞及不良品仓", "售后配件仓", "售后报废仓", "退料仓", "报废仓", "售后不良品仓")
  11. For i = 0 To UBound(w)
  12.     d(w(i)) = ""
  13. Next
  14. For i = 3 To UBound(arr)
  15.     If Not d.exists(arr(i, 2)) Then
  16.         If Not d2.exists(arr(i, 3)) Then
  17.             s = s + 1
  18.             d2(arr(i, 3)) = s
  19.             ar(s, 1) = arr(i, 4)
  20.             ar(s, 2) = arr(i, 5)
  21.             ar(s, 3) = arr(i, 12)
  22.         Else
  23.             n = d2(arr(i, 3))
  24.             ar(n, 3) = ar(n, 3) + arr(i, 12)
  25.         End If
  26.     End If
  27. Next
  28. For i = 3 To UBound(brr)
  29.     If d2.exists(brr(i, 15)) Then
  30.         n = d2(brr(i, 15))
  31.         ar(n, 4) = ar(n, 4) + brr(i, 8)
  32.     End If
  33. Next
  34. For i = 2 To UBound(crr)
  35.     If d2.exists(crr(i, 7)) Then
  36.         n = d2(crr(i, 7))
  37.         ar(n, 5) = ar(n, 5) + crr(i, 23) - crr(i, 30)
  38.     End If
  39. Next
  40. For i = 2 To Range("b65536").End(xlUp).Row
  41.     If d2.exists(Cells(i, 2).Value) Then
  42.         n = d2(Cells(i, 2).Value)
  43.         Cells(i, 3) = ar(n, 1)
  44.         Cells(i, 4) = ar(n, 2)
  45.         Cells(i, "h") = ar(n, 3)
  46.         Cells(i, "j") = ar(n, 4)
  47.         Cells(i, "k") = ar(n, 5)
  48.     End If
  49. Next
  50. End Sub
复制代码
回复

使用道具 举报

发表于 2016-5-22 06:11 | 显示全部楼层
模拟的结果有误??

1.zip

310.93 KB, 下载次数: 11

评分

参与人数 1 +1 收起 理由
longchaowu + 1 很给力

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-5-22 09:23 | 显示全部楼层
dsmch 发表于 2016-5-22 06:11
模拟的结果有误??

完美解决,多谢大师!!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 17:53 , Processed in 1.075099 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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