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 Dictionaryd.Add "a", "Athens"d.Add "b", "Belgrade"d.Add "c", "Cairo"
End Sub

遍历字典

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

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

  1. 遍历值
Public Sub IterateThruItems()Dim d As New Dictionaryd.Add "a", "Athens"d.Add "b", "Belgrade"d.Add "c", "Cairo"Dim v As VariantFor Each v In d.ItemsDebug.Print vNext
End Sub
  1. 通过 Count 遍历
Public Sub IterateThruCount()Dim d As New Dictionaryd.Add "a", "Athens"d.Add "b", "Belgrade"d.Add "c", "Cairo"Dim i As IntegerFor i = 0 To d.Count - 1Debug.Print d.Keys(i), d.Items(i)Next
End Sub

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

判断 key 是否存在

Public Sub CheckIfExists()Dim d As New DictionaryDim i As Integerd.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 Dictionaryd.Add "a", "Athens"d.Add "b", "Belgrade"d.Add "c", "Cairo"Sheet1.Cells(1, 1).Resize(1, d.Count) = d.KeysSheet1.Cells(2, 1).Resize(1, d.Count) = d.Items
End Sub

执行代码后,字典的值被写入到 Sheet1,界面如下:

竖向表达感觉会更直观,下面的代码实现列示呈现:

Public Sub WriteToSheet2()Dim d As New Dictionaryd.Add "a", "Athens"d.Add "b", "Belgrade"d.Add "c", "Cairo"Dim i As IntegerFor i = 0 To d.Count - 1Sheet1.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 DictionaryDim i As IntegerDim startCell As RangeSet startCell = Sheet1.Range("A1")For i = 0 To startCell.CurrentRegion.Rows.Countd.Add startCell.Offset(i, 0).Value, startCell.Offset(i, 1).ValueNextDim k As VariantFor Each k In d.KeysDebug.Print k, d(k)Next
End Sub

下面给出两个利用字典进行计算的示例。

利用字典进行求和计算

假设我们有如下的左边数据,要实现按品种进行统计:

Public Sub CalculateUsingDict()Dim d As New DictionaryDim tbl As RangeDim dataRange As Range' 不包括表头Set tbl = Sheet2.Range("A1").CurrentRegionSet dataRange = tbl.CurrentRegion.Offset(1, 0)Dim row As RangeDim cell As RangeDim key As StringFor Each row In dataRange.Rowskey = CStr(row.Cells(1))If Not d.Exists(key) Thend.Add key, row.Cells(2)Elsed(key) = d(key) + row.Cells(2)End IfNextDim k As VariantDim i As IntegerFor i = 0 To d.Count - 1Sheet2.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 DictionaryDim tbl As RangeDim dataRange As RangeSet tbl = Sheet3.Range("A1").CurrentRegionSet dataRange = tbl.CurrentRegion.Offset(1, 0)Dim row As RangeDim cell As RangeDim k As StringDim v As VariantFor Each row In dataRange.Rowsk = CStr(row.Cells(1))v = Array(row.Cells(2), row.Cells(3), row.Cells(4))d.Add k, vNextDim key As Stringkey = CStr(Sheet3.Range("H2"))If d.Exists(key) ThenSheet3.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 的函数,自己琢磨吧。

