Excel VBA 编程基础学习笔记 · 第六章:字典技术 - 掌握高级数据映射与处理的王牌工具

目录

第6章:VBA与字典技术

1、字典技术的魅力

2、字典语法基础

3、字典实例(第1次与最后一次采购价提取)

4、字典实例(多表求不重复值)

5、字典实例(字典与数组经典结合)

6、字典实例(分类计算)

7、字典应用(多列合并计算)


在掌握了数组带来的“速度革命”之后,你是否曾为这样的问题感到棘手:如何从海量数据中瞬间找出唯一值?如何根据一个关键字快速匹配并汇总对应的信息?当面对多列数据的复杂关联时,仅靠数组的索引似乎力不从心。

本章,我们将解锁VBA中另一个堪称“神器”的核心对象——字典(Dictionary)。它不像数组那样按序号排列,而是构建了一种独特的“键-值”映射关系。正是这种结构,让它天生成为解决数据去重、分类统计、快速查询等难题的“王牌工具”。

简单来说,如果说数组是效率超高的流水线,那么字典就是一张智能的索引地图。无论是要提取客户的末次交易价格,还是合并来自多个表格且不重复的数据,字典都能用极其简洁优雅的代码,轻松实现以往需要复杂循环才能完成的任务。

让我们一起深入探究字典的六大核心方法,学习前期与后期绑定的技巧,并通过“提取首次/末次记录”、“多表合并去重”等经典案例,掌握这把提升数据处理维度与效率的利剑。

第6章:VBA与字典技术

1、字典技术的魅力

字典技术:

1、VBA中的字典(dictionary),是微软windows脚本语言中的一个很有用的对象

2、VBA字典特点:

KEY的唯一性

KEY与Item的相互对应关系

3、字典有什么用:

字典+数组=更强大

4、字典并不存在于VBA中,需要调用:

调用方法一:引用法(前期绑定):工具-引用-浏览-找到scrrun.dll-确定(在system32中)

引用对象为:Microsoft Scripting Runtime(此插件打上勾即引用成功)

调用方法二:直接创建法(后期绑定):

set d=Createobject("scripting.dictionary")

建议写代码时做前期绑定,写完后改成后期绑定

理由:引用法,写代码时有提示;直接创建法在任何一台电脑中都能直接打开使用

Add方法:向dictionary对象中添加一个关键字项目对

语法:object.add(key,item)

object,必选项,是一个字典对象的名称

key,必选项,与被添加的item相关联的key

item,必选项,与被添加的key相关联的item

说明:key是唯一的,否则将导致一个错误

2、字典语法基础

Sub字典测试()

DimdAsNewDictionary

'Set d = CreateObject("scripting.dictionary")

d.Add "张三", "123"

d.Add "李四", "456"

'Keys方法:返回一个数组,其中包含了一个dictionary对象中全部的关键字

i = d.Keys(1)'前期绑定写法。 方法1

j = Application.Index(d.Keys, 2)'方法2

k = d.Keys

l = k(1)'方法3

'以上都是获取keys的第2个值

'items方法:返回一个数组,其中包含了一个dictionary对象中的所有项目

r = d.Items(1)'前期绑定写法。 方法1

s = Application.Index(d.Items, 2)'方法2

t = d("李四")'方法3

w = d.Items

v = w(1)'方法4

'Exists方法:如果dictionary对象中存在所指的关键字则返回true,否则返回false

a = d.Exists("李四")

'remove方法:从一个dictionary对象中清除一个关键字、项目对

d.Remove ("李四")

'removeall方法:从一个dictionary对象中清除所有关键字、项目对

d.RemoveAll

EndSub

'字典对象的方法有6个:

'Add添加一条关键字与条目

'keys返回所有关键字(形成1维数组)

'items返回所有条目(形成1维数组)

'exists关键字是否存在(true/false)

'remove移除关键字与对应的条目

'removeall 移除所有关键字与对应的条目

'字典对象的属性有4个:comparemode属性、count属性、key属性、item属性

Sub字典测试2()

Setd = CreateObject("scripting.dictionary")

'1、comparemode属性:设置或返回dictionary对象中字符串关键字的比较模式:

'1不区分大小写,0 区分大小写

d.CompareMode = 1

d.Add "张三", "123"

d.Add "李四", "456"

d.Add "王五", "789"

'2、count属性:返回dictionary对象中项目数。只读属性

k = d.Count

'3、key属性:在dictionary对象中修改一个key

d.Key("王五") = "孙悟空"

'4、item属性:在dictionary对象中设置或返回所指定key的item

d.Item("张三") = "88888"

