news 2026/5/14 12:48:20

【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/5/7 12:43:53

Dockerfile解析:PyTorch-CUDA-v2.6是如何构建的?

Dockerfile解析:PyTorch-CUDA-v2.6是如何构建的? 在深度学习项目开发中,最令人头疼的往往不是模型设计本身,而是环境配置——“为什么代码在我机器上跑得好好的,换台服务器就报错?” 这种问题几乎每个AI工程…

作者头像 李华
网站建设 2026/5/13 6:20:19

Arduino驱动LED入门:项目应用完整指南

从点亮第一颗LED开始:Arduino实战入门全解析你有没有过这样的经历?手握一块Arduino板,几根跳线,一个LED,却怎么也点不亮它。电压测了、代码传了、引脚对了,可灯就是不亮——别担心,这几乎是每个…

作者头像 李华
网站建设 2026/5/12 5:43:12

GPU算力资源如何变现?通过技术博客引流销售Token

GPU算力资源如何变现?通过技术博客引流销售Token 在AI模型训练动辄需要数十小时、甚至上百张GPU卡的今天,拥有高性能计算资源的人,是否只能让这些“数字印钞机”闲置吃灰?而另一边,无数开发者却因环境配置复杂、驱动版…

作者头像 李华
网站建设 2026/5/13 5:39:06

SSH远程访问PyTorch-CUDA-v2.6镜像,实现高效模型训练

SSH远程访问PyTorch-CUDA-v2.6镜像,实现高效模型训练 在AI研发日益工程化的今天,一个常见的困境是:研究人员手握前沿算法,却卡在“环境配不起来”或“本地显卡太弱”的瓶颈上。尤其当团队协作开发时,“在我机器上能跑”…

作者头像 李华
网站建设 2026/5/9 23:58:06

GitHub项目复现困难?用PyTorch-CUDA镜像统一实验环境

GitHub项目复现困难?用PyTorch-CUDA镜像统一实验环境 在深度学习领域,你是否经历过这样的场景:从GitHub克隆了一个热门项目,满怀期待地运行python train.py,结果却卡在了第一行——“ImportError: libcudart.so.11.0: …

作者头像 李华