Excel VBA学习笔记:字典的嵌套用法

字典的结构:Dic(Key)=Item;字典的嵌套就是将Dic(Key)也设成1个字典,Dic(KeyA)(KeyB)=ItemB 。Dic(KeyA)为新的字典名,KeyB为新字典的Key值,ItemB为新字典的条目 。
示例:

Excel VBA学习笔记:字典的嵌套用法

【Excel VBA学习笔记:字典的嵌套用法】先以“类别名”为Key,去重,得到D列数据;再以“名字”为Key,去重后就能得到E列数据 。这就需要用到字典的嵌套 。
arr = Range("A2", [B2].End(xlDown))Set dic = CreateObject("Scripting.Dictionary")'先创建1个字典For i = 1 To UBound(arr)If Not dic.exists(arr(i, 1)) Then'判断dic(类别名)是否重复,类别名第1次出现才创建字典Set dic(arr(i, 1)) = CreateObject("Scripting.Dictionary")'创建名称为dic(1)、dic(2)、dic(*)共4个字典End Ifdic(arr(i, 1))(arr(i, 2)) = ""'dic(arr(i, 1))是字典名,arr(i, 2)为Key值,Item值为空 , 这样对名字去重NextReDim brr(1 To dic.Count, 1 To 2)For i = 1 To dic.Countbrr(i, 1) = dic.Keys()(i - 1)'Dic的Key值就是类别1、2、3、4 , 存于brr的第1列中brr(i, 2) = Join(dic(dic.Keys()(i - 1)).Keys, " ")'dic.Keys()(i - 1)的值是类别1、2、*;然后字典dic(*).Keys , 就是甲、乙等数据构成的一维数组NextRange("D2", [E2].End(xlDown)).ClearContents[d2].Resize(dic.Count, 2) = brr
很遗憾,在VBA本地窗口看不到 , 嵌套层的字典情况;只能自行脑补 。
Excel VBA学习笔记:字典的嵌套用法

示例二:
Excel VBA学习笔记:字典的嵌套用法

要做一个班级内的排名 , 思路:首先按分数进行一个降序排序,以班级名创建字典,在“班级名”的字典中以“分数”为Key值,Item记录名次 。循环时,第1个分数就是第1名 , 第2个不重复的分数就是第2名,Item为累加值 。
Set dic = CreateObject("Scripting.Dictionary")Range("A2", [C2].End(xlDown)).Sort Range("c2"), xlDescending, Header:=xlNo'排序arr = Range("A2", [C2].End(xlDown))For i = 1 To UBound(arr)If Not dic.exists(arr(i, 1)) Then'第1次循环到这个班级 , 即创建班级字典Set dic(arr(i, 1)) = CreateObject("Scripting.Dictionary")dic(arr(i, 1))(arr(i, 3)) = 1'循环碰到的第1个,为每班级第1名ElseIf Not dic(arr(i, 1)).exists(arr(i, 3)) Then'判断这个分数是不是第1次碰到 , 是,则名次要 1dic(arr(i, 1))(arr(i, 3)) = Application.Index(dic(arr(i, 1)).items, dic(arr(i, 1)).Count)1// Index(dic(arr(i, 1)).items, dic(arr(i, 1)).Count) 取班级字典中最后Item,就是班级名次排到哪了End IfNextReDim 排名(1 To UBound(arr), 1 To 1)For i = 1 To UBound(arr)排名(i, 1) = dic(arr(i, 1))(arr(i, 3))Next[D2].Resize(UBound(arr), 1) = 排名
这种排名是中国式排名,重复的名次不占用排名序数 。年级排名可用函数,也可以用字典,数据量很大的情况下用字典更快些(不需要嵌套,只要分数作为Key , Item进行累加) 。

相关经验推荐