当前位置: 首页 > news >正文

【Excel VBA编程】共享对象状态——多个变量引用同一对象

VBA中的普通数据类型(如Integer、String)是值类型,赋值时会创建副本。而对象变量是引用类型,赋值时传递的是引用。理解并善用这一特性,是编写高效、模块化VBA代码的关键

那么要如何理解这一特性呢?接下来给大家举几个例子

示例1

一个最直接、也是平时常用却从未正视过的例子:让两个Range对象变量rng1和rng2都指向Sheet1工作表中的C2单元格。rng1变量修改C2单元格内容,rng2变量修改C2单元格显示样式(如字体加粗、改变单元格底色等)

Dim rng1 As RangeDim rng2 As RangeSet rng1 = Worksheets("Sheet1").Range("C2")Set rng2 = rng1' rng1 修改单元格内容rng1.Value = "Rng1变量"' rng2 修改单元格的格式rng2.Font.Bold = Truerng2.Interior.Color = vbYellow

执行以上代码后,可以看到C2单元格变化

其原理:rng1和rng2都指向同一个Range对象。因此,无论是通过rng1还是rng2来改变单元格的值或格式,效果都是相同的,因为它们操作的是内存中的同一个对象实例

友情提示:给对象变量赋值时,必须使用Set语句,如Set rng2 = rng1。如果省略Set,VBA会尝试进行值赋值,从而导致“运行时错误91:对象变量或With块变量未设置”

示例2

当需要将一个对象(如数据字典)传递给另一个过程或函数进行处理时,除了通过之前讲过的参数传递外,还可以使用Set语句直接赋值给另一个对象变量,使多个变量引用同一个对象实例

示例代码如下:

  • 模块最上方定义全局对象变量globalDict

  • 主程序MainPro创建字典对象,并向字典中添加了一个元素Key1对应的内容是“Value1”

  • 子程序SubProcess通过Set语句让变量UpdateDict指向字典并修改字典内数据

Public globalDict As ObjectSub MainPro()Set globalDict = CreateObject("Scripting.Dictionary")' 向字典添加数据globalDict.Add "Key1", "Value1"Debug.Print "MainPro中Key1:" & globalDict("Key1")' 调用子过程Call SubProcessSet globalDict = NothingEnd SubSub SubProcess()Dim UpdateDict As ObjectSet UpdateDict = globalDictIf Not UpdateDict Is Nothing Then' 修改字典内容UpdateDict("Key1") = "Updated Value"' 遍历字典Dim key As VariantFor Each key In UpdateDict.KeysDebug.Print "SubProcess中" & key & ": " & UpdateDict(key)Next keyEnd IfSet UpdateDict = NothingEnd Sub

其中,全局变量globalDict指向一个字典对象。在子过程中通过`Set UpdateDict= globalDict`语句,让变量UpdateDict也指向了同一个字典对象。对UpdateDict的任何修改都会直接作用于该字典

此时,可能有朋友就疑惑了,既然都定义了全局变量,全部使用全局变量不行吗?还要再通过set语句让多个临时变量引用,有那个必要吗?

其实,在VBA编程中,虽然直接使用全局变量确实是一种简洁的方法,但通过Set语句让多个变量引用同一个对象仍然具有重要的实用价值,这并非多此一举

例如,当我们阅读代码时,看到局部变量名,如UpdateDict,能立即理解该变量在当前过程中的用途,而不需要追溯全局变量的定义。这种“自文档化”的代码风格显著提高了可读性。当然好处不仅仅是这一条,还体现在代码维护、复用、调试等方面,随着代码量输出,相信大家有更深刻地体会

结束语

以上提到的都是对象变量引用,那么,VBA有没有为普通数据类型(如 Integer、String)提供一些机制,让这些值类型的数据也能实现类似“引用”的效果呢?

感兴趣的小伙伴可以持续关注,等待后续的分享哦

本公众号一直在不间断地分享免费的编程案例和实用技巧。无论您是用来提升自动化办公效率还是想提升自我,请关注我的公众号“努力鸭是黑色的”,解锁更多的编程知识

http://www.jsqmd.com/news/338733/

相关文章:

  • 空调自控系统恒温恒湿控制系统:西门子PLC与MCGSpro触摸屏源程序实际应用与参考学习
  • 【深度收藏】Transformer数学宝典:从线性代数到组合数学的完整路线图
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第四十七讲)
  • 一步生成,像素空间,何恺明让 pMF 做到了
  • 硬核备战2026金三银四:拿下RAG岗,这份保姆级学习路线与面试指南助你起飞!
  • 收藏!大模型从入门到精通:LLM、Transformer、Agent等核心概念全解析
  • 海外市场增长解码:硬连线、LoRa与核心传感器重塑一氧化碳报警器格局
  • 厦门银行2025:一场成功的急救?
  • 2026深圳公交车/东西部公交/深圳巴士集团广告哪家好?首选深圳市巴士广告有限公司 - 深度智识库
  • 先来点硬核的!咱们直接在ZYNQ板子上搞图像识别,代码从训练到部署一条龙。别慌,手把手带你趟平坑位
  • 收藏级干货!2026年AI Agents开发框架与工具完全指南,从入门到精通必备手册
  • 大模型行业薪资真相:百万年薪是主流,千万只是少数人的传说
  • Combinatorial Proof
  • 从原型到生产级:企业级RAG+知识图谱系统架构升级实战指南
  • 企业级AI架构实践:MCP协议技术规范与落地指南,含3大解决方案、2种架构对比
  • XDMA丢包问题分析
  • 程序员必备技能:使用本地LLM提取非结构化医疗数据,收藏这篇就够了
  • 基于YOLOv5/v8/v10的智能铁轨缺陷检测系统:从算法原理到工业级GUI应用实践
  • 年薪五十万的硬件工程师应该具备哪些业务技能
  • 312. Java Stream API - 使用收集器进行计数操作
  • 【强烈推荐】大模型开发者必看:AI智能体90%是软件工程,10%是AI的真相
  • UltraRAG 3.0开源:可视化RAG推理全链路,小白也能快速上手大模型开发
  • 构建高性能车型识别与计数全栈系统——YOLOv5/v8/v10实战详解
  • 基于YOLO系列的行人车辆检测与计数系统:从理论到实践
  • Claude Code安装与初始化
  • 深度解析 ARP 欺骗攻击:原理 + 实操 + 防御,小白也能轻松上手
  • 收藏!小白也能看懂的大模型术语全解析:从GGUF到Reranker,一文搞懂本地RAG系统
  • MATLAB Simulink教程及模型
  • 渗透测试实战核心:ARP 欺骗攻击(ARP 断网攻击)全流程实操指南
  • 树形DP扩展