ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 通俗的来聊聊字典嵌套字典,包教包会

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2023-9-17 16:51 | 显示全部楼层 |阅读模式
    一、认识字典嵌套字典

   字典嵌套字典本论坛貌似没有什么教程,也没有见大佬解讲过,好多新手会觉得这个很神奇,看不懂得。我刚学习时也是一知半解,不知道怎么运用,于是乎就通过两个字典或者更多的字典来解决字典嵌套字典的问题,后面看到大神用的多了,自己理解了一下,其实字典嵌套字典很简单,只要大家能熟悉运用字典,这个嵌套就不是问题。

     我想跟大家说的是,字典嵌套字典,你不用管它嵌套了几层,它终究也是字典,那么字典最重要的就是两样东西,Key 和 Item,即是关键词和指定的键的条目值。大家可以看看彭希仁老大的简要教程。
https://club.excelhome.net/thread-926188-1-2.html?_dsign=0e9b58b6
     这里我想让大家注意的是Key它可以是文本或者数字,而Item可以是文本、数字、数组,单元格,甚至是一个容器知道了这个再来理解字典嵌套字典就不是问题了。大家难以理解字典嵌套字典,是因为我们平时一般使用变量d、dic来表示一个字典,其实a、b、c、Arr、Brr、一、二、李四、王五都可以表示字典,你明白了这个就基本上明白完了。
    下面以例子来进行说明吧,以下图所示。
