字典的结构:Dic(Key)=Item;字典的嵌套就是将Dic(Key)也设成1个字典,Dic(KeyA)(KeyB)=ItemB。Dic(KeyA)为新的字典名,KeyB为新字典的Key值,ItemB为新字典的条目。
示例:
先以类别名为Key ,去重,得到D列数据;再以名字为Key,去重后就能得到E列数据。这就需要用到字典的嵌套。
arr = Range("A2", [B2].End(xlDown))Setdic = CreateObject("Scripting.Dictionary")先创建1个字典 For i = 1 To UBound(arr) If Not dic.exists(arr(i, 1)) Then判断dic(类别名)是否重复,类别名第1次出现才创建字典Setdic(arr(i,1)) = CreateObject("Scripting.Dictionary")创建名称为dic(1)、dic(2)、dic(*)共4个字典 End If dic(arr(i, 1))(arr(i, 2)) = ""dic(arr(i,1))是字典名,arr(i,2)为Key值,Item值为空,这样对名字去重NextReDim brr(1Todic.Count,1To2)Fori =1Todic.Count brr(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本地窗口看不到,嵌套层的字典情况;只能自行脑补。
示例二:
要做一个班级内的排名,思路:首先按分数进行一个降序排序,以班级名创建字典,在班级名的字典中以分数为Key值,Item记录名次。循环时,第1个分数就是第1名,第2个不重复的分数就是第2名,Item为累加值。
Setdic=CreateObject("Scripting.Dictionary")Range("A2",[C2].End(xlDown)).SortRange("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次循环到这个班级,即创建班级字典Setdic(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,就是班级名次排到哪了EndIfNextReDim排名(1ToUBound(arr),1To1)Fori=1ToUBound(arr)排名(i,1)=dic(arr(i,1))(arr(i,3))Next[D2].Resize(UBound(arr),1)=排名这种排名是中国式排名,重复的名次不占用排名序数。年级排名可用函数,也可以用字典,数据量很大的情况下用字典更快些(不需要嵌套,只要分数作为Key,Item进行累加)。
免责声明:内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,本网站所提供的信息只供参考之用。