VBA字典:职场小白也能轻松上手!
VBA字典:职场小白也能轻松上手!
在职场中,掌握一些高效的工具能让你事半功倍。今天就来聊聊如何使用VBA中的字典(Dictionary)来进行数据管理吧!即使你是零基础的小白,也能通过这篇文章快速上手。字典是一种非常实用的数据结构,它不仅能帮助你快速查找和提取数据,还能简化代码编写过程,提高程序执行效率。快来试试看,说不定你的工作效率会因此大大提升哦!
什么是字典?
字典是一种用于存储数据的数据结构,类似于一个小型仓库。字典包含两列:第一列是key(键),每个key都是唯一的;第二列是item(值),可以重复。每个key对应一个item,也就是我们常说的键值对。
举个例子,就像你去图书馆借书,每本书都有一个唯一的编号(key),通过这个编号你可以快速找到对应的书(item)。字典就是这样一个能让你快速查找数据的工具。
字典的特点
- 速度快:可以快速地查找和提取数据。例如,通过指定key的数值,可以立即返回对应的item,实现快速查找。
- 键唯一:字典中的key列只能存储非重复的元素,方便提取不重复的数值。
- 两列结构:字典只能包含两列数据,如果需要处理多列数据,可以通过字符串的组合和拆分来实现。
- 调用耗时:对于数据量较小的情况,字典的速度优势可能无法体现出来。
如何创建字典?
创建字典有两种方法:
方法一:直接创建法
Set d = CreateObject("scripting.dictionary")
这种方法的缺点是无法直接查看字典对象的方法和属性。
方法二:引用法
- 打开VBA编辑器
- 点击“工具” -> “引用”
- 找到“Microsoft Scripting Runtime”并勾选
- 确定后就可以使用以下代码创建字典了
Dim d As New Dictionary
这种方法的缺点是其他人在拷贝代码后需要手动引用字典对象才能使用。
为了方便自己编写代码和与他人分享代码,我一般都是同时采用这两种方法来创建字典对象。这样既能保证自己编写代码的便利性,又能避免他人在使用时需要额外引用字典对象的麻烦。
字典的基本操作
添加数据
Sub test()
Dim d As New Dictionary '创建一个字典
Dim i As Integer
For i = 2 To 4
d.Add Cells(i, 1).Value, Cells(i, 2).Value '把姓名列装到字典的第1列,把年龄列装到字典的第2列
Next i
MsgBox d.Keys(1) '查看字典中第1列中的第2个值
End Sub
读取数据
Sub test()
Dim d As New Dictionary '创建一个字典
Dim i As Integer
For i = 2 To 4
d.Add Cells(i, 1).Value, Cells(i, 2).Value '把姓名列装到字典的第1列,把年龄列装到字典的第2列
Next i
Range("d1").Resize(d.Count) = Application.Transpose(d.Keys) '第一列的集合
Range("e1").Resize(d.Count) = Application.Transpose(d.Items) '第二列的集合
End Sub
修改数据
Sub test()
Dim d As New Dictionary '创建一个字典
Dim i As Integer
For i = 2 To 4
d.Add Cells(i, 1).Value, Cells(i, 2).Value '把姓名列装到字典的第1列,把年龄列装到字典的第2列
Next i
d("曹操") = 66 '修改曹操的年龄为66岁
d("诸葛亮") = 53 '添加诸葛亮,年龄为53岁
MsgBox d("曹操")
MsgBox d("诸葛亮")
End Sub
删除数据
Sub test()
Dim d As New Dictionary '创建一个字典
Dim i As Integer
For i = 2 To 4
d.Add Cells(i, 1).Value, Cells(i, 2).Value '把姓名列装到字典的第1列,把年龄列装到字典的第2列
Next i
d.Remove ("孙权") '删除孙权
MsgBox d.Exists("孙权")
End Sub
由于孙权已经从字典中删除,所以不存在,弹出消息:False。
判断键是否存在
Sub aa()
Dim MyDict As Object
Set MyDict = CreateObject("Scripting.Dictionary")
MyDict.Add "Name", "John"
If MyDict.Exists("Name") Then
Debug.Print "Name key exists."
Else
Debug.Print "Name key does not exist."
End If
End Sub
遍历字典
使用 For Each 循环来遍历字典中的键-值对。
Sub aa()
Dim MyDict As Object
Set MyDict = CreateObject("Scripting.Dictionary")
MyDict.Add "Name", "John"
MyDict.Add "Age", 30
Dim key As Variant
For Each key In MyDict.Keys
Debug.Print key & ": " & MyDict(key)
Next key
End Sub
字典的实际应用场景
配置管理
用于存储和管理应用程序的配置参数。
Sub aa()
Dim PhoneBook As Object
Set PhoneBook = CreateObject("Scripting.Dictionary")
' 添加联系人
PhoneBook.Add "John", "123-456-7890"
PhoneBook.Add "Alice", "987-654-3210"
' 查找电话号码
Dim contactName As String
contactName = "John"
If PhoneBook.Exists(contactName) Then
Debug.Print "Phone number for " & contactName & ": " & PhoneBook(contactName)
Else
Debug.Print "Contact not found."
End If
End Sub
这个示例创建了一个电话簿,用字典存储联系人姓名和电话号码。然后,它演示了如何查找联系人的电话号码。
数据处理
用于存储和处理从外部数据源获取的数据。
Sub shishi()
Dim d, arr, i
Set 字典 = CreateObject("Scripting.Dictionary")
'将从A1开始的数值存放到数组arr中
arr = Range("a1").CurrentRegion
For i = 2 To UBound(arr)
字典.RemoveAll
For j = 2 To UBound(arr, 2) - 1
If Not 字典.exists(arr(i, j)) Then
'将不重复的数值存放到字典的关键字中,且将字典的关键字对应的值复制为空
字典(arr(i, j)) = ""
End If
Next
arr(i, UBound(arr, 2)) = VBA.Join(字典.Keys, ",") '将字典中的关键字合并为一个字符串
Next
Range("a1").CurrentRegion = arr
Set 字典 = Nothing
End Sub
JSON解析
在处理 JSON 数据时,可以将 JSON 对象转换为字典,以便更轻松地访问和操作数据。
动态数据集合
用于创建和管理动态数据集合,如列表、表格等。
数据缓存
用于缓存频繁访问的数据,以提高性能。
进阶技巧
将字典的key和value写入工作表
Public Sub WriteToSheet()
Dim d As New Dictionary
d.Add "a", "Athens"
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
Sheet1.Cells(1, 1).Resize(1, d.Count) = d.Keys
Sheet1.Cells(2, 1).Resize(1, d.Count) = d.Items
End Sub
执行代码后,字典的值被写入到 Sheet1,界面如下:
竖向表达感觉会更直观,下面的代码实现列示呈现:
Public Sub WriteToSheet2()
Dim d As New Dictionary
d.Add "a", "Athens"
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
Dim i As Integer
For i = 0 To d.Count - 1
Sheet1.Range("A1").Offset(i, 0) = d.Keys(i)
Sheet1.Range("A1").Offset(i, 1) = d.Items(i)
Next
End Sub
效果:
将 Sheet 中的值转换为字典
如果已经有了如上图在 Excel 工作表的值,下面的代码则将这些值转换为字典:
Public Sub ConvertSheetValueToDict()
Dim d As New Dictionary
Dim i As Integer
Dim startCell As Range
Set startCell = Sheet1.Range("A1")
For i = 0 To startCell.CurrentRegion.Rows.Count
d.Add startCell.Offset(i, 0).Value, startCell.Offset(i, 1).Value
Next
Dim k As Variant
For Each k In d.Keys
Debug.Print k, d(k)
Next
End Sub
利用字典进行求和计算
假设我们有如下的左边数据,要实现按品种进行统计:
Public Sub CalculateUsingDict()
Dim d As New Dictionary
Dim tbl As Range
Dim i As Integer
Dim total As Double
Set tbl = Sheet1.Range("A2:B10")
For i = 1 To tbl.Rows.Count
If Not d.Exists(tbl.Cells(i, 1).Value) Then
d.Add tbl.Cells(i, 1).Value, tbl.Cells(i, 2).Value
Else
d(tbl.Cells(i, 1).Value) = d(tbl.Cells(i, 1).Value) + tbl.Cells(i, 2).Value
End If
Next i
' 输出结果
Dim key As Variant
For Each key In d.Keys
Debug.Print key & ": " & d(key)
Next key
End Sub
总结
字典是VBA编程中的一个对象,具有操作简单、运行高效的特点,常用于数据的条件查询、聚合汇总等,如果说数组是VBA处理数据的基础结构,那么字典就可以被称为核心。数组用于数据清洗整理,字典用于数据汇总分析。
通过本文的学习,相信你已经掌握了VBA字典的基本用法和应用场景。在实际工作中,你可以根据具体需求灵活运用字典,提高数据处理效率。建议多实践、多思考应用场景,不断积累经验。如果想进一步学习,可以参考VBA官方文档或相关教程,深入理解字典的高级用法。