ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请教字典嵌套如何将子key和子item返回到单元格区域

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-12-10 08:08 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 autumnalRain 于 2015-12-27 21:43 编辑

本人正学习香川老师的 字典基本语句、以及中级字典运用例子
http://club.excelhome.net/thread-1154595-1-1.html

无奈实在愚顿,照着老师的例子改自己的代码也报错,有请各位老师就着本例子指点迷津,十分感谢!
如何输出嵌套字典的子KEY和子item?



  1. Sub 字典嵌套()'On Error Resume Next
  2. Dim dic As Object, i As Long
  3. arr = Range([a2], [c2].End(xlDown))

  4. Set dic = CreateObject("Scripting.Dictionary")

  5. For i = 1 To UBound(arr) '设置字典嵌套
  6.     Set dic(arr(i, 1)) = CreateObject("Scripting.Dictionary")
  7. Next

  8. krr = dic.keys
  9. For i = 1 To UBound(arr)
  10.      dic(arr(i, 1))(arr(i, 2)) = dic(arr(i, 1))(arr(i, 2)) + arr(i,3)
  11. Next

  12. ReDim kr(0 To dic.Count - 1) '定义数组kr存放嵌套子字典中的【子key】
  13. ReDim tr(0 To dic.Count - 1) '定义数组tr存放嵌套子字典中的【子item】
  14. For i = 0 To dic.Count - 1
  15.     kr(i) = dic(krr(i)).keys
  16.     tr(i) = dic(krr(i)).items
  17. Next

  18. 'k = kr
  19. 't = tr
  20. [f2].Resize(dic.Count) = WorksheetFunction.Transpose(dic.keys) '输出主KEYS
  21. [g2].Resize(dic.Count, UBound(kr) + 1) = WorksheetFunction.Transpose(WorksheetFunction.Transpose(kr))  '本语句报错,如何输出嵌套【子key】?
  22. [I2].Resize(dic.Count, UBound(tr) + 1) = WorksheetFunction.Transpose(WorksheetFunction.Transpose(tr)) '本语句报错,如何输出嵌套【子item】?
  23. End Sub
复制代码




左数据源右为结果.png

字典嵌套如何输出子KEYS和子ITEMS.rar

19.44 KB, 下载次数: 132

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-10 09:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
就这个例子讲,通过字典嵌套反而复杂些。目的在于通过这个例子学习下如何输出子key和子item?还请老师们指导!

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-10 10:15 | 显示全部楼层

普通字典用法和结果的输出方式:

Sub DicTest1()

    Set dic = CreateObject("Scripting.Dictionary") 'use Dictionary
               
    For i = 1 To 3
        dic(i) = i * 10 '字典赋值
    Next
   
'输出方法-1: 传统方法、提取一维数组结果后转置输出
    [a1].Resize(dic.Count) = WorksheetFunction.Transpose(dic.Keys)
    [b1].Resize(dic.Count) = WorksheetFunction.Transpose(dic.items)
   

'输出方法-2: Array数组合并结果后转置输出   
    [a1].Resize(dic.Count, 2) = WorksheetFunction.Transpose(Array(dic.Keys, dic.items))

   
'下面是详细分解过程:
    kr = dic.Keys '提取keys
    tr = dic.items '提取items
    t1 = Array(dic.Keys, dic.items) '合并
    t2 = WorksheetFunction.Transpose(t1) '转置

'上述过程可以合并为一句代码:
    t = WorksheetFunction.Transpose(Array(dic.Keys, dic.items))
   
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-10 10:17 | 显示全部楼层
字典Item项目的数组用法、以及结果的输出方式:

Sub DicTest2()

    Set dic = CreateObject("Scripting.Dictionary") 'use Dictionary
               
    For i = 1 To 5
        dic(i) = Array(i, i * 10, i * 100) '把数组作为Item项目写入字典
    Next
   
    [a1].CurrentRegion = ""
    [a1].Resize(dic.Count) = WorksheetFunction.Transpose(dic.Keys) 'Output keys result

