Excel精英培训网

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

[已解决]dsmch老师,不好意思又得麻烦您了,再帮忙看看这个solit的问题

[复制链接]
发表于 2015-2-28 13:36 | 显示全部楼层 |阅读模式
不好意思 dsmch老师,现在又有这个要求,我是怎么改都改不了。现在的附加的要求是这样的,,有三个参数,A开头的都是乘以58,V开头的都是乘以55,其他字母开头的都是乘以53。。。最大的难点就是,当是A1\A5\V1\V3出现的时候,A1和A5的计算结果都是   数量*58/A1+A5(合计出现次数)   V1和V3的计算结果都是  数量*58/V1+V3(合计出现次数)  而不是数量/A1A5V1V3合计数量


谢谢老师了,我实在是没有办法了
,昨晚也是实在没有办法了,束手无策了,在论坛瞎逛,幸运的是荣幸的帮助到了别人(简单的小题了,呜呜)
最佳答案
2015-2-28 19:36
正确与否,不再修改
  1. Sub Macro1()
  2. Dim arr, brr, lb, d, d2, d3, i&, j%, k%
  3. Set d = CreateObject("scripting.dictionary")
  4. Set d2 = CreateObject("scripting.dictionary")
  5. Set d3 = CreateObject("scripting.dictionary")
  6. arr = [a7:a25]
  7. brr = Range("a1").CurrentRegion
  8. w = Array(2, 5)
  9. For i = 1 To UBound(arr)
  10.     d(arr(i, 1)) = d(arr(i, 1)) + 1
  11. Next
  12. d("A") = 58: d("V") = 55
  13. For i = 2 To UBound(brr)
  14.     For j = 0 To 1
  15.         x = Split(brr(i, w(j)), "")
  16.         ReDim lb(1 To 50) '拆分类别放入数组
  17.         n = 0: n2 = brr(i, w(j) + 1) '数量
  18.         For k = 0 To UBound(x)
  19.             n = n + 1
  20.             lb(n) = x(k)
  21.             z = Left(x(k), 1)
  22.             d3(z) = d3(z) + d(x(k))
  23.         Next
  24.         For jj = 1 To n
  25.             z = Left(lb(jj), 1)
  26.             If d.exists(z) Then s = d(z) Else s = 53
  27.             d2(lb(jj)) = d2(lb(jj)) + n2 * s / d3(z)
  28.         Next
  29.         Erase lb
  30.         d3.RemoveAll
  31.     Next
  32. Next
  33. For i = 1 To UBound(arr)
  34.     arr(i, 1) = d2(arr(i, 1))
  35. Next
  36. Range("b7").Resize(UBound(arr)) = arr
  37. End Sub
复制代码
 楼主| 发表于 2015-2-28 13:37 | 显示全部楼层
http://www.excelpx.com/thread-339435-1-1.html
原帖是这个
哒哒哒.png

求split求数.rar

12.03 KB, 下载次数: 3

回复

使用道具 举报

发表于 2015-2-28 14:00 | 显示全部楼层
  1. Sub Macro1()
  2. Dim arr, brr, lb, d, d2, i&, j%, k%
  3. Set d = CreateObject("scripting.dictionary")
  4. Set d2 = CreateObject("scripting.dictionary")
  5. arr = [a7:a25]
  6. brr = Range("a1").CurrentRegion
  7. w = Array(2, 5)
  8. ReDim crr(1 To UBound(arr), 1 To UBound(brr) - 1)
  9. For i = 1 To UBound(arr)
  10.     d(arr(i, 1)) = d(arr(i, 1)) + 1
  11. Next
  12. For i = 2 To UBound(brr)
  13.     ReDim lb(1 To 100) '拆分类别放入数组
  14.     n = brr(i, 3) + brr(i, 6)
  15.     s = 0: n2 = 0
  16.     For j = 0 To 1
  17.         x = Split(brr(i, w(j)), "")
  18.         For k = 0 To UBound(x)
  19.             s = s + d(x(k))
  20.             n2 = n2 + 1
  21.             lb(n2) = x(k)
  22.         Next
  23.     Next
  24.     For j = 1 To n2
  25.         If lb(j) Like "A*" Then
  26.             s2 = 58
  27.         ElseIf lb(j) Like "V*" Then
  28.             s2 = 55
  29.         Else
  30.             s2 = 53
  31.         End If
  32.         d2(lb(j)) = d2(lb(j)) + n * s2 / s
  33.     Next
  34.     Erase lb
  35. Next
  36. For i = 1 To UBound(arr)
  37.     arr(i, 1) = d2(arr(i, 1))
  38. Next
  39. Range("b7").Resize(UBound(arr)) = arr
  40. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2015-2-28 17:31 | 显示全部楼层
dsmch 发表于 2015-2-28 14:00

老师,太感谢您了,不过由于我表达能力太差了,,,没描述清楚

是这样的,比如B2单元格内容为K1\KP\V1\V3 (K1在A7:A27共出现3次,KP共出现1次 ,V1和V3也各为一次)  其对应的C2单元格的数值为5  的时候,应该是这么算的。。   K1和KP的计算方式是  5(数值)*53(参数)/4(K1的三次+KP的一次)而不把V1和V3的也算上,,,所以,是除以4,而不是除以6


谢谢老师了
大多.png

点评

用excel附件模拟结果,列明规则  发表于 2015-2-28 18:00
回复

使用道具 举报

发表于 2015-2-28 19:36 | 显示全部楼层    本楼为最佳答案   
正确与否,不再修改
  1. Sub Macro1()
  2. Dim arr, brr, lb, d, d2, d3, i&, j%, k%
  3. Set d = CreateObject("scripting.dictionary")
  4. Set d2 = CreateObject("scripting.dictionary")
  5. Set d3 = CreateObject("scripting.dictionary")
  6. arr = [a7:a25]
  7. brr = Range("a1").CurrentRegion
  8. w = Array(2, 5)
  9. For i = 1 To UBound(arr)
  10.     d(arr(i, 1)) = d(arr(i, 1)) + 1
  11. Next
  12. d("A") = 58: d("V") = 55
  13. For i = 2 To UBound(brr)
  14.     For j = 0 To 1
  15.         x = Split(brr(i, w(j)), "")
  16.         ReDim lb(1 To 50) '拆分类别放入数组
  17.         n = 0: n2 = brr(i, w(j) + 1) '数量
  18.         For k = 0 To UBound(x)
  19.             n = n + 1
  20.             lb(n) = x(k)
  21.             z = Left(x(k), 1)
  22.             d3(z) = d3(z) + d(x(k))
  23.         Next
  24.         For jj = 1 To n
  25.             z = Left(lb(jj), 1)
  26.             If d.exists(z) Then s = d(z) Else s = 53
  27.             d2(lb(jj)) = d2(lb(jj)) + n2 * s / d3(z)
  28.         Next
  29.         Erase lb
  30.         d3.RemoveAll
  31.     Next
  32. Next
  33. For i = 1 To UBound(arr)
  34.     arr(i, 1) = d2(arr(i, 1))
  35. Next
  36. Range("b7").Resize(UBound(arr)) = arr
  37. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2015-2-28 20:13 | 显示全部楼层
dsmch 发表于 2015-2-28 19:36
正确与否,不再修改

谢谢老师,您辛苦了。。太感谢您了。回头一定要好好啃您的这个代码。。。谢谢谢谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 01:43 , Processed in 0.423279 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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