01.png
    大家想想,这里面到底有几个字典,新手朋友可能想到是一个字典,因为在本地窗口中只发现一个字典,其实这里面有六个字典,分别是d、d(1)、d(2)、d(3)、d(4)、d(5),千万不要以为d、d(1)是同一个字典。
    咱们来聊聊字典嵌套字典这一句关键代码:Set d(i) = CreateObject("scripting.dictionary"),这里面d是一个字典,i是字典d的关键词,当i循环等于1是,关键词是1,Item是CreateObject("scripting.dictionary"),上面我说过了字典的item可以是任何东西,这里就是把d(1)创建成一个字典,同时添加了关键词1,对应的条目就是创建一个字典。下面来到d(i)(j) = j这一句代码,假设i=1,j=1,那么就是d(1)(1)=1,表示的意思是,字典是d(1),d(1)的关键词是1,d(1)对应的键值是1,这样子大家应该都明白了吧。
     有人可能会问,我能不能自己创建嵌套字典,其实是可以的,如我们继续在后面添加Set d(8) = CreateObject("scripting.dictionary"),Set d("一") = CreateObject("scripting.dictionary"),那么字典d就增加了两个关键词,分别是8和“一”,而我们也创建了两个字典,分别是d(8)、d("一“),我们可以分别向这两个字典中添加关键词及键值。
   这样子大家都清楚了吧,有人问了,为什么在本地窗口中看不到创建的嵌套字典,我也不清楚什么原因,VBA中不允许直接创建带有()的字典,如直接创建Set d("一") = CreateObject("scripting.dictionary"),这是不允许的,你必须先创建字典d,才可以继续创建d()这样子的字典,反正你定义dim d("一") as Object,肯定是出错的,所以我们要在本地读取它们,就用一个变量取出来就可以看到了,如a = d(2).keys,  b = d(3).items,大家看我下面的图。
2.png
     大家通过本地窗口,把一个变量赋值给嵌套的字典,就会把字典嵌套字典的皮扒完。大家自己尝试把d、d(1)、d(2)、d(3)的关键词、键值读取出来放到单元格中。说了这么多,大家估计对字典嵌套字典有了更深的认识。下面我来聊聊字典嵌套字典的用法,用实例来讲解。


二、字典嵌套字典运用方法
    字典嵌套主要用在有分组的数据中,如经典的按列拆分工作表、工作簿,有分组用字典嵌套字典来简单明了,第一层字典获得分组关键词,第二层字典以分组关键词创建字典,第二层字典的关键词取得定位,然后把这些行放入到数组当中,这个就是字典嵌套字典的经典用法。
    咱们先来一个简单的,一 一对应 ,即关键词与键值关系,把字典嵌套字典的值取出来。如下图所示,一维转二维。
一维转二维.rar (17.26 KB, 下载次数: 405)

3-1.png
姓名有分组,有多个值,所以可以利用字典嵌套字典,对应代码
3.png
     我们以A列B列合并作为字典的dic的关键词,C列科目作为嵌套字典的关键词,D列成绩作为嵌套字典后的键值,然后我们通过循环把这些嵌套字典的键值放回到二维表中。Arr(n, j) = dic(k)(Arr(1, j))这里dic(k)就是一个嵌套字典,Arr(1, j)是它的关键词,如取第一个字典dic的关键词就是”张三“,那么创建的嵌套字典就是dic(”张三“),它的第一个关键词是”语文“,所以dic(”张三“)(”语文“)对应的键值是76,我们把它放到数组Arr(2,3)中存放,其它依次取值就得到Arr数组,回填写到单元格中就可以了。


     咱们再来一个字典进行定位的,大家对嵌套就更加深刻了,按列拆分成工作表。如下图所示:
按某列拆分成工作表(字典嵌套字典-利用字典进行定位).rar (47.01 KB, 下载次数: 310)
4-1.png
     我们要按照 H列的项目进行拆分工作表,有分组那么就可以字典嵌套字典,这里我们就是H列作为字典dic的关键词,以dic(关键词)创建嵌套字典,嵌套字典的关键词为行号,这样子就能定位,且不会有重复,嵌套字典对应的键值可以为空,也可以引用整行,因为我们已经定位好了,所以嵌套字典对应的键值不需要也没有关系,有时候我们也可以使用嵌套字典对应的键值等于行号,用键值来进行定位也是可以的,大家都可以尝试,我上传的两个附件中也有相对应的代码。
4-2.png
   先看这个简单的代码吧,dic(key)(i) = Application.Index(Arr, i),嵌套字典的键值我们直接用数组的一行,也就是工作表中的A:H的某行,用这个也想跟大家说明,字典的键值可以为一个数组。For Each k In dic.keys这里就是,k就是分组的依据,即是第一层字典的关键词,这里是"合新项目"、"集大原项目"……,而嵌套的字典就是dic("合新项目"),嵌套字典的关键词为行号,举个例子dic("合新项目"),1,2,3行都是它的关键词,而A4:H6是它的对应的键值,然后再通过Application.Rept(dic(k).items, 1)来把键值输出来。
    同是这个例子,我们不要嵌套字典的键值,大家可能会更清晰明了。
4-3.png
   上面的代码中,k也是分组的依据,即是第一层字典的关键词,这里是"合新项目"、"集大原项目"……,而kk就是行号,我们既然有了Arr的行号,那么在结果Brr中,我们循环一下就得各个分组的数据了,这个我觉得就是最经典的字典嵌套字典的用法了。
  
    好了,就聊到这里吧,不知道说的对不对,我也是小白,希望大家多多指教。







   




评分

28

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-27 19:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
看到这么同志这么有兴趣,特意来一个四级字典嵌套的例子给大家理解,其实字典嵌套字典超级简单。
如下图一所示,由一维转为二维表。厂、班组,工组,产品等级都有分组,完全可以用字典嵌套字典,需要说明的是,以下例子用一个字典完全能解决,不必要用到四层字典嵌套,这里只是为了理解字典嵌套,同学们不要说多此一举啊。



1.png

字典嵌套代码如下图所示,因为比较简单就不一 一作说明了。
2024-06-27_191908.png
案例数据下载
四级字典取值.rar (17.28 KB, 下载次数: 106)



评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-17 18:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
上面第一个图中,应该是有7个字典才对,分别是六个字典,分别是d、d(1)、d(2)、d(3)、d(4)、d(5)、d(6)

TA的精华主题

TA的得分主题

发表于 2023-9-17 18:39 | 显示全部楼层
不错,对字典理解比较透彻,赞一个!

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-17 18:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ykcbf1100 发表于 2023-9-17 18:39
不错,对字典理解比较透彻,赞一个!

还有很多不懂得,你才是懂得多,又热情,还请多多指导

TA的精华主题

TA的得分主题

发表于 2023-9-17 19:00 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-9-17 19:19 | 显示全部楼层
lizhipei78 发表于 2023-9-17 18:54
还有很多不懂得,你才是懂得多,又热情,还请多多指导

可以相互交流。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-17 19:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
吴中泉 发表于 2023-9-17 19:00
搬个板登坐下来好好学习.

班门弄斧啊,你们都是我学习的榜样

TA的精华主题

TA的得分主题

发表于 2023-9-18 08:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一维转二维按照上述贴图代码,好像只能出两列数据

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-9-18 08:22 | 显示全部楼层
YANWEI82123300 发表于 2023-9-18 08:05
一维转二维按照上述贴图代码,好像只能出两列数据

你下载附件测试一下看看,我这里好像没有问题

TA的精华主题

TA的得分主题

发表于 2023-9-18 08:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个在实际中还是能遇到的,增加了对字典的理解。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-26 03:25 , Processed in 0.043700 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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