VBA字典对象操作技巧

article/2025/9/27 14:08:32

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 的函数,自己琢磨吧。


http://chatgpt.dhexx.cn/article/qeqRaSI4.shtml

相关文章

VBA 二维数组和字典

数据源: 二维数组和字典的主要使用方法 Sub test()Dim dict As ObjectSet dict CreateObject("Scripting.Dictionary")Set sh Worksheets("Sheet3")Set Rng sh.Range("A1:E" & sh.Range("E1").End(xlDown).Row)sh.Range("…

【原创】VBA学习笔记(313)VBA字典相关:遍历字典,用key查item, 用item查key的方法

1 字典的遍历方法 即使是后期绑定,也可以用 for each i in dict1.keys() 这里用到的 dict1.keys() 但不是 dict1.keys(i) 是可以的 Sub test_dict11()Dim dict1 As Object Set dict1 CreateObject("scripting.dictionary")dict1.Add 1, "h&qu…

【Excel VBA和Python对照学习】创建字典

Excel VBA和Python双语对照学习 我们从小学习语文,都用过字典。查字典时可以从第一页开始,一页一页地往下找,直到找到为止。这样做明显效率低下,特别是字的位置比较靠后的时候。所以查字典时不这样做,而是根据目录直接…

vba中字典的用法

字典对象的方法有6个: Add 添加一条关键字与条目 Keys 返回所有关键字(形成1维数组) Items 返回所有条目(形成1维数组) Exists 关键字是否存在(TRUE/FALSE) Remove 移除关键字与对应的条目 RemoveAll 移除所有关键字与对应的条 注意: 字典对象的属性有4…

Excel VBA Dictionary excel vba 字典大全

Excel VBA Dictionary - A Complete Guide - Excel Macro Mastery A Quick Guide to the VBA Dictionary FunctionParamsEarly binding reference“Microsoft Scripting Runtime” (Add using Tools->References from the VB menu)Declare (early binding)Dim dict As Scr…

vba字典学习案例

一、案例概述: 本次案例主要讲解字典的学习和应用,通过使用字典的方式来将每一行不重复的数值进行汇总形成一个字符串,且将该字符串展示到指定单元格中。二、案例展示: (1)源数据: (…

VBA字典(dictionary)

这是我看到的最简单明了的Excel VBA字典(dictionary)的教程,把字典的应用,用短短几百字,全部道尽,简!但精彩!原文如下: 当年我(原作者:彭希仁)向LDY版主求教字典的时候,他…

在Excel VBA中使用字典

序言 VBA的基础数据类型里面并没有字典类型,但字典其实在很多应用场景中都很有用,那么如何在VBA中使用字典,本文就用几个例子和大家交流探讨一下。 场景1 某个医院每天都会从不同的制造商那里进三种材料中的一种,每天的进价都有…

VBA -[知识点]: 字典

VBA字典 记录一次VBA字典的使用部分代码 1. VBA 中创建一个字典对象2. 字典对象添加key 和 value3. 获取字典对象的key list4. 判断是否存在某个key5. 修改字典值6. 修改字典key 名称6. 删除某个item7. 删除所有item 记录一次VBA字典的使用 部分代码 Public Sub MainRun()1. …

VBA字典(详解,示例)

文章目录 创建字典对象字典的属性|方法案例去重求和计数匹配key的组合和分割字典value多字段累加字典求和和计数同时进行类似sql的join操作 创建字典对象 后期绑定:方便代码在其他电脑上运行,推荐。 dim dic as object Set dic CreateObject("scr…

JavaScript 动态生成表格

要求&#xff1a; HTML标签只写一行表头通过JS来写动态的表格&#xff08;有多少组数据&#xff0c;就自动创建多少行表格&#xff09;为学习和演示&#xff0c;采用固定的数据&#xff0c;不涉及调用后台数据 实现效果&#xff1a; 代码实现&#xff1a; <!DOCTYPE html…

利用JS代码完成动态生成表格案例及解析

思路&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&…

js自动生成html报表,JavaScript实现动态生成表格

本文实例为大家分享了JavaScript实现动态生成表格的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 功能描述 在输入框中输入行和列&#xff0c;点击按钮&#xff0c;生成拥有对应行和列的表格。如下图所示&#xff1a; 分析 HTML界面设计 行&#xff1a; 列&#xf…

JavaScript 动态生成表格 及删除表格

创建 表格表头 <body> <table> <thead> <tr> <td>序号</td> <td>姓名</td> <td>性别</td> <td>年龄</td> <td>地址</td> <td>删除</td> </tr> </thead> <t…

js动态生成表格实例

效果图 代码 <!DOCTYPE html> <html> <body> <div><h1>动态生成表格</h1><div id"table1">行&#xff1a;<input type"text" id"h"/>列&#xff1a;<input type"text" id"…

在html中生成动态表格数据,JavaScript实现网页动态生成表格

JavaScript(JS)网页–动态生成表格,供大家参考,具体内容如下 在网页中,动态生成列表的内容,将数组中的object加入到列表中(没学到数据库)。在HTML中创建thead,然后通过JavaScipt动态生成tbody。并且在每行最后申城一个单元格,加入删除操作,点击删除可以删除此行。动态生…

使用JS动态生成表格

代码如下&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title></title><script>var bgColor;var list [{ id: 1, country: 中国, capital: 北京,},{ id: 2, country: 美国, capital: 纽约,},{ id…

html动态生成表格源码,JavaScript动态生成表格的示例

要求&#xff1a; HTML标签只写一行表头 通过JS来写动态的表格(有多少组数据&#xff0c;就自动创建多少行表格) 为学习和演示&#xff0c;采用固定的数据&#xff0c;不涉及调用后台数据 代码实现&#xff1a; HTML内容&#xff1a; 姓名科目成绩操作 CSS内容&#xff1a; tab…

利用javascript动态生成表格及注释

记录学习第一天 &#xff1a;关于javascript如何动态的生成表格 css样式想节省时间就没写,所以只有基本样式。 html部分&#xff1a; 创建一个表格&#xff08;table&#xff09;的头部&#xff08;thead&#xff09;和数据&#xff08;tbody&#xff09;标签。 <table b…

JavaScript网页——动态生成表格

1.创建学生数据 分析&#xff1a;因为里面的学生数据都是动态的&#xff0c;我们需要js动态生成。这里我们模拟数据&#xff0c;自己定义好数据。数据我们采取对象形式存储。 var students [{name:吕小布,subject:JavaScript,score:100,},{name:张益达,subject:JavaScript,…