VBA字典对象操作技巧

VBA 中集合的功能比较弱,常见的有数组 (array) 、集合 (Collection)和字典,其中字典是 Key-Value Pair 类型的数据结构,适合按 Key 存储和查找。本篇介绍字典的操作方法。

VBA 语法本身并没有字典这种数据结构,需要引用 Microsft Scripting Runtime 库:

Dictionary 本身的方法不多,只有六个:


From: Dictionary 对象 | Microsoft Docs

创建字典对象并添加值

我们使用前期绑定的方式,new Dictionary() 创建字典对象,Add() 方法添加元素

Public Sub CreateDictionary()
    Dim d As New Dictionary
    d.Add "a", "Athens"
    d.Add "b", "Belgrade"
    d.Add "c", "Cairo"    
End Sub

遍历字典

  1. 通过 Keys 属性遍历
Public Sub IterateThruKeys()
    Dim d As New Dictionary
    d.Add "a", "Athens"
    d.Add "b", "Belgrade"
    d.Add "c", "Cairo"
    
    Dim k As Variant ' 只能为variant或者object类型
    For Each k In d.Keys
        Debug.Print k, d(k)
    Next
End Sub

VBA 表示集合的元素用的也是圆括号,不像其它语言一般用方括号。

  1. 遍历值
Public Sub IterateThruItems()
    Dim d As New Dictionary
    d.Add "a", "Athens"
    d.Add "b", "Belgrade"
    d.Add "c", "Cairo"
    
    Dim v As Variant
    For Each v In d.Items
        Debug.Print v
    Next
End Sub
  1. 通过 Count 遍历
Public Sub IterateThruCount()
    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
        Debug.Print d.Keys(i), d.Items(i)
    Next
End Sub

下面通过一些小例子加深大家的理解,掌握一些重要的编码方法。

判断 key 是否存在

Public Sub CheckIfExists()
    Dim d As New Dictionary
    Dim i As Integer

    d.Add "a", "Athens"
    d.Add "b", "Belgrade"
    d.Add "c", "Cairo"
    
    If d.Exists("a") Then Debug.Print d("a")
End Sub

将字典的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 dataRange As Range
    
    ' 不包括表头
    Set tbl = Sheet2.Range("A1").CurrentRegion
    Set dataRange = tbl.CurrentRegion.Offset(1, 0)
        
    Dim row As Range
    Dim cell As Range
    Dim key As String
    For Each row In dataRange.Rows
        key = CStr(row.Cells(1))
        If Not d.Exists(key) Then
            d.Add key, row.Cells(2)
        Else
            d(key) = d(key) + row.Cells(2)
        End If
    Next
    
    Dim k As Variant
    Dim i As Integer
    For i = 0 To d.Count - 1
        Sheet2.Range("H2").Offset(i, 0) = d.Keys(i)
        Sheet2.Range("H2").Offset(i, 1) = d.Items(i)
    Next
End Sub

这里用到了一个小技巧,因为数据包含表头,所以通过变量 dataRange 只包含数据部分,不包括表头。

通过字典进行匹配

假设有如下图左边的数据,需要实现按姓名查找学生三门课的考试成绩,类似 vlookup。

Public Sub MatchUsingDict()
    Dim d As New Dictionary
    Dim tbl As Range
    Dim dataRange As Range
    
    Set tbl = Sheet3.Range("A1").CurrentRegion
    Set dataRange = tbl.CurrentRegion.Offset(1, 0)
        
    Dim row As Range
    Dim cell As Range
    Dim k As String
    Dim v As Variant
    For Each row In dataRange.Rows
        k = CStr(row.Cells(1))
        v = Array(row.Cells(2), row.Cells(3), row.Cells(4))
        d.Add k, v
    Next
    
    Dim key As String
    key = CStr(Sheet3.Range("H2"))
    If d.Exists(key) Then
        Sheet3.Range("H2").Offset(0, 1) = d(key)(0)
        Sheet3.Range("H2").Offset(0, 2) = d(key)(1)
        Sheet3.Range("H2").Offset(0, 3) = d(key)(2)
    End If
End Sub

有兴趣的小伙伴,甚至可以利用 dictionary 编写类似 vlookup 的函数,自己琢磨吧。

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
中文名: Excel VBA程序开发自学宝典(第2版) 作者: 罗刚君 资源格式: PDF 版本: 扫描版 出版社: 电子工业出版社 书号: 9787121141454 发行时间: 2011年08月01日 地区: 大陆 语言: 简体中文 简介: 内容简介: 《ExcelVBA程序开发自学宝典(第2版)》是VBA入门的经典教材,对VBA的基础理论、语法规则、代码优化、编写思路、开发函数与使用数组等都进行了详尽的理论阐述和案例演示,同时还搭配窗体与控件、正则表达式、字典、FileSystemObject、API、类模块、脚本语言的应用,以及开发功能区、开发加载宏、封装代码等高级应用,力求完整地展示了VBA的功能与魅力。通读本书,您不仅能学到如何开发函数、编写程序,还能设计报表系统,独立开发Excel百宝箱式的大中型插件。   《Excel VBA程序开发自学宝典(第2版)》是畅销书《Excel VBA程序开发自学宝典》的升级版本。《ExcelVBA程序开发自学宝典》第1版于2009年10月上市,基于Excel2007版本撰写,曾多次销罄重印。然而本着精益求精的原则,作者在售后服务QQ群和售后论坛中收集了大量的用户反馈信息,对图书进行改版,删除了部分实用性不大的内容,增加了正则表达式、字典的应用、开发功能区与封装代码等章节,增加了开发插件的案例,全书改用Excel2010截图,并修正了第1版中无法兼容Excel 2010的部分代码与设计思路,促使教学内容更具通用性。 目录: 第1章 从插件看VBA的优越性 1.1 从身份证号获取个人信息 1.1.1 内置公式法 1.1.2 自定义函数法 1.1.3 插件法 1.1.4 浅谈VBA优势 1.2 插件特点及如何发挥插件的优势 1.2.1 Excel插件的特点 1.2.2 Excel插件的优势与限制 1.2.3 如何发挥插件的优势 1.2.4 开发Excel插件的条件 1.2.5 本书架构 第2章 VBA简史与安全性 第3章 巧设VBA编辑器提升编程效率 第4章 VBA基本概念 第5章 深入解析数据类型与变量 第6章 编写Sub过程及开发函数 第7章 对象的引用方式总结 第8章 让代码自动运行 第9章 编程规则与代码优化 第10章 常用语法剖析 第11章 基本编程应用案例 第12章 数组基础 第13章 数组实战 第14章 设计窗体 第15章 表单控件与ActiveX控件 第16章 FSO、WScript与DOS 在VBA中的应用 第17章 正则表达式与VBA 第18章 字典的应用 第19章 命令栏对象与工具栏开发 第20章 自定义菜单 第21章 认识类和类模块 第22章 API的基本应用 第23章 VBA与注册表 第24章 Ribbon功能区设计 第25章 VBE的对象模型与对象控制 第26章 程序开发思想 第27章 开发VBA百宝箱 第28章 插件设计 第29章 代码封装技巧 第30章 开发“Excel百宝箱”(本章及附录内容均在光盘中) 附录A Excel 2010的新增事件 附录B Excel 2010对象大全 附录C Excel 2010所有内置常数枚举 附录D 功能区内置命令与图标一览

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值