字典对象可以简单地理解为一个特殊的二维数组。字典对象的第一列为Key(键),该列具有唯一性和不重复性,这个是字典对象最重要的特性之一;第二列为Item(条目)可以保存各种类型的变量。 字典对象简单易用,而且可以极大地提升程序的运行效率。字典对象有六种方法(Add,Keys,Items,Exists,Rmove和RemoveAll)和四个属性(Count,Key,Item和CompareMode),参见表47-1。 属性 | 说明 | CompareMode | 设定或返回Key的字符串比较模式 | Count | 只读。返回 Dictionary 里的键/条目的数量 | Item(key) | 设定或返回指定关键字的条目值 | Key(key) | 设定键值 | Add(key,item) | 增加键/条目对到 Dictionary | Exists(key) | 如果指定的键存在,返回 True,否则返回 False | Items() | 返回一个包含 Dictionary 对象中所有条目的数组 | Keys() | 返回一个包含 Dictionary 对象中所有键的数组 | Remove(key) | 删除一个指定的键/条目对 | RemoveAll() | 删除全部键/条目对 |
表 47-1 Dictionary对象的属性和方法
使用字典对象统计销售记录
字典对象最典型的应用场景是获取数据的唯一值。示例文件中销售数据如图 44-2所示。 图 44-2 销售数据 单击工作表中的“运行代码”按钮,统计结果如图 44-3所示。 图 44-3 销售数据统计结果 示例代码如下:
#001 Sub DicDemo() #002 Dim objDict As Scripting.Dictionary, arData #003 Dim iR As Integer, sKey As String #004 Set objDict = CreateObject("Scripting.Dictionary") #005 arData = ActiveSheet.[a1].CurrentRegion.Value #006 For iR = 2 To UBound(arData, 1) #007 sKey = arData(iR, 2) #008 If objDict.Exists(sKey) Then #009 objDict(sKey) = objDict(sKey) + _ Val(arData(iR, 3)) #010 Else #011 objDict.Add sKey, Val(arData(iR, 3)) #012 End If #013 Next iR #014 With ActiveSheet #015 .[G2].Resize(objDict.Count, 1).Value = _ Application.Transpose(objDict.Keys) #016 .[H2].Resize(objDict.Count, 1).Value = _ Application.Transpose(objDict.Items) #017 End With #018 End Sub
代码解析
1
第4行代码用于创建字典对象。
2
第5行代码将示例工作表中的数据加载到数组arData,其中CurrenRegion返回A1单元格的当前数据区域。
3
第6行到第13行代码使用For…Next循环遍历数组中的销售数据。
4
第7行代码将“产品”保存在变量sKey中,作为统计的关键字段。
5
第8行代码使用字典对象的Exists方法判断字典对象中是否已经存在相同的“产品”。如果已经存在,那么第9行代码将第3列的销售数量进行累加,否则第11行代码将新的“产品”和销售数据添加到字典对象中。
6
第15行和第16行代码将字典对象中数据写入工作表中,其中objDict.Keys为“产品”列表,objDict.Items为对应“产品”的销售数量累计值。
|