ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: kisses88

[求助] 求助,如何能将多个内容汇总在同一单元格里,且按所占比例由大到小列出

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-12-4 17:38 | 显示全部楼层
我猜应该是金额栏有非数字单元格,你试试。

问题二.rar

12.53 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2014-12-4 17:41 | 显示全部楼层
  1. Sub test()
  2.   Dim d As New Dictionary
  3.   Dim r%, i%
  4.   Dim arr, brr()
  5.   With Worksheets("sheet1")
  6.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  7.     r = 18
  8.     arr = .Range("a2:c" & r)
  9.     For i = 1 To UBound(arr)
  10.       If Not d.Exists(arr(i, 1)) Then
  11.         Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
  12.       End If
  13.       If IsNumeric(arr(i, 3)) Then
  14.         d(arr(i, 1))(arr(i, 2)) = d(arr(i, 1))(arr(i, 2)) + arr(i, 3)
  15.       End If
  16.     Next
  17.   End With
  18.   For Each aa In d.Keys
  19.     hj = Application.Sum(d(aa).Items)
  20.     If hj <> 0 Then
  21.       For Each bb In d(aa).Keys
  22.         If IsNumeric(d(aa)(bb)) Then
  23.           d(aa)(bb) = d(aa)(bb) / hj
  24.         End If
  25.       Next
  26.     End If
  27.     kk = d(aa).Keys
  28.     tt = d(aa).Items
  29.     For i = 0 To UBound(tt) - 1
  30.       p = i
  31.       For j = i + 1 To UBound(tt)
  32.         If tt(p) < tt(j) Then
  33.           p = j
  34.         End If
  35.       Next
  36.       If p <> i Then
  37.         temp = tt(i): tt(i) = tt(p): tt(p) = temp
  38.         temp = kk(i): kk(i) = kk(p): kk(p) = temp
  39.       End If
  40.     Next
  41.     ss = ""
  42.     For i = 0 To UBound(kk)
  43.       ss = ss & "/" & kk(i) & Format(tt(i), "0%")
  44.     Next
  45.     d(aa) = Mid(ss, 2)
  46.   Next
  47.   ReDim brr(1 To d.Count, 1 To 2)
  48.   m = 0
  49.   For Each aa In d.Keys
  50.     m = m + 1
  51.     brr(m, 1) = aa
  52.     brr(m, 2) = d(aa)
  53.   Next
  54.   With Worksheets("sheet1")
  55.     .Range("f1").Resize(UBound(brr), 2) = brr
  56.   End With
  57. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-12-4 17:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
你分析得对!就是字符串超过255个字符了。现在修改好了,连带一些其他出错的可能都纠正了。

问题二.rar

12.71 KB, 下载次数: 9

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-12-4 18:40 | 显示全部楼层
  1. Sub t()
  2. '需要安装ACTIVERUBY ,下载地址 http://www.artonx.org/data/asr/Ruby-2.1.1.msi
  3. Set ojs = CreateObject("scriptcontrol"): ojs.Language = "rubyscript"
  4. y = ojs.eval("def aa(aa);$aa=aa;end")
  5. y = ojs.Run("aa", Sheet1.Range("a2", [c2].End(4)).Value)
  6. y = ojs.eval("h={};$aa.map{|x|(h[x[0]]||=[])<<x[1..2]};h.map{|k,v|z=v.map(&:last).reduce(:+);h1=Hash.new(0);v.map{|t|h1[t[0]]+=t[1]};s=h1.map{|k1,v1|[k1,(((v1/z)*100).round)]}.sort_by{|n|-n[1]}.map{|m|m[0]+' '+m[1].to_s+'%'}.join('/');[k,s]}")
  7. Sheet1.[a30].Resize(UBound(y) + 1, 2) = y
  8. Set ojs = Nothing
  9. 'Stop
  10. End Sub
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-4 20:33 | 显示全部楼层
chxw68 发表于 2014-12-4 17:42
你分析得对!就是字符串超过255个字符了。现在修改好了,连带一些其他出错的可能都纠正了。

这次完美了。感谢大侠相助,感谢EXCEL HOME~~年末报表多如牛毛啊,没点技巧得死多少回。

点评

只要能对你的工作有所帮助,我就很开心。  发表于 2014-12-4 20:54

TA的精华主题

TA的得分主题

发表于 2024-11-16 14:36 来自手机 | 显示全部楼层
chxw68 发表于 2014-12-4 17:42
你分析得对!就是字符串超过255个字符了。现在修改好了,连带一些其他出错的可能都纠正了。

请教chxw68大侠,如果想将每一类金额合计也写进去,如何修改代码!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 23:50 , Processed in 0.041923 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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