大家好,我们今天继续讲解VBA数组与字典解决方案,今日的内容是第40讲,利用数组作为字典的键值,一方面实现快速排重,一方面实现数据快速回填。在上面的几讲中,我们看到字典作为VBA应用的一部分,在排重,汇总求和方面有着独步天下的作用,我在以后的讲解中会逐步深入的讲解,今日讲解的是利用键值作为数组,实现多列数据的快速排重和回填。
我们先看下面的数据:在三列数据中,我要实现按A列数据的排重,同时要把排重后的数据回填到工作表中。
我们知道,对于字典而言是一个键和键值的匹配关系,那么如何实现上述的逻辑过程呢?我们看我给出的代码:
Sub mynzsz_40() '第40讲 利用数组作为键值,一方面实现快速排重,一方面实现数据回填的迅速
Dim myarr, myDic As Object
'将数据放入数组
myarr = Sheets("40").[a1].CurrentRegion
Set myDic = CreateObject("scripting.dictionary")
For i = 1 To UBound(myarr)
myDic(myarr(i, 1)) = "" '初始化字典
Next i
'将数据赋值入字典
For i = 1 To UBound(myarr)
If myDic.exists(myarr(i, 1)) Then myDic(myarr(i, 1)) = Array(myarr(i, 1), myarr(i, 2), myarr(i, 3))
Next i
'清空工作表区域
Sheets("40").[e:g].Cells.Clear
'将字典数据回填到工作表
Sheets("40").[e1].Resize(myDic.Count, 3) = Application.Transpose(Application.Transpose(myDic.items))
End Sub
代码截图:
代码的讲解:
1 上述语句实现了将源数据按A列进行排重处理,排重后的数据回填到工作表中。
2 myarr = Sheets("40").[a1].CurrentRegion
上述语句将A1单元格区域的数据填入数组
3 Set myDic = CreateObject("scripting.dictionary")
创建字典,要在注意的是要用到SET
4 For i = 1 To UBound(myarr)
myDic(myarr(i, 1)) = "" '初始化字典
Next i
上述语句中,我给出的解释是初始化字典,在一些语言中初始化是很重要的概念,在VBA中确实没有引入这个概念,但要知道,初始化是对数据变量的应用是一个重要的环节,在上述初始化的过程中,代码完成了字典的对键的分配,并赋值为空,这个时候就确定了键的数量了。
5 For i = 1 To UBound(myarr)
If myDic.exists(myarr(i, 1)) Then myDic(myarr(i, 1)) = Array(myarr(i, 1), myarr(i, 2), myarr(i, 3))
Next i
给键赋值,这个时候我们只要给键赋值即可,需要注意的是,赋的值是数组Array(),也就是说,键值可以为数组。这里的数组是一个一维的数组。
6 Sheets("40").[e1].Resize(myDic.Count, 3) = Application.Transpose(Application.Transpose(myDic.items))
上述代码将数据回填到工作表中,这里用了一个两次的转置实现的这个目的,大家要留意。
下面看代码的运行:
今日内容回向?
1 字典的键可以为数组吗?键值可以为数组吗?
2 如何理解字典的初始化,其意义是什么?