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

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

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

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

相关推荐

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&#39;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&#39;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组件库,...