网站首页 > 基础教程 正文
在Excel VBA编程中,数组允许在一个变量中存储大量数据,从而减少了变量的数量和代码的复杂性,更加高效的处理数据。 本文将介绍VBA数组的基本概念、创建方法、动态数组的使用,如何进行数组运算以及数组的实际应用。
一、数组简介
在VBA中,数组是一种数据结构,可以使用单个变量名引用一系列值。这些值通过索引进行访问,索引通常是整数,用于标识数组中的每个元素的位置。 数组可以分为静态数组和动态数组两种。静态数组在声明时大小固定,而动态数组可以在运行时改变大小。
二、创建数组
使用Array函数创建数组
Dim arr(1 To 3) As Variant
arr = Array(0, 1, 2)
- 创建了一个包含3个整数的一维数组。
使用Split函数创建数组
Split函数可以根据指定的分隔符将一个字符串分割成数组。例如:
Dim arr As Variant
arr = Split("VBA,Python,SQL", ",")
- 根据逗号将一个字符串分割成了三个字符串的数组。
通过单元格区域创建数组
如果你需要将Excel工作表中的一个区域的数据快速转换为数组,可以直接使用范围对象:
Dim arr As Variant
arr = Range("A1:B3").Value
- 将把A1:B3范围内的数据存储到数组arr中。
使用For循环创建数组
使用For循环逐个赋值给数组元素。这在你知道数组的大小和内容时是一种有效的方法。例如:
Dim arr(1 To 3) As Integer
Dim i As Integer
For i = 1 To 3
arr(i) = i
Next i
三、动态数组
动态数组允许你在运行时改变数组的维度和大小,这在使用前无法预知数据量的情况下非常有用。
使用ReDim重新定义数组大小
Dim arr() As Variant
ReDim arr(1 To a)
- 其中a是一个变量,表示数组的新大小。
使用Preserve关键字保留原有值
如果你更改数组的元素个数,但希望保留原有值,可以使用ReDim Preserve`:
ReDim Preserve arr(1 To a)
- ReDim默认会重置已有的元素值,而ReDim Preserve不会。
四、数组运算
VBA数组支持多种运算,包括算术运算、比较运算和函数应用等。
Dim arr1(1 To 5) As Integer, arr2(1 To 5) As Integer, arr3(1 To 5) As Integer
For i = 1 To 5
arr1(i) = i * 2
arr2(i) = i * 3
arr3(i) = arr1(i) + arr2(i)
Next i
使用UBound和LBound函数
UBound和LBound函数可以分别获取数组的上界和下界:
Dim arr As Variant,upperBound As Integer
arr = Array(1, 2, 3, 4, 5)
upperBound = UBound(arr)
通过UBound和LBound可以计算数组的长度:
Dim length As Integer l
ength = UBound(arr) - LBound(arr) + 1
使用Transpose函数转置数组
Transpose函数可以将数组的行和列互换:
Dim arr As Variant, arrTransposed As Variant
arr = Range("A1:B3").Value
arrTransposed = Application.WorksheetFunction.Transpose(arr)
五、实际应用
下列代码展示了如何有效地使用VBA中的数组来处理和筛选Excel中的数据,通过将数据从工作表读取到数组中,减少了对Excel工作表的直接操作次数, 可以显著提高宏的运行速度,尤其是在处理大量数据时。
- 通过单元格区域创建数组:arr = Range("A2:A" & lastRow).Value
- 使用For循环结合LBound和UBound函数遍历数组:For i = LBound(arr, 1) To UBound(arr, 1)
- 使用ReDim来调整数组的大小,根据符合条件的元素数量进行初始化:ReDim resultArr(1 To j, 1 To 1)
- 将符合条件的数值存储到结果数组中:resultArr(j, 1) = arr(i, 1)
- 使用Resize方法来确定目标范围的大小,以匹配筛选后的结果数组的行数和列数:Range("B" & resultRow).Resize(j, UBound(arr, 2)).Value = resultArr
Sub FilterArray()
Dim i As Long, j As Long, lastRow As Long, resultRow As Long
Dim arr As Variant ' 声明一个Variant类型的数组,用于存储列A的数据
Dim resultArr() As Variant ' 声明一个动态Variant类型的数组,用于存储筛选后的结果
' 获取列A最后一个非空单元格的行号
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
' 通过单元格区域创建数组
' 将列A的数据存储到数组arr中,提高数据处理效率
arr = Range("A2:A" & lastRow).Value
' 初始化用于计数符合条件的数值的变量j
j = 0
' 遍历数组arr,统计所有符合要求的数值数量
For i = LBound(arr, 1) To UBound(arr, 1) ' LBound函数获取数组的下界,UBound函数获取上界
If arr(i, 1) > 10 Then j = j + 1
Next i
' 如果没有符合条件的数值,则直接退出子程序
If j = 0 Then Exit Sub
' 使用ReDim根据统计的个数初始化结果数组
ReDim resultArr(1 To j, 1 To 1)
' 重置计数器j,准备填充结果数组
j = 0
' 再次遍历数组arr,将符合条件的数值存储到结果数组中
For i = LBound(arr, 1) To UBound(arr, 1)
If arr(i, 1) > 10 Then
j = j + 1
resultArr(j, 1) = arr(i, 1)
End If
Next i
' 确定结果输出的起始行号,即B列最后一个非空单元格的下一行
resultRow = Cells(Rows.Count, "B").End(xlUp).Row + 1
' 使用Range对象和Resize方法确定目标范围的大小,以匹配筛选后的结果数组的行数
Range("B" & resultRow).Resize(j, UBound(arr, 2)).Value = resultArr ' 将结果数组赋值到工作表的指定范围
End Sub
猜你喜欢
- 2024-10-18 一对多查询,Vlookup,Filter,Textjoin公式,你喜欢哪种
- 2024-10-18 Excel函数:office 365新增筛选函数FILTER的打开方式
- 2024-10-18 Excel中CHOOSECOLS+FILTER函数组合有妙用,新手必备!
- 2024-10-18 鸟枪换大炮,Excel查找的另一个函数——Filter函数
- 2024-10-18 Excel数组公式与自动溢出 excel数组公式与自动溢出的区别
- 2024-10-18 学习VBA,报表做到飞 第二章 数组 2.6 清空数组与嵌套数组转换
- 2024-10-18 spring boot 如何统一处理 Filter、Servlet 中的异常信息
- 2024-10-18 前端开发中操作数组最常用的16个方法
- 2024-10-18 FILTER函数一对多筛选 filter过滤多个条件
- 2024-10-18 Linux 网络层收发包流程及 Netfilter 框架浅析
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)