ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 月关

[分享] 字典嵌套小白入门笔记

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-9 11:42 | 显示全部楼层
一把小刀闯天下 发表于 2019-10-9 10:44
一般用字典数组,很少用字典嵌套

E列工作簿、D列工作表。先有序不用字典估计也能解决,,,

多谢老师。
解法有很多,只是单纯的学习字典嵌套而已。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-9 11:47 | 显示全部楼层
ykqrs 发表于 2019-10-9 11:14
好久没来,今天进坛子正好碰到这个贴,本想练练手,呵呵,手生了,好一个找帖子抄,终于炒出来了,费这么大 ...

忍不住,有点忍不住,请先原谅学生的鄙俗。。。
看了您发上来的代码,有种感觉。。。。感觉就是。。。。一个人在拉屎,屎头子都快掉地上了,又给他硬塞回去,然后再用手拽出来……… 这就是最后加那个brr数组给我的感觉,抱歉抱歉,请无视我的浅薄…… ……

TA的精华主题

TA的得分主题

发表于 2019-10-9 11:48 | 显示全部楼层
月关 发表于 2019-10-9 11:41
虽然有点跑偏,但是老师的这个用法还是第一次见,好像挺不错,有啥名头没?类似于字典、正则这样的,回头 ...

姑且称为,字典嵌套集合

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-9 11:57 | 显示全部楼层
1#最后的代码有几句没有意义,根据11#老师的指正删改如下:

Sub 字典套字典基础入门案例()
Dim d As Object, area, school, id, person, age, s, n&
arr = [a1].CurrentRegion
Set d = CreateObject("scripting.dictionary")
For i = 2 To UBound(arr)
area = arr(i, 5): school = arr(i, 4): id = arr(i, 1): person = arr(i, 2): age = arr(i, 3)
    If Not d.exists(area) Then Set d(area) = CreateObject("scripting.dictionary")
    If Not d(area).exists(school) Then Set d(area)(school) = CreateObject("scripting.dictionary")
    d(area)(school)(id) = Array(person, age)
Next

s = Array("地区", "高校", "学号", "姓名", "年龄")
Application.ScreenUpdating = False
For Each area In d.keys
    Workbooks.Add
    With ActiveWorkbook
        For Each school In d(area)
            .Worksheets.Add.Name = school: n = 0
            For Each id In d(area)(school)
                n = n + 1
                Cells(1, 1).Resize(, 5) = s
                Cells(n + 1, 1) = area
                Cells(n + 1, 2) = school
                Cells(n + 1, 3) = id
                Cells(n + 1, 4).Resize(, 2) = d(area)(school)(id)
            Next
        Next
    .SaveAs ThisWorkbook.Path & "\" & area & ".xlsx"
    .Close True
    End With
Next
Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

发表于 2019-10-9 12:36 | 显示全部楼层
月关 发表于 2019-10-9 11:47
忍不住,有点忍不住,请先原谅学生的鄙俗。。。
看了您发上来的代码,有种感觉。。。。感觉就是。。。。 ...

那就直接COPY
  1. Sub 字典套字典基础入门案例()
  2. Dim d As Object, arr, i%, aa, bb
  3. arr = [a1].CurrentRegion
  4. Set d = CreateObject("scripting.dictionary")
  5. For i = 2 To UBound(arr)
  6. If Not d.exists(arr(i, 5)) Then Set d(arr(i, 5)) = CreateObject("scripting.dictionary")
  7. If Not d(arr(i, 5)).exists(arr(i, 4)) Then Set d(arr(i, 5))(arr(i, 4)) = Cells(1, 1).Resize(1, 5)
  8. Set d(arr(i, 5))(arr(i, 4)) = Union(d(arr(i, 5))(arr(i, 4)), Cells(i, 1).Resize(1, 5))
  9. Next
  10. Application.ScreenUpdating = False
  11. Application.DisplayAlerts = False
  12. For Each aa In d.keys
  13. Workbooks.Add
  14. With ActiveWorkbook
  15. For Each bb In d(aa).keys
  16. .Worksheets.Add.Name = bb
  17. With .Worksheets(bb)
  18. d(aa)(bb).Copy .Range("a1")
  19. End With
  20. Next
  21. .SaveAs ThisWorkbook.Path & "" & aa & ".xlsx"
  22. .Close True
  23. End With
  24. Next
  25. Application.ScreenUpdating = True
  26. Application.DisplayAlerts = True
  27. End Sub

