Excel常用技能分享与探讨(5-宏与VBA简介之VBA的数组与集合)
zhezhongyun 2025-06-12 19:04 4 浏览
总结
数组:适合处理固定大小、类型一致、需要快速访问的数据。
集合:适合动态增删、键值查找或混合类型数据。
根据具体需求选择合适的数据结构,可显著提升代码效率和可读性。
一、从仓库管理理解数据结构(场景化入门)
储物间模型:
- 数组 → 固定尺寸的储物柜(每个格子有固定编号)
- 集合 → 可伸缩的收纳箱(随意增减物品)
- 字典 → 带标签的储物盒(通过钥匙编号快速查找)
二、数组
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编辑器中:
- 运行→添加监视
- 输入变量名:数据池
- 展开查看多维元素
下章预告:《函数与过程》
相关推荐
- JavaScript做个贪吃蛇小游戏(过关-加速),无需网络直接玩。
-
JavaScript做个贪吃蛇小游戏(过关-则加速)在浏览器打开文件,无需网络直接玩。<!DOCTYPEhtml><htmllang="en"><...
- 大模型部署加速方法简单总结(大模型 ai)
-
以下对大模型部署、压缩、加速的方法做一个简单总结,为后续需要备查。llama.cppGithub:https://github.com/ggerganov/llama.cppLLaMA.cpp项...
- 安徽医大第一医院应用VitaFlow Liberty(R)Flex为患者焕然一“心”
-
近日,在安徽医科大学第一附属医院心血管内科负责人暨北京安贞医院安徽医院业务副院长喻荣辉教授的鼎力支持和卓越带领下,凭借着先进的VitaFlowLiberty(R)Flex经导管主动脉瓣可回收可...
- 300 多行代码搞定微信 8.0 的「炸」「裂」特效!
-
微信8.0更新的一大特色就是支持动画表情,如果发送的消息只有一个内置的表情图标,这个表情会有一段简单的动画,一些特殊的表情还有全屏特效,例如烟花表情有全屏放烟花的特效,炸弹表情有爆炸动画并且消息和...
- 让div填充屏幕剩余高度的方法(div填充20px)
-
技术背景在前端开发中,经常会遇到需要让某个div元素填充屏幕剩余高度的需求,比如创建具有固定头部和底部,中间内容区域自适应填充剩余空间的布局。随着CSS技术的发展,有多种方法可以实现这一需求。实现步骤...
- css之div内容居中(css中div怎么居中)
-
div中的内容居中显示,包括水平和垂直2个方向。<html><head><styletype="text/css">...
- 使用uniapp开发小程序遇到的一些问题及解决方法
-
1、swiper组件自定义知识点swiper组件的指示点默认是圆圈,想要自己设置指示点,需要获得当前索引,然后赋给当前索引不同的样式,然后在做个动画就可以了。*关键点用change方法,然后通过e.d...
- 微信小程序主页面排版(怎样设置小程序的排版)
-
开发小程序的话首先要了解里面的每个文件的作用小程序没有DOM对象,一切基于组件化小程序的四个重要的文件*.js*.wxml--->view结构---->html*.wxss--...
- Vue动态组件的实践与原理探究(vue动态组件component原理)
-
我司有一个工作台搭建产品,允许通过拖拽小部件的方式来搭建一个工作台页面,平台内置了一些常用小部件,另外也允许自行开发小部件上传使用,本文会从实践的角度来介绍其实现原理。ps.本文项目使用VueCLI...
- 【HarmonyOS Next之旅】兼容JS的类Web开发(四) -> tabs
-
目录1->创建Tabs2->设置Tabs方向3->设置样式4->显示页签索引5->场景示例编辑1->创建Tabs在pages/index目录...
- CSS:前端必会的flex布局,我把布局代码全部展示出来了
-
进入我的主页,查看更多CSS的分享!首先呢,先去看文档,了解flex是什么,这里不做赘述。当然,可以看下面的代码示例,辅助你理解。一、row将子元素在水平方向进行布局:1.垂直方向靠顶部,水平方向靠...
- 【HarmonyOS Next之旅】兼容JS的类Web开发(四) -> swiper
-
目录1->创建Swiper组件2->添加属性3->设置样式4->绑定事件5->场景示例编辑1->创建Swiper组件在pages/index...
- CSS:Flex布局,网页排版神器!(css3 flex布局)
-
还在为网页排版抓狂?别担心,CSS的flex布局来了,让你轻松玩转各种页面布局,实现网页设计自由!什么是Flex布局?Flex布局,也称为弹性布局,是CSS中的一种强大布局方式,它能够让你...
- 移动WEB开发之flex布局,附携程网首页案例制作
-
一、flex布局体验传统布局兼容性好布局繁琐局限性,不能再移动端很好的布局1.1flex弹性布局:操作方便,布局极为简单,移动端应用很广泛PC端浏览器支持情况较差IE11或更低版本,不支持或仅部...
- 2024最新升级–前端内功修炼 5大主流布局系统进阶(mk分享)
-
2024最新升级–前端内功修炼5大主流布局系统进阶(mk分享)获课》789it.top/14658/前端布局是网页设计中至关重要的一环,它决定了网页的结构和元素的排列方式。随着前端技术的不断发展,现...
- 一周热门
- 最近发表
-
- JavaScript做个贪吃蛇小游戏(过关-加速),无需网络直接玩。
- 大模型部署加速方法简单总结(大模型 ai)
- 安徽医大第一医院应用VitaFlow Liberty(R)Flex为患者焕然一“心”
- 300 多行代码搞定微信 8.0 的「炸」「裂」特效!
- 让div填充屏幕剩余高度的方法(div填充20px)
- css之div内容居中(css中div怎么居中)
- 使用uniapp开发小程序遇到的一些问题及解决方法
- 微信小程序主页面排版(怎样设置小程序的排版)
- Vue动态组件的实践与原理探究(vue动态组件component原理)
- 【HarmonyOS Next之旅】兼容JS的类Web开发(四) -> tabs
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML常用标签 (29)
- 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)
- CSS 水平对齐 (Horizontal Align) (30)