百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Excel常用技能分享与探讨(5-宏与VBA简介之VBA的数组与集合)

myzbx 2025-07-01 22:13 44 浏览


总结

数组:适合处理固定大小、类型一致、需要快速访问的数据。

集合:适合动态增删、键值查找或混合类型数据。

根据具体需求选择合适的数据结构,可显著提升代码效率和可读性。

一、从仓库管理理解数据结构(场景化入门)

储物间模型

  • 数组 → 固定尺寸的储物柜(每个格子有固定编号)
  • 集合 → 可伸缩的收纳箱(随意增减物品)
  • 字典 → 带标签的储物盒(通过钥匙编号快速查找)

二、数组

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编辑器中:

  1. 运行→添加监视
  2. 输入变量名:数据池
  3. 展开查看多维元素

下章预告:《函数与过程》

相关推荐

如何设计一个优秀的电子商务产品详情页

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...

怎么在JS中使用Ajax进行异步请求?

大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...

中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革

前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...

前端监控 SDK 开发分享_前端监控系统 开源

一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...

Ajax 会被 fetch 取代吗?Axios 怎么办?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...

前端面试题《AJAX》_前端面试ajax考点汇总

1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...

Ajax 详细介绍_ajax

1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...

6款可替代dreamweaver的工具_替代powerdesigner的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

福斯《死侍》发布新剧照 &quot;小贱贱&quot;韦德被改造前造型曝光

时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...

不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!

Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...

2025 年 Python 爬虫四大前沿技术:从异步到 AI

作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...

最贱超级英雄《死侍》来了!_死侍超燃

死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...

停止javascript的ajax请求,取消axios请求,取消reactfetch请求

一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...