从0学Excel VBA编程 第14篇:数组——让代码一次记住一堆数据
前面我们学过一个变量只能装一个值。如果有一整批数据要处理,比如一周销售额、一张成绩表,给每个数据都起一个变量名就太麻烦了。数组,就是解决这个问题的:它像一排整齐的盒子,用一个名字就能管理一大堆数据。
学习目标
知识点精讲
什么是数组
数组可以理解成「一组变量的集合」。普通变量是一个盒子,数组就是一排编了号的盒子。
一维数组
一维数组就是「一行」或「一列」数据。
Dim arr(1 To 7) As Double ' 声明一个能装 7 个 Double 的数组arr(1) = 100.5 ' 给第 1 个位置赋值arr(2) = 200.3 ' 给第 2 个位置赋值
注意:如果不写 1 To,默认从 0 开始。Dim arr(6) 表示下标 0 到 6,一共 7 个元素。建议大家写清楚 1 To 7,更符合 Excel 习惯。
二维数组
二维数组就像 Excel 表格,有行有列。
Dim scores(1 To 3, 1 To 2) As Integerscores(1, 1) = 85 ' 第1行第1列scores(1, 2) = 92 ' 第1行第2列scores(2, 1) = 78 ' 第2行第1列
动态数组
如果事先不知道要存多少数据,就用动态数组:先声明空括号,运行时再决定大小。
Dim arr() As Double ' 先声明,不指定大小ReDim arr(1 To 10) ' 运行时再分配 10 个位置
如果后面还要增加元素,用 ReDim Preserve 可以保留原来的数据:
ReDim Preserve arr(1 To 20) ' 扩容到 20,原来 1-10 的数据还在
和单元格配合
数组和 Range 配合,可以一次性把一片区域读进数组,处理完再写回去,速度比一个个单元格操作快很多。
Dim data As Variantdata = Range("A1:C10").Value ' 把 A1:C10 读进二维数组Range("E1:G10").Value = data ' 写回去
实战案例
案例 1:用一维数组统计一周销售额(简单)
功能说明:把周一到周日的销售额存进数组,然后计算总和与平均值。
代码:
Sub 统计一周销售额() Dim sales(1 To 7) As Double Dim total As Double Dim i As Integer ' 给数组赋值 sales(1) = 1200 sales(2) = 1500 sales(3) = 980 sales(4) = 2100 sales(5) = 1750 sales(6) = 2300 sales(7) = 1850 ' 用 For 循环求和 For i = 1 To 7 total = total + sales(i) Next i MsgBox "本周总销售额:" & total & vbCrLf & _ "平均销售额:" & Round(total / 7, 2)End Sub
操作步骤:
- 打开 Excel,按
Alt + F11 进入 VBA 编辑器。
案例 2:用二维数组处理成绩表(中等)
功能说明:把 A1:C5 区域的成绩表读进二维数组,给每个人的语文成绩加 5 分,再写回到 E1:G5。
操作前先在 Sheet1 输入以下数据:
代码:
Sub 二维数组处理成绩() Dim scores As Variant Dim i As Integer ' 把 A1:C5 读进数组 scores = Worksheets("Sheet1").Range("A1:C5").Value ' 给第 2 到 5 行的语文成绩加 5 分(语文在第 2 列) For i = 2 To 5 scores(i, 2) = scores(i, 2) + 5 Next i ' 写回到 E1:G5 Worksheets("Sheet1").Range("E1:G5").Value = scores MsgBox "成绩已处理,请查看 E1:G5 区域。"End Sub
操作步骤:
- 在 Sheet1 的 A1:C5 输入上面的成绩表。
- 查看 E1:G5,语文成绩已经加了 5 分,表头也一并复制过去了。
案例 3:用动态数组汇总不固定行数的销售数据(实用小案例)
功能说明:A 列有一列销售数据,行数不固定。用动态数组把数据装进去,再计算总和、平均值和最大单笔金额。
操作前在 Sheet1 的 A 列输入数据:
代码:
Sub 动态数组汇总销售数据() Dim sales() As Double Dim total As Double Dim avgValue As Double Dim maxValue As Double Dim i As Integer Dim count As Integer Dim lastRow As Long ' 找到 A 列最后一个非空行 lastRow = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row ' 第 1 行是表头,数据从第 2 行开始 count = lastRow - 1 ' 根据实际行数动态分配数组大小 ReDim sales(1 To count) ' 把 A 列数据读进数组 For i = 1 To count sales(i) = Worksheets("Sheet1").Cells(i + 1, 1).Value Next i ' 计算总和、平均值、最大值 total = 0 maxValue = sales(1) For i = 1 To count total = total + sales(i) If sales(i) > maxValue Then maxValue = sales(i) End If Next i avgValue = Round(total / count, 2) MsgBox "共 " & count & " 笔销售" & vbCrLf & _ "总销售额:" & total & vbCrLf & _ "平均销售额:" & avgValue & vbCrLf & _ "最大单笔:" & maxValueEnd Sub
操作步骤:
- 在 Sheet1 的 A1 输入「销售额」,A2 开始输入若干笔销售数据。
- 会弹出汇总结果。你可以随意增减 A 列的数据,再运行一次,结果会自动更新。
本篇小结
- 数组是「一组变量的集合」,一个名字可以管理多个数据。
- 一维数组适合一行或一列数据,二维数组适合表格型数据。
- 动态数组用
ReDim 在运行时决定大小,ReDim Preserve 可以保留已有数据。 - 数组配合
For 循环,可以批量处理大量数据,比单独变量高效得多。
下一篇内容预告
第 15 篇:错误处理——让代码遇到意外也不崩溃
我们将学习 On Error 语句,让代码在文件不存在、单元格为空、类型不匹配等意外情况下,能够优雅地处理错误,而不是直接弹出报错对话框。