VBA字典对象操作技巧

这篇具有很好参考价值的文章主要介绍了VBA字典对象操作技巧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

VBA字典对象操作技巧

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

VBA字典对象操作技巧
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,界面如下:

VBA字典对象操作技巧

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

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

效果:

VBA字典对象操作技巧

将 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

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

利用字典进行求和计算

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

VBA字典对象操作技巧

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。

VBA字典对象操作技巧

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 的函数,自己琢磨吧。文章来源地址https://www.toymoban.com/news/detail-466585.html

到了这里,关于VBA字典对象操作技巧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VBA(7)字典及常用应用

    1、字典直接创建 Dim dic as object Set dic = Createobject(\\\"scripting.dictionary\\\") 2、引用法 工具-引用-浏览-scrrun.dll-确定 microsoft scripting runtime   打勾 注:两者在使用上经常用创建多一点;并无太大区别。用创建的字典装入数据后并不能直接用dic.keys(N)/dic.items(N) 的格式来引用字典元素.字

    2024年02月04日
    浏览(32)
  • VBA命令及语法列表之字典Dictionaries相关

    【分享成果,随喜正能量】真正的修佛之人。首先,得明白自己的来处和归宿,懂得敬畏自己的生命和他人的生命,尽其所能释放善意。学会悲天悯人,渡人的同时渡己,始终走在止于至善的路上。真正的慈悲为怀,并不一定只是钱财的救济,有的时候,一个善举,也是一种

    2024年02月16日
    浏览(48)
  • 说说你对集合的理解?常见的操作有哪些?

    集合(Set),指具有某种特定性质的事物的总体,里面的每一项内容称作元素 在数学中,我们经常会遇到集合的概念: 有限集合:例如一个班集所有的同学构成的集合 无限集合:例如全体自然数集合 在计算机中集合道理也基本一致,具有三大特性: 确定性:于一个给定的

    2024年04月16日
    浏览(70)
  • stream流的使用-获取list集合中对象的单个字段list集合,进行累加操作

    场景及代码案例源于实际项目 现存一list集合,其中保存了投资人的信息。 Person (name, age, money rateOfReturn) 其中的money表示投资人现有资产,rateOfReturn表示投资年回报率 需求: 1.计算投资人年龄之和; 2.根据现有资产及投资回报率,计算所有投资人一年后的资产总和; 实体

    2023年04月22日
    浏览(66)
  • cesium常见操作:鼠标点击获取对象

       目录 一、viewer.scene.pick(获取Cartesian2) 二、 viewer.scene.pickPosition(获取Cartesian3) 三、viewer.scene.drillPick(穿透拾取,获取所有对象) 四、viewer.scene.globe.pick(获取加载地形后的经纬度(弧度)和高程) 五、 viewer.scene.camera.pickEllipsoid 六、window.viewer.imageryLayers.pickImageryLayer

    2024年02月11日
    浏览(44)
  • Java中用Stream流对List对象集合转Map时key值重复的操作

    看完你还不懂,你直接喷·· 定义: 1.List是一个装Dto对象的集合 2.Dto里面有ID属性,name属性等等 3.Dto里面的ID会重复  现在要把List转成以ID为key值的map,明显key不能重复啊,所以应该怎么操作呢? (需要你有java8Stream流的基本概念,map的基本概念)   操作1:重复key,选择保留

    2024年01月18日
    浏览(58)
  • Python 集合(列表 ,元组,集合, 字典)

    Python 编程语言中有四种集合数据类型: 列表(List)是一种有序和可更改的集合。允许重复的成员。 元组(Tuple)是一种有序且不可更改的集合。允许重复的成员。 集合(Set)是一个无序和无索引的集合。没有重复的成员。 字典(Dictionary)是一个无序,可变和有索引的集合

    2024年02月02日
    浏览(57)
  • EXCEL VBA从入门到精通 第九章:Excel VBA高级编程技巧

    介绍Excel VBA中的API编程,以及如何利用它们来访问Windows系统的功能。 Excel VBA提供了访问Windows系统API的功能,通过调用API函数可以访问Windows系统底层的功能和资源,例如操作系统、文件系统、网络、注册表等。API函数可以是Windows操作系统内置的函数,也可以是Windows DLL文件中

    2024年02月02日
    浏览(49)
  • 【Python】冻结字典和集合

    一般情况下,创建好字典和集合之后可以对其中的元素进行添加或删除。但是有时,我们出于某种原因需要将字典和集合进行冻结,不允许对其中的元素进行添加或删除。这个时候,我们就可以使用MappingProxyType函数和frozenset函数直接创建或冻结字典或集合。 创建冻结字典

    2024年02月02日
    浏览(48)
  • Python-字典与集合

    学习内容 :Python基础入门知识 专栏作者 : 不渴望力量的哈士奇 不渴望力量的哈士奇擅长Python全栈白宝书[更新中],⑤ - 数据库开发实战篇,网安之路,等方面的知识,不渴望力量的哈士奇关注云原生,算法,python,集成测试,去中心化,web安全,智能合约,devops,golang,功能测试,测试工具

    2024年02月05日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包