一、认识字典嵌套字典 字典嵌套字典本论坛貌似没有什么教程,也没有见大佬解讲过,好多新手会觉得这个很神奇,看不懂得。我刚学习时也是一知半解,不知道怎么运用,于是乎就通过两个字典或者更多的字典来解决字典嵌套字典的问题,后面看到大神用的多了,自己理解了一下,其实字典嵌套字典很简单,只要大家能熟悉运用字典,这个嵌套就不是问题。 我想跟大家说的是,字典嵌套字典,你不用管它嵌套了几层,它终究也是字典,那么字典最重要的就是两样东西,Key 和 Item,即是关键词和指定的键的条目值。大家可以看看彭希仁老大的简要教程。 https://club./thread-926188-1-2.html?_dsign=0e9b58b6 这里我想让大家注意的是Key它可以是文本或者数字,而Item可以是文本、数字、数组,单元格,甚至是一个容器,知道了这个再来理解字典嵌套字典就不是问题了。大家难以理解字典嵌套字典,是因为我们平时一般使用变量d、dic来表示一个字典,其实a、b、c、Arr、Brr、一、二、李四、王五都可以表示字典,你明白了这个就基本上明白完了。 下面以例子来进行说明吧,以下图所示。 大家想想,这里面到底有几个字典,新手朋友可能想到是一个字典,因为在本地窗口中只发现一个字典,其实这里面有六个字典,分别是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,大家看我下面的图。 大家通过本地窗口,把一个变量赋值给嵌套的字典,就会把字典嵌套字典的皮扒完。大家自己尝试把d、d(1)、d(2)、d(3)的关键词、键值读取出来放到单元格中。说了这么多,大家估计对字典嵌套字典有了更深的认识。下面我来聊聊字典嵌套字典的用法,用实例来讲解。 二、字典嵌套字典运用方法 字典嵌套主要用在有分组的数据中,如经典的按列拆分工作表、工作簿,有分组用字典嵌套字典来简单明了,第一层字典获得分组关键词,第二层字典以分组关键词创建字典,第二层字典的关键词取得定位,然后把这些行放入到数组当中,这个就是字典嵌套字典的经典用法。 咱们先来一个简单的,一 一对应 ,即关键词与键值关系,把字典嵌套字典的值取出来。如下图所示,一维转二维。 姓名有分组,有多个值,所以可以利用字典嵌套字典,对应代码 我们以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数组,回填写到单元格中就可以了。 咱们再来一个字典进行定位的,大家对嵌套就更加深刻了,按列拆分成工作表。如下图所示: 我们要按照 H列的项目进行拆分工作表,有分组那么就可以字典嵌套字典,这里我们就是H列作为字典dic的关键词,以dic(关键词)创建嵌套字典,嵌套字典的关键词为行号,这样子就能定位,且不会有重复,嵌套字典对应的键值可以为空,也可以引用整行,因为我们已经定位好了,所以嵌套字典对应的键值不需要也没有关系,有时候我们也可以使用嵌套字典对应的键值等于行号,用键值来进行定位也是可以的,大家都可以尝试,我上传的两个附件中也有相对应的代码。 先看这个简单的代码吧,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)来把键值输出来。 同是这个例子,我们不要嵌套字典的键值,大家可能会更清晰明了。 上面的代码中,k也是分组的依据,即是第一层字典的关键词,这里是'合新项目'、'集大原项目'……,而kk就是行号,我们既然有了Arr的行号,那么在结果Brr中,我们循环一下就得各个分组的数据了,这个我觉得就是最经典的字典嵌套字典的用法了。 好了,就聊到这里吧,不知道说的对不对,我也是小白,希望大家多多指教。 |
|