VBA字典对象操作技巧相关推荐

  1. VBA EXCEL 对象操作 - 新建工作表

    From  http://club.excelhome.net/forum.php?mod=viewthread&tid=470603&page=23#pid3118642 新建一个工 ...

  2. vba fso读utf 文本_利用FSO对象操作文件

    大家好,我们今日讲解"VBA信息获取与处理"教程中第十八个专题"FSO对象对文件及文件夹的处理"的第二节"利用FSO对象操作文件",这个专题 ...

  3. CAD怎么切换角度标注对象?CAD切换角标操作技巧

    CAD标注尺寸是CAD制图过程中较为常用的功能之一,浩辰CAD给排水软件除了一些常用的CAD标注尺寸功能外,还为大家提供了便捷的切换角标功能.下面就让小编来给大家介绍一下浩辰CAD给排水软件中CAD切 ...

  4. VBA遍历字典对象中独门秘籍

    看到这个标题,相信读者肯定非常不屑的任务我在故弄玄虚,客官莫急,我说说你听听,肯定会有新故事. 字典对象是VBA中常用的对象之一,对于这种这种对象通常用两种绑定方式:前期绑定和后期绑定. 前期绑定需要 ...

  5. Python字典的操作小技巧——索引、增添、删除、修改与取键和值

    字典是非常常用的一种数据结构,它与json格式的数据非常相似,核心就是以键值对的形式存储数据,关于Python中的字典做如下四点说明: 构造字典对象需要使用大括号表示,即{},每一个字典元素都是以键值 ...

  6. 全民一起VBA提高篇第十课:字典对象

    字典 题目要求 将课程名称以及挂科人数进行汇总 给出的数据是几十个班混在一起,挂科人数是每个班的人数,现在需要把他们相同的科目统计一个总人数 只看这个要求,其实用数据透视表可以很快得出结果,但是任何E ...

  7. VBA中字典的写入技巧

    转自:微点阅读  https://www.weidianyuedu.com/content/4717493265745.html 字典的基本概念,调用方法以及字典的6个方法和4个属性,那在实际应用字典 ...

  8. 盘点VBA中字典的写入技巧!

    讲了字典的基本概念,调用方法以及字典的6个方法和4个属性,那在实际应用字典之前,我们总该了解下字典的写入技巧. 写入技巧一:add方法 下图中A列为姓名,有重复的,我们都知道字典里的key是不能重复的 ...

  9. 49个Python的常见操作/技巧/例子

    17个Python的常见操作/技巧 很多读者都知道 Python 是一种高级编程语言,其设计的核心理念是代码的易读性,以及允许编程者通过若干行代码轻松表达想法创意. 实际上,很多人选择学习 Pytho ...

  10. Word操作技巧大全1(转)

    Word操作技巧大全(64页) Word中的"选中"方法知多少? 一.常见的"选中"方法: ü 全选(快捷键Ctrl+A):就是全部选中文档内的所有内容.这所有 ...

最新文章

  1. 解决sql2014的distribution系统库distribution.mdf过大问题
  2. stm32cubeide烧写程序_stm32mp157 Cortex M4开发篇:stm32CubeIDE开发环境搭建
  3. apache tomcat下32还是64_linux平台下Tomcat的安装与优化
  4. Java Arrays.sort()的几种用法
  5. 处女座和小姐姐(二)
  6. python完全支持面向对象编程_Python面向对象编程
  7. 线段树初见——区间询问与改变最大值
  8. 嵌入式Linux系统编程学习之十二守护进程
  9. 【Flink】Flink 或者 Spark the client is stop
  10. leetcode题解48-旋转图像
  11. spring cloud微服务注册中心EurekaServer
  12. First Missing Positive missing number
  13. Ubuntu 18.04 64位安装校园网客户端(完美解决)
  14. 基于JAVA的宠物网站的设计与实现
  15. 软件测试用例朋友圈发表功能,微信发朋友圈测试用例
  16. arcgis中python计算面积的表达式_ArcGIS应用——四种计算图斑面积的方法
  17. 数码照片像素与可冲印照片尺寸对照表
  18. 父进程回收子进程之wait()函数使用解读
  19. html中的阴影怎么使用,css 内阴影怎么做
  20. 大数据时代,做大数据开发要学Java框架吗?

热门文章

  1. win7怎么设置显示计算机,教您win7怎么设置分辨率
  2. android ppt的动画效果怎么做,Android 仿 PPT 进入动画效果合集
  3. 微信商户平台所有产品总结
  4. Python设置excel单元格格式
  5. Python批量化实现SAR图像的海陆分割
  6. 摸底10余家一线互联网公司大数据架构图:Hadoop渗透力太强!
  7. linux 触屏校准命令,tslib-触摸屏校准
  8. STM32开发项目:FIFO数据模型库
  9. 10、Linux上常见软件的安装:安装JDK、安装Tomcat、安装Eclipse
  10. 数据仓库建设规范(文档版)