【分享成果,随喜正能量】从来没有一劳永逸的选择。关键是选择之后,你该做些什么。努力解决能解决的问题。解决不了的问题,当它不存在好了。往前走,提升自己,比解决具体的问题更重要。。
《VBA数组与字典方案》教程是我推出的第三套教程,目前已经是第一版修订了。这套教程定位于中级,字典是VBA的精华,我要求学员必学。七、一、三、九组合套教程掌握后,可以解决大多数工作中遇到的实际问题。
这套教程共两册,一共八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是:实现快速排重及数据迅速回填

第四十讲 利用数组作为键值,实现数据快速排重与回填
大家好,我们今天继续讲解VBA数组与字典解决方案,今日的内容是第40讲,利用数组作为字典的键值,一方面实现快速排重,一方面实现数据快速回填。在上面的几讲中,我们看到字典作为VBA应用的一部分,在排重,汇总求和方面有着独步天下的作用,我在以后的讲解中会逐步深入,今日讲解的是利用键值作为数组,实现多列数据的快速排重和回填。
1 应用场景的具体分析
我们先看下面的数据:在三列数据中,我要实现按A列数据的排重,同时要把排重后的数据回填到工作表中。

我们知道,对于字典而言是一个键和键值的匹配关系、
2 实现场景的代码及分析
那么如何实现上述的逻辑过程呢?我们看我给出的代码:
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 如何理解字典的初始化,其意义是什么?

我多年的VBA实践经验,全部浓缩在以下十套教程中,可以联络我V信VBA6337取得教程,成为我的学员:



【分享成果,随喜正能量】不要试图自证清白。从你开始自证的那一刻起,你就已经输了。不要有受害者心态。就算你是受害者,也不要有。一旦以受害者自居,就彻底完了。 。