复制代码

TA的精华主题

TA的得分主题

发表于 2019-10-9 13:49 | 显示全部楼层
月关 发表于 2019-10-9 11:57
1#最后的代码有几句没有意义,根据11#老师的指正删改如下:

Sub 字典套字典基础入门案例()

有时间可以多模拟些数据,看看你这个直接操作单元格的运行速度和我那一个你有点忍不住的哪个快?

TA的精华主题

TA的得分主题

发表于 2019-10-9 14:02 | 显示全部楼层
字典嵌套不好玩,变通方法多的是,我只重视结果正确,不看效率                                                

TA的精华主题

TA的得分主题

发表于 2019-10-9 14:03 | 显示全部楼层
  1. Sub test()
  2.     arr = [a1].CurrentRegion
  3.     Set d = CreateObject("scripting.dictionary")
  4.     For i = 2 To UBound(arr)
  5.         If Not d.exists(arr(i, 5)) Then Set d(arr(i, 5)) = CreateObject("scripting.dictionary")
  6.         If Not d(arr(i, 5)).exists(arr(i, 4)) Then Set d(arr(i, 5))(arr(i, 4)) = CreateObject("scripting.dictionary")
  7.         d(arr(i, 5))(arr(i, 4))(i) = Array(arr(i, 1), arr(i, 2), arr(i, 3))
  8.     Next
  9.     n = 1
  10.     For Each x In d.keys
  11.         Cells(n, 8) = x
  12.         For Each y In d(x).keys
  13.             Cells(n, 9) = y
  14.             Cells(n, 10).Resize(d(x)(y).Count, 3) = Application.Transpose(Application.Transpose(d(x)(y).items))
  15.             n = Cells(65536, 10).End(3).Row + 1
  16.         Next
  17.         n = Cells(65536, 10).End(3).Row + 1
  18.     Next
  19. End Sub
复制代码
学习学习,嵌套一下。不想建新文件,直接输出到表中吧,把学生的3个信息作为item,直接输出字典的items就行

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-9 14:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ykqrs 发表于 2019-10-9 13:49
有时间可以多模拟些数据,看看你这个直接操作单元格的运行速度和我那一个你有点忍不住的哪个快?

听出老师见怪来了。。。。
但其实这题不关解法,不关效率。
仅仅是我想学习字典嵌套不得其门而入,偶然一天看到一个求助贴然后豁然贯通。

那个帖子被删了,但我觉得用来理解学习字典嵌套很好,所以把它还原出来,用来给和我当初一样卡住的人参悟。

TA的精华主题

TA的得分主题

发表于 2019-10-9 14:19 | 显示全部楼层
本帖最后由 micch 于 2019-10-9 14:22 编辑

add工作表学习

Sub test()
    arr = [a1].CurrentRegion
    ar = [a1:c1]
    Set d = CreateObject("scripting.dictionary")
    For i = 2 To UBound(arr)
        If Not d.exists(arr(i, 5)) Then Set d(arr(i, 5)) = CreateObject("scripting.dictionary")
        If Not d(arr(i, 5)).exists(arr(i, 4)) Then Set d(arr(i, 5))(arr(i, 4)) = CreateObject("scripting.dictionary")
        d(arr(i, 5))(arr(i, 4))(i) = Array(arr(i, 1), arr(i, 2), arr(i, 3))
    Next
    For Each x In d.keys
        For Each y In d(x).keys
            Worksheets.Add.Name = y
            Worksheets(y).[a1:c1] = ar
            Worksheets(y).[a2].Resize(d(x)(y).Count, 3) = Application.Transpose(Application.Transpose(d(x)(y).items))
        Next
    Next
End Sub

评分

2

查看全部评分

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

本版积分规则

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

GMT+8, 2024-5-28 11:14 , Processed in 0.033754 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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