'字典Items内容为数组时、需要二次转置后才能输出:
    [b1].Resize(dic.Count, 3) = Application.Transpose(Application.Transpose(dic.items))

'或者可以用这个Rept函数处理方法: 不需要转置。
    [b1].Resize(dic.Count, 3) = Application.Rept(dic.items, 1)   
   
End Sub

TA的精华主题

TA的得分主题

发表于 2015-12-10 10:23 | 显示全部楼层
每个人写代码的思路不一样,如果看你的代码,我觉得比较累,还是自己写比较好,代码如下:

  1. Sub test()
  2.     Dim arr, i%, d, rng As Range, c
  3.     Set d = CreateObject("scripting.dictionary")
  4.     arr = Range("A1").CurrentRegion
  5.     [e2:G1048576].ClearContents
  6.     For i = 2 To UBound(arr)
  7.         If Not d.exists(arr(i, 1)) Then Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
  8.         d(arr(i, 1))(arr(i, 2)) = d(arr(i, 1))(arr(i, 2)) + arr(i, 3)
  9.     Next
  10.     For Each c In d.keys
  11.         Set rng = Range("F1048576").End(3).Offset(1)
  12.         rng.Resize(d(c).Count, 2) = Application.Transpose(Array(d(c).keys, d(c).items))
  13.         rng.Resize(d(c).Count, 1).Offset(0, -1) = c
  14.     Next
  15. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-10 10:27 | 显示全部楼层

非常感谢t13564865256老师,百忙中帮助解答!

本帖最后由 autumnalRain 于 2015-12-10 11:13 编辑

本贴是学习用,这个例子体现不出嵌套字典的优势!所以再次感谢各位老师,百忙之中的指导!

字典嵌套如何输出子KEYS和子ITEMS2.rar

17.76 KB, 下载次数: 99

TA的精华主题

TA的得分主题

发表于 2015-12-10 10:29 | 显示全部楼层
autumnalRain 发表于 2015-12-10 10:27
非常感谢t13564865256老师,百忙中帮助解答!
给出的答案如下:
  1. Sub 字典嵌套()
  2. 'On Error Resume Next
  3. Dim dic As Object, i As Long, j As Long
  4. Dim arrOut()
  5. Dim arrOutNum As Long
  6. Dim kr(), tr()
  7. arr = Range([a2], [c2].End(xlDown))
  8. Set dic = CreateObject("Scripting.Dictionary")
  9. For i = 1 To UBound(arr) '设置字典嵌套
  10.     Set dic(arr(i, 1)) = CreateObject("Scripting.Dictionary")
  11. Next
  12. krr = dic.keys
  13. For i = 1 To UBound(arr)
  14.      dic(arr(i, 1))(arr(i, 2)) = dic(arr(i, 1))(arr(i, 2)) + arr(i, 3)
  15. Next
  16. arrOutNum = 0
  17. Erase arrOut
  18. For i = 0 To dic.Count - 1
  19.     kr = dic(krr(i)).keys
  20.     tr = dic(krr(i)).items
  21.     For j = 0 To UBound(kr)
  22.         arrOutNum = arrOutNum + 1
  23.         ReDim Preserve arrOut(1 To 3, 1 To arrOutNum)
  24.         arrOut(1, arrOutNum) = krr(i)
  25.         arrOut(2, arrOutNum) = kr(j)
  26.         arrOut(3, arrOutNum) = tr(j)
  27.     Next j
  28. Next
  29. [e2].Resize(arrOutNum, UBound(arrOut)) = WorksheetFunction.Transpose(arrOut) '输出
  30. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-10 11:07 | 显示全部楼层
huang1314wei 发表于 2015-12-10 10:23
每个人写代码的思路不一样,如果看你的代码,我觉得比较累,还是自己写比较好,代码如下:

十分感谢您的指导!学习……

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-10 11:18 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-12-10 12:08 | 显示全部楼层
字典嵌套看得难以理解,不过既然有大神说其中看不中用,那就不再想了。留名顶帖。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 10:37 , Processed in 0.041938 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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