news 2026/4/17 14:39:13

【Excel VBA 编程】第68讲:从结构体向数据字典的务实转型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Excel VBA 编程】第68讲:从结构体向数据字典的务实转型

在前两期,我们主要采用“结构体(Type)+ 函数”的方式来构建复杂的数据模型。这种方式的优点在于结构清晰、逻辑明确,便于理解和上手。然而,它也存在一些不足:数据与行为仅实现了初步解耦,数据扩展性有限,且在处理数组等集合数据时效率不高

为了平衡性能以及可扩展性,又要如何改变呢?

原有模式的局限性

关于原有模式“结构体+函数+数组”的局限性,还是以图书馆里的“图书”为例加以说明

1.1 扩展性

刚开始,我们通过结构体定义了“图书”结构如下:

' 自定义数据类型:图书Public Type BookTitle As String ' 属性:书名Author As String ' 属性:作者ISBN As String ' 属性:ISBN号Status As Integer ' 属性:状态 (使用上面的常量)PageCount As Integer ' 属性:页数End Type

后来在使用中发现还需要增加一个必要的属性,如图书的语言,那么,接下来我们要级联修改的内容如下:

  • 修改 Type Book 的定义 → 添加 Language As String

  • 修改所有创建 Book 实例的地方(初始化代码)

  • 修改所有读取 Book.Language 的代码(如显示图书信息函数、“图书”与“读者”交互的函数)

总之一句话,只要增加一个“语言”属性,所有使用该Type的代码都可能受到影响,引发大规模代码改动,兼容性差

1.2 性能

主要体现在使用数组管理“图书”上,假设图书馆里有10000本书,我们从增、删、查三个方面详细说明:

  • “图书”查询:这是一个 O(N) 的线性查找。为了找一本书,它必须从数组的第一个元素开始,逐个比较ISBN或书名,直到找到目标或遍历完整个数组。在最坏的情况下(找最后一本书或找不到的书),需要进行 10,000 次比较。平均下来需要 5,000 次比较。如果再遇到频繁借阅、归还、查询操作时,这种延迟会累积得非常明显,导致程序卡顿

  • 增加“图书”:在末尾追加很快,但如果需要按ISBN排序插入,或者数组已满需要 ReDim Preserve,则效率会很低。ReDim Preserve 会创建一个新的、更大的数组,并将旧数组的所有数据复制过去,这是一个 O(N) 的操作,这会非常慢

  • 删除“图书”:当删除中间的一本书后,为了保持连续性,需要将后面所有的书向前移动填补空缺。这也是一个 O(N) 的操作

改进方案

仅从性能和可扩展方面来看,更推荐使用数据字典,对的,你没有看错,是数据字典Dictionary

用数据字典来管理“图书”,本质上就是用空间换时间,并借助其精妙的数据结构,把一个需要线性扫描的笨拙过程,变成了一个可以随机瞬间访问的智能过程。从而把我们从繁琐的底层循环和数据搬运中解放出来,专注于业务本身

示例代码:

Dim Library As Object' 初始化字典Sub InitLibrary()Set Library = CreateObject("Scripting.Dictionary")' 设置比较模式,例如不区分大小写Library.CompareMode = vbTextCompareEnd Sub' 添加图书Sub AddBookToDict(title As String, author As String, isbn As String, status As String, pageCount As Long, language As String)If Not Library.Exists(isbn) ThenDim bookDetail As ObjectSet bookDetail = CreateObject("Scripting.Dictionary")bookDetail("Title") = titlebookDetail("Author") = authorbookDetail("Status") = statusbookDetail("PageCount") = pageCountbookDetail("Language") = languageLibrary.Add isbn, bookDetailElseMsgBox "ISBN已存在!"End IfEnd Sub

通过采用数据字典,不仅提升了数据处理效率,还增强了系统的可维护性与扩展性,是一种务实、高效且在实际应用中被验证为成功的实践路径

结束语

以上代码中关于字典Dictionary的应用是不是颠覆了大家的认知呢?从最基础的层面看,一个Dictionary对象由成对的 Key 和 Item 组成,为何代码中可以添加许多个字段呢?哪个字段是key哪个又是Item?你有没有类似的困惑?别急,咱们下期继续讨论

公众号同时也在不间断地分享免费的编程案例,如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想提升自我,都可以关注我的公众号“努力鸭是黑色的”,解锁更多的VBA技能

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 8:16:32

开源≠免费:如何通过内容营销推动商业GPU服务销售

开源≠免费:如何通过内容营销推动商业GPU服务销售 在人工智能项目从实验室走向生产线的过程中,一个看似简单却反复出现的问题是:为什么明明用了开源框架,成本还是居高不下?不少团队在初期选择 PyTorch 时,看…

作者头像 李华
网站建设 2026/4/17 7:37:55

常用的可实现站群管理的 CMS 系统有哪些?

在大型机构与单位的运营场景中,往往会下设多个子站点 —— 例如大型企业的子公司官网、政务体系中省市区各级及各部门的官方站点、高校内各学院的专属网站,不少教育管理机构也正逐步将辖区内中小学网站纳入集中化管理与统一搭建体系。这类需求均需借助站…

作者头像 李华
网站建设 2026/4/15 5:18:32

大模型Token消耗监控工具开发实践(Python实现)

大模型Token消耗监控工具开发实践(Python实现) 在大模型应用逐渐从实验室走向生产环境的今天,一个看似微小却影响深远的问题浮出水面:我们真的清楚每一次API调用背后的资源开销吗?尤其是在使用如通义千问、Llama等大语…

作者头像 李华
网站建设 2026/4/13 9:21:23

YOLOv10新增PGI辅助监督,梯度传播更充分

YOLOv10引入PGI辅助监督:让梯度传播更充分、训练更高效 在工业质检线上,一台摄像头正高速扫描PCB板——成千上万个微小元件飞速掠过视野。传统目标检测模型常因“看不清”而漏检几个电阻或电容,导致整批产品返工。这类问题背后,是…

作者头像 李华
网站建设 2026/4/17 2:34:08

YOLO目标检测服务灰度发布?多版本GPU部署

YOLO目标检测服务灰度发布?多版本GPU部署 在智能制造工厂的质检流水线上,一台边缘服务器正同时运行着三个不同版本的YOLO模型——旧产线使用YOLOv5处理高清摄像头数据,新产线采用YOLOv8进行高精度缺陷识别,而测试中的YOLOv10则接收…

作者头像 李华
网站建设 2026/4/15 8:45:44

基于深度强化学习的智能楼宇节能热舒适控制探索

基于深度强化学习的智能楼宇节能热舒适控制 摘要:采暖、通风和空调 (HVAC) 能耗极高,占建筑总能耗的 40%。 因此,设计一些节能的建筑热控制策略,在保持居住者舒适度的同时降低暖通空调的能耗是至关重要的。 然而,实施这…

作者头像 李华