d("张三") = 999'简写

'注意:容易混淆知识点:d.key("a") 与 d.item("a")

EndSub

Sub有相同key时跳过()

DimdAsNewDictionary

OnErrorResumeNext'相同key时要么跳过,要么报错

arr = Range("a2:b" & Cells(Rows.Count, 2).End(xlUp).Row)

Fori = 1ToUBound(arr)

d.Add arr(i, 1), arr(i, 2)

Next

i = d.Keys

j = d.Items

'小结:如果有错误后继续执行,只记入第一次写入的key和item

EndSub

Sub修改item值时无相同key则添加否则就修改()

DimdAsNewDictionary

arr = Range("a2:b" & Cells(Rows.Count, 2).End(xlUp).Row)

Fori = 1ToUBound(arr)

j = arr(i, 1)

m = arr(i, 2)

d.Item(j) = m'要修改的关键字(key)没有,就增加到字典中

k = d.Item("牛二")

Next

EndSub

'总结:对字典item值的修改,有key则修改,无key则添加

'这两个特点作用非常大,可以求不重复值,可以做分类汇总

3、字典实例(第1次与最后一次采购价提取)

'实例一:求每种产品第一次采购价

Sub求第一次采购价()

OnErrorResumeNext

Setd = CreateObject("scripting.dictionary")

arr = Range("b1:c" & Cells(Rows.Count, 3).End(xlUp).Row)

Fori = 1ToUBound(arr)

d.Add arr(i, 1), arr(i, 2)

Next

[e1].Resize(d.Count) = Application.Transpose(d.Keys)

[f1].Resize(d.Count) = Application.Transpose(d.Items)

ForEachiInd.Keys'd.Keys和d.Items都是一维数组,直接一个个取出来就是原原本本的数据了

MsgBox i

Next

EndSub

'实例二:求每种产品最后一次采购价

Sub求最后一次采购价()

Setd = CreateObject("scripting.dictionary")

arr = Range("b1:c" & Cells(Rows.Count, 3).End(xlUp).Row)

Fori = 1ToUBound(arr)

d.Item(arr(i, 1)) = arr(i, 2)

Next

[i1].Resize(d.Count) = Application.Transpose(d.Keys)

[j1].Resize(d.Count) = Application.Transpose(d.Items)

EndSub

4、字典实例(多表求不重复值)

'实例:多表求不重复值

Sub多表求不重复值()

Setd = CreateObject("scripting.dictionary")

ForEachShInSheets

c = Sh.Name

Ifc <> "品名"Then

arr = Sh.Range("a1:a" & Sh.Cells(Rows.Count, 1).End(xlUp).Row)

ForEachrngInarr

d(rng) = ""'简写,相当于d.item(rng)=""

Next

EndIf

Next

[a1].Resize(d.Count) = Application.Transpose(d.Keys)

EndSub

5、字典实例(字典与数组经典结合)

'实例:字典与数组的经典结合去除重复词语

Sub去除重复词语()

Setd = CreateObject("Scripting.Dictionary")

arr = Sheet1.Range("a1:a" & Sheet1.Cells(Rows.Count, 1).End(xlUp).Row)

ForEachrngInarr

arr1 = VBA.Split(rng, "|")

ForEachrngsInarr1

d(rngs) = ""'相当于d.item(rngs)=""

Next

i = VBA.Join(d.Keys, "|")

n = n + 1

Sheet2.Cells(n, "a") = i

d.RemoveAll

Next

EndSub

6、字典实例(分类计算)

Sub分类计算()

Setd = CreateObject("scripting.dictionary")

arr = Range("n2:n" & Cells(Rows.Count, "n").End(xlUp).Row)

ForEachrngInarr

i = d(rng)'用于观察d(rng) 的值

d(rng) = d(rng) + 1'd(rng)是d.item(rng)的简写

i = d(rng)'用于观察d(rng) 的值

Next

[s2].Resize(d.Count) = Application.Transpose(d.Keys)

[t2].Resize(d.Count) = Application.Transpose(d.Items)

EndSub

Sub分类求和()

Setd = CreateObject("scripting.dictionary")

arr = Range("n2:o" & Cells(Rows.Count, "o").End(xlUp).Row)

Fori = 1ToUBound(arr)

d(arr(i, 1)) = d(arr(i, 1)) + arr(i, 2)

'd(arr(i, 1))相当于d.item(arr(i, 1)),它取得的是相应key的item值

Next

[s9].Resize(d.Count) = Application.Transpose(d.Keys)

[t9].Resize(d.Count) = Application.Transpose(d.Items)

