这是关于字典的第二篇文章,聊聊字典的应用之去重,统计和求和 我们这边说的去重,也就是平常所说的求不重复值的问题。 如下图所示,这是一份成绩单。
首先,第一个问题,我们要统计共有几个人。也就是我们所说的去重。代码如下: Dim d As ObjectDim i As LongDim mingzi As StringSet d = CreateObject('Scripting.Dictionary')For i = 2 To [a65536].End(xlUp).Row mingzi = Cells(i, 1) If Not d.Exists(mingzi) Then d.Add mingzi, '' End IfNext iMsgBox d.Count 对以上代码简单地说明一下。
第二个问题,李四参加了几个科目的考试?这也是我们所说的计数。代码其实非常简单,首先我们要判断,如果字典d中存在了这个mingzi,那我们在item中对这个mingzi的item值进行累加1即可。 代码稍加修改即可: Dim d As ObjectDim i As LongDim mingzi As StringSet d = CreateObject('Scripting.Dictionary')For i = 2 To [a65536].End(xlUp).Row mingzi = Cells(i, 1) If Not d.Exists(mingzi) Then d.Add mingzi, 1 Else d(mingzi) = d(mingzi) + 1 End IfNext iMsgBox d('张三')MsgBox d('李四') d(mingzi) = d(mingzi) + 1 实际上就是对Key键对应的Item值进行累加。 接下来第三个问题,求每个人的总分。也就是我们所要说的求和。其实求和与统计的方法是一样的,只是item赋的值不一样罢了。 代码仍然稍加修改: Dim d As ObjectDim i As LongDim mingzi As StringDim chenji As IntegerSet d = CreateObject('Scripting.Dictionary')For i = 2 To [a65536].End(xlUp).Rowmingzi = Cells(i, 1)chengji = Cells(i, 3) If Not d.Exists(mingzi) Then d.Add mingzi, chengji Else d(mingzi) = d(mingzi) + chengji End IfNext iMsgBox d('张三')MsgBox d('李四') 我们通过字典的Exists方法,便实现了数据的简单去重,统计和求和的功能。 通过上面的代码,我们能非常清晰地理解各句代码的含义。 但实际上,我们仍可以把代码简化一下,提高代码的运行效率。 Dim d As ObjectDim i As LongDim mingzi As StringDim chenji As IntegerSet d = CreateObject('Scripting.Dictionary')For i = 2 To [a65536].End(xlUp).Rowmingzi = Cells(i, 1)chengji = Cells(i, 3)d(mingzi) = d(mingzi) + chengjiNext iMsgBox d('张三')MsgBox d('李四') 文中代码都是比较简单的应用,后续我们再举较多的例子来讨论字典更多的好的应用。 我始终觉得,字典这个工具,实际应用中,可以做很多的工作,并且相对于数组来说,更好理解。 |
|