Excel常用技能分享与探讨(5-宏与VBA简介之VBA的数组与集合)
zhezhongyun 2025-06-12 19:04 17 浏览
总结
数组:适合处理固定大小、类型一致、需要快速访问的数据。
集合:适合动态增删、键值查找或混合类型数据。
根据具体需求选择合适的数据结构,可显著提升代码效率和可读性。
一、从仓库管理理解数据结构(场景化入门)
储物间模型:
- 数组 → 固定尺寸的储物柜(每个格子有固定编号)
- 集合 → 可伸缩的收纳箱(随意增减物品)
- 字典 → 带标签的储物盒(通过钥匙编号快速查找)
二、数组
2.1 基础操作
2.1.1.基本概念
- 数组是一组有序元素的集合,所有元素类型相同。
- 通过索引(从0或1开始)访问元素。
- 分为静态数组(固定大小)和动态数组(大小可变)。
2.1.2.声明与初始化
' 静态数组
Dim arrStatic(1 To 5) As Integer ' 索引1到5
Dim arrStatic2(0 To 4) As String ' 索引0到4
' 动态数组
Dim arrDynamic() As Variant
ReDim arrDynamic(1 To 3) ' 初始化大小
ReDim Preserve arrDynamic(1 To 5) ' 保留原有数据并扩展大小
2.1.3.常用操作
- 赋值与访问:
arrStatic(1) = 10
MsgBox arrStatic(1)
- 遍历数组:
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i) Next i
- 多维数组:
Dim matrix(1 To 3, 1 To 3) As Integer
matrix(2, 2) = 5
' ① 声明数组
Dim 成绩单(1 To 50) As Integer ' 创建50个格子
' ② 填充数据
For i = 1 To 50
成绩单(i) = Cells(i + 1, 2).Value
Next
' ③ 批量处理
For i = 1 To UBound(成绩单)
成绩单(i) = 成绩单(i) + 5 ' 每人加5分
Next
' ④ 写回表格
Range("C2:C51").Value = Application.Transpose(成绩单)
- 动态数组:
Dim 动态数组() As Variant
' 自动匹配数据区域
动态数组 = Range("A1").CurrentRegion.Value
' 扩展数组
ReDim Preserve 动态数组(1 To 100, 1 To 5)
2.2.优点与缺点
- 优点:
- 访问速度快(连续内存)。
- 适合存储固定数量或类型一致的数据。
- 缺点:
- 大小固定(静态数组)或调整麻烦(动态数组需用 ReDim Preserve)。
- 无法直接删除元素。
三、集合
3.1 基础操作
3.1.1.基本概念
- 集合是动态数据结构,可存储不同类型元素。
- 元素通过键(Key)或索引访问(索引从1开始)。
- 属于VBA内置对象,需先创建实例。
3.1.2.创建与基本操作
Dim coll As New Collection ' 创建集合
' 添加元素(可指定键)
coll.Add "Apple", "Key1" ' 元素值, 键(可选)
coll.Add 123
coll.Add Range("A1")
' 访问元素
MsgBox coll(1) ' 通过索引(从1开始)
MsgBox coll("Key1") ' 通过键
' 删除元素
coll.Remove 1 ' 删除索引为1的元素
coll.Remove "Key1" ' 删除键为Key1的元素
' 遍历集合
Dim item As Variant
For Each item In coll
Debug.Print item
Next item
3.1.3.常用属性和方法
- Count:返回集合元素数量。
Debug.Print coll.Count
- Exists函数(需自定义):
Function IsKeyExists(coll As Collection, key As String) As Boolean
On Error Resume Next
IsKeyExists = Not IsEmpty(coll(key))
On Error GoTo 0
End Function
3.2 典型应用场景
- 去除重复值(比Excel去重更快)
- 动态记录用户操作日志
- 管理不规则数据组
3.3 优点与缺点
- 优点:
- 动态增删元素。
- 支持键值对,查找方便。
- 可存储混合类型数据。
- 缺点:
- 访问速度慢于数组。
- 无法直接排序或批量操作。
四、数组 vs 集合:选择你的工具
特性 | 数组 | 集合 |
存储效率 | 内存连续,速度快 | 动态分配,稍慢 |
大小调整 | 需ReDim Preserve | 自由增删 |
查找速度 | 遍历查找 | 通过Key快速定位 |
适用场景 | 数值计算/矩阵运算 | 动态数据管理/去重 |
内存占用 | 固定 | 随内容变化 |
五、五大实战案例
1.使用数组
' 快速处理单元格区域数据
Dim dataRange As Variant
dataRange = Range("A1:C10").Value ' 读取到二维数组
For i = 1 To UBound(dataRange, 1)
For j = 1 To UBound(dataRange, 2)
dataRange(i, j) = dataRange(i, j) * 2
Next j
Next i
Range("A1:C10").Value = dataRange
2.使用集合
' 管理动态项目列表
Dim tasks As New Collection
tasks.Add "Write code", "Task1"
tasks.Add "Test module", "Task2"
If IsKeyExists(tasks, "Task1") Then
tasks.Remove "Task1"
End If
3.数组与集合的转换:
' 集合转数组
Dim arr() As Variant
ReDim arr(1 To coll.Count)
For i = 1 To coll.Count
arr(i) = coll(i)
Next i
4.筛选数组元素:
' 使用Filter函数(仅适用于一维数组)
Dim names() As String
names = Split("John,Mary,Paul", ",")
Dim result() As
String result = Filter(names, "J") ' 返回包含"J"的元素
案例1:数据清洗
Dim 数据池 As Variant
数据池 = Range("A1:G10000").Value ' 1秒读取万行数据
For i = 1 To UBound(数据池, 1)
' 删除特殊字符
数据池(i, 2) = Replace(数据池(i, 2), "#", "")
' 统一日期格式
If IsDate(数据池(i, 3)) Then
数据池(i, 3) = Format(数据池(i, 3), "yyyy-mm-dd")
End If
Next
Range("A1:G10000").Value = 数据池 ' 1秒写回
案例2:多表合并去重
Dim 总表 As New Collection
On Error Resume Next ' 忽略重复报错
For Each ws In Worksheets
For Each cell In ws.Range("A2:A1000")
If cell <> "" Then 总表.Add cell.Value, CStr(cell.Value)
Next
Next
' 导出唯一值
Range("H2").Resize(总表.Count).Value = Application.Transpose(总表)
六、避坑指南
6.1 常见错误表
错误现象 | 原因分析 | 解决方案 |
"下标越界"(Error 9) | 访问不存在的数组索引 | 检查UBound/LBound |
"类型不匹配"(Error 13) | 数组元素类型不一致 | 声明时指定明确类型 |
集合Key重复 | 重复添加相同Key | 添加前检查Exists属性 |
动态数组未初始化 | 使用前未ReDim | 先ReDim再赋值 |
6.2 安全操作规范
' 数组越界防护
If i <= UBound(数据数组) Then
' 安全操作代码
End If
' 集合存在性检查
Function 包含Key(集合 As Collection, Key As String) As Boolean
On Error Resume Next
包含Key = Not IsEmpty(集合(Key))
On Error GoTo 0
End Function
七、调试实验室
7.1 立即窗口查看数组
' 输入查看命令
?Join(数据数组, ",") ' 显示一维数组所有元素
?数据池(2,3) ' 查看第二行第三列元素
7.2 可视化监视技巧
在VBA编辑器中:
- 运行→添加监视
- 输入变量名:数据池
- 展开查看多维元素
下章预告:《函数与过程》
相关推荐
- Chinese vice premier calls for multilateralism at Davos
-
DAVOS,Switzerland,Jan.21(Xinhua)--ChineseVicePremierDingXuexiangdeliveredaspeechatthe...
- 用C++ Qt手把手打造炫酷汽车仪表盘
-
一、项目背景与核心价值在车载HMI(人机交互界面)开发领域,虚拟仪表盘是智能座舱的核心组件。本项目基于C++Qt框架实现一个具备专业级效果的时速表模块,涵盖以下技术要点:Qt图形绘制核心机制(QPa...
- 系列专栏(八):JS的第七种基本类型Symbols
-
ES6作为新一代JavaScript标准,已正式与广大前端开发者见面。为了让大家对ES6的诸多新特性有更深入的了解,MozillaWeb开发者博客推出了《ES6InDepth》系列文章。CSDN...
- MFC界面开发工具BCG v31.1 - 增强功能区、工具箱功能
-
点击“了解更多”获取工具亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBarProfessionalforMFC和BCGSuiteforMFCv31.2正式发布!新版本支...
- 雅居乐上调出售吉隆坡项目保留金,预计亏损扩大至6.64亿元
-
1月2日,雅居乐集团(03383.HK)发布有关出售一家附属公司股权披露交易的补充公告。此前雅居乐集团曾公告,2023年11月8日(交易时段后),集团子公司AgileRealEstateDeve...
- Full text: Address by Vice Premier Ding Xuexiang's at World Economic Forum Annual Meeting 2025
-
DAVOS,Switzerland,Jan.21(Xinhua)--ChineseVicePremierDingXuexiangonTuesdaydeliveredasp...
- 手机性能好不好 GPU玄学曲线告诉你
-
前言各位在看测试者对手机进行评测时或许会见过“安卓玄学曲线”,所谓中的安卓玄学曲线真名为“ProfileGPURendering”。大多数情况下,在系统“开发者选项中被称为“GPU显示配置文件”或...
- 小迈科技 X Hologres:高可用的百亿级广告实时数仓建设
-
通过本文,我们将会介绍小迈科技如何通过Hologres搭建高可用的实时数仓。一、业务介绍小迈科技成立于2015年1月,是一家致力以数字化领先为优势,实现业务高质量自增长的移动互联网科技公司。始...
- vue3新特征和所有的属性,方法汇总及其对应源码分析
-
vue3新特征汇总与源码分析(备注:vue3使用typescript编写)何为应用?constapp=Vue.createApp({})app就是一个应用。应用的配置和应用的API就是app应用...
- China's stability redefines global trade in a volatile era
-
ContainersareunloadedatQingdaoPort,eastChina'sShandongProvince,December10,2024.[Photo/X...
- QML 实现图片帧渐隐渐显轮播
-
前言所谓图片帧渐隐渐显轮播就是,一组图片列表,当前图片逐渐改变透明度隐藏,同时下一张图片逐渐改变透明度显示,依次循环,达到渐隐渐显的效果,该效果常用于图片展示,相比左右自动切换的轮播方式来说,这种方式...
- 前端惊魂夜:我竟在CSS里写出了JavaScript?
-
凌晨两点,写字楼里只剩下我工位上的一盏孤灯。咖啡杯见底,屏幕的光映在疲惫的眼镜片上。为了实现一个极其复杂的动态渐变效果,我翻遍了MDN文档,试遍了所有已知的CSS技巧,却始终差那么一口气。“要是CSS...
- 10 个派上用场的 Flutter 小部件
-
尝试学习一门新语言可能会令人恐惧和厌烦。很多时候,我们希望我们知道早先存在的某些功能。在今天的文章中,我将告诉你我希望早点知道的最方便的颤振小部件。SpacerSpacer创建一个可调整的空白空...
- 让我的 Flutter 代码整洁 10 倍的 5 种
-
如果你曾在Flutter中使用过SingleTickerProviderStateMixin来制作动画,猜猜怎么着?你已经使用过Mixin了——恭喜你,你已经处于一段你甚至不知道的关...
- daisyUI - 主题漂亮、代码纯净!免费开源的 Tailwind CSS 组件库
-
漂亮有特色的CSS组件库,组件代码非常简洁,也支持深度定制主题、定制组件,可以搭配Vue/React等框架使用。关于daisyUIdaisyUI是一款极为流行的CSSUI组件库,...
- 一周热门
- 最近发表
-
- Chinese vice premier calls for multilateralism at Davos
- 用C++ Qt手把手打造炫酷汽车仪表盘
- 系列专栏(八):JS的第七种基本类型Symbols
- MFC界面开发工具BCG v31.1 - 增强功能区、工具箱功能
- 雅居乐上调出售吉隆坡项目保留金,预计亏损扩大至6.64亿元
- Full text: Address by Vice Premier Ding Xuexiang's at World Economic Forum Annual Meeting 2025
- 手机性能好不好 GPU玄学曲线告诉你
- 小迈科技 X Hologres:高可用的百亿级广告实时数仓建设
- vue3新特征和所有的属性,方法汇总及其对应源码分析
- China's stability redefines global trade in a volatile era
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- HTML button formtarget 属性 (30)
- opacity 属性 (32)
- transition 属性 (33)