EndSub

7、字典应用(多列合并计算)

Sub多列合并计算()

Setd = CreateObject("scripting.dictionary")

arr = Range("a2:d" & Cells(Rows.Count, "d").End(xlUp).Row)

Fork = 7To9

Fori = 1ToUBound(arr)

d(arr(i, 1)) = d(arr(i, 1)) + arr(i, k - 5)

​​​​​​​Next

Cells(2, 6).Resize(d.Count) = Application.Transpose(d.Keys)

Cells(2, k).Resize(d.Count) = Application.Transpose(d.Items)

d.RemoveAll

Next

EndSub

Sub字典条目数组用法()

Setd = CreateObject("scripting.dictionary")

arr = Sheets("data").Range("a2:e" & Sheets("data").Cells(Rows.Count, 1).End(xlUp).Row)

Fori = 1ToUBound(arr)

d(arr(i, 1)) = Array(arr(i, 2), arr(i, 3), arr(i, 4), arr(i, 5))'把2到5列的信息放到d.item(arr(i, 1))中

j = d(arr(i, 1))'用于在“本地窗口”查看字典条目的变化

Next

ForEachrngInRange("a3:a" & Cells(Rows.Count, 1).End(xlUp).Row)

rng.Offset(0, 1).Resize(1, 4) = d(rng.Value)'d(rng.Value)是d.item(rng.Value)的简写

Next

EndSub


计算机科学与技术 & 计算机网络技术:双专业课程体系完全导航指南​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1160213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型产业价值链深度解析:从基础设施到应用层的全景指南

大模型产业呈现四层价值链架构&#xff0c;当前超60%价值集中于基础设施层&#xff0c;未来将向MaaS服务及应用层传递。应用层分为软件平台(轻量化高毛利)和硬件载体(重投资长周期)。大模型厂商可选择开源、闭源或混合策略。基础设施层整合IDC承载、硬件算力、系统集成及软件调…

Excel VBA 编程基础学习笔记 · 第四章:事件编程 - 打造智能交互的自动化引擎

目录 第四课&#xff1a;Excel VBA事件过程 1、EXCEL事件程序定义与作用 2、事件程序基础 3、工作表事件实例1&#xff08;自选计算与投票统计&#xff09; 4、工作表事件实例2&#xff08;状态栏地址与防工作表名更改) 5、工作表事件实例3&#xff08;自动列出工作表名与…

【MIMO通信】MIMO检测器(ZF、MMSE、SIC、ML)在瑞利衰落下的BER性能比较【含Matlab源码 14929期】含报告

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab领域博客之家&#x1f49e;&…

BUUCTF-[ACTF2020 新生赛]Upload

打开靶机后发现是一个文件上传的题目随便上传一个文件观察路径和返回的方式是什么发现只能上传jpg,png,gif的文件上传一个jpg文件发现页面会回显返回的路径既然有路径了我们就可以尝试上传一句话木马了构造一句话木马<?phpeval($_POST[rc]);?>导入字典观察过滤的哪些后…

幂等性设计指南:从数据库唯一索引到 Redis Token,如何防止用户“手抖”重复提交?

标签: #架构设计 #幂等性 #Redis #数据库 #分布式系统 #面试必问 💣 前言:即使前端置灰了按钮,后端也必须防重 很多初级开发者认为:“我在前端点击按钮后,把按钮置灰(Disabled)不就行了吗?” 太天真。 懂点技术的用户可以直接调 API 接口。 弱网环境下,请求发出去了…

发刊不用愁:paperxie 期刊论文功能,一键匹配普通刊 / 核心刊的学术标准

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/aippt https://www.paperxie.cn/ai/journalArticleshttps://www.paperxie.cn/ai/journalArticles 对于科研人员和学生来说&#xff0c;“期刊论文投稿” 从来不是 “写完文字” 这么简单 —— 普通刊要符…

PointMAE的代码配环境+运行

PointMAE的笔记 PointMAE的代码地址 1. 环境配置 我的cuda是115安装Pointnet2_PyTorch总是失败 所以我在隔离环境中创建了cuda113的环境 参考pip 隔离环境内 安装 cuda 113 不覆盖原有的全局 cuda 115 1.1 安装torch pip install torch1.12.1cu113 torchvision0.13.1cu113…

CMake:现代C/C++项目的构建中枢

CMake&#xff1a;现代C/C项目的构建中枢 引言&#xff1a;从构建混乱到标准化 想象你正在开发一个跨平台的C库&#xff0c;需要在Windows、Linux、macOS上都能构建。在CMake出现之前&#xff0c;这意味着&#xff1a;为Visual Studio编写.vcxproj文件为Linux编写复杂的Mak…

【MIMO通信】基于matlab MIMO检测器(ZF、MMSE、SIC、ML)在瑞利衰落下的BER性能比较【含Matlab源码 14929期】含报告

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

8 款 AI 毕业论文写作工具实测:拯救你的学术秃头季

又到毕业季&#xff0c;看着空白的 Word 文档和导师催稿的消息&#xff0c;不少同学直接陷入 “论文焦虑症”。别慌&#xff01;AI 写作工具已经成为当代毕业生的隐形外挂。我们实测了全网最火的 8 款 AI 毕业论文写作工具&#xff0c;从选题、框架到降重一站式搞定&#xff0c…

智能体反思模式:让AI从“会做“到“做好“的关键技术

智能体反思模式是让AI对自身输出进行评估并自我纠错的机制&#xff0c;通过"执行-评估-优化"闭环迭代提升输出质量。文章详解了其流程、价值&#xff08;减少人工修正、避免重复犯错、适配复杂场景&#xff09;和实现方式&#xff08;特别是"生产者-批评者"…

锁定Nature!小样本学习是真的好发

小样本机器学习&#xff5c;学术人不容错过的高产赛道&#xff01;数据稀缺是AI领域的长期痛点&#xff0c;而小样本学习以“少量数据就能实现高效学习”的核心优势&#xff0c;成为现实应用中不可或缺的技术&#xff0c;同时也成为学术研究的热门方向——技术迭代迅速、创新空…

基于改进鲸鱼优化算法的微网系统能量优化管理Matlab源码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1…

MyBatis:注解开发

在 MyBatis 的开发体系中&#xff0c;注解开发作为 XML 配置的补充方案&#xff0c;以其简洁直观的语法大幅简化了基础 CRUD 操作的代码编写。然而需要明确的是&#xff0c;该方式更适用于简单业务场景&#xff0c;不推荐在生产环境中大规模使用—— 复杂 SQL 的维护性、动态 S…

大模型智能体工程实践:Rock Roll训练系统的构建与优化【收藏学习】

该研究提出智能体学习生态系统(ALE)&#xff0c;包含ROLL训练框架、ROCK环境和iFlow CLI工具三层架构。创新性IPA算法基于语义交互块进行信用分配&#xff0c;提升长程训练稳定性。基于百万轨迹数据训练的ROME模型在SWE-bench等基准上表现优异&#xff0c;仅用30B参数就接近GPT…

2026年AI产品市场格局:多模态崛起,音乐生成爆发,程序员必看

SimilarWeb的2026年全球AI报告显示&#xff1a;通用AI流量滞涨&#xff0c;OpenAI市占率降至65%以下&#xff0c;Gemini上升至20%&#xff1b;音乐和音频生成增速最高&#xff1b;多模态产品访问量上涨&#xff1b;图像、写作和自动化工具流量下滑。AI原生应用冲击传统互联网平…

大模型工程师转型攻略:无需985学历,四大核心能力助你轻松入行

本文破除了大模型工程师高门槛的迷思&#xff0c;指出大多数企业需要的是应用工程师而非算法研究员。通过分析真实转型案例&#xff0c;文章总结出四大核心能力&#xff1a;提示工程、RAG检索增强生成、模型微调和工程部署能力。零基础程序员可通过系统学习一个月内产出可演示项…

【PaperXie毕业论文】从零到一的智能写作革命:AI如何重塑你的学术创作全流程

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/aippt https://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertation ——告别熬夜改稿&#xff0c;开启“输入即输出”的高效学术时代 在2026年的今天&#xff0c;当人工智能已深度…

短剧广告联盟APP开发:数据对接与播放量、广告曝光量、收益联动统计方案

在短剧广告联盟APP的商业化体系中&#xff0c;播放量、广告曝光量与收益数据是衡量运营效果的核心指标&#xff0c;而三者的联动统计与精准对接&#xff0c;更是实现 “内容优化 - 广告策略调整 - 收益提升” 的关键前提。多数短剧APP 在开发阶段易陷入 “数据割裂、统计延迟、…

GEO营销全链路方案:附近搜索引流 + 到店优惠 + 会员裂变

一、方案概述本方案为实体门店打造基于地理位置&#xff08;GEO&#xff09;的数字化营销闭环&#xff0c;通过“线上精准引流-到店转化锁客-会员裂变增长”全链路设计&#xff0c;实现低成本、高效率的客源增长。二、核心玩法架构text附近搜索引流 → 到店专享优惠 → 会员体系…