相关文章推荐
买醉的仙人球  ·  sqlcmd 实用工具 - SQL ...·  8 月前    · 
热情的便当  ·  Azure AD Connect:排查 ...·  1 年前    · 
冷静的米饭  ·  SpringBoot 1.X到2.X ...·  1 年前    · 
VBA学习笔记19:数组1

VBA学习笔记19:数组1

学习资源:《Excel VBA从入门到进阶》第20集 by兰色幻想

一、什么是VBA数组?

VBA数组就是储存一组数据的数据空间,数据类型可以数字,可以是文本,可以是对象,也可以是VBA数组。

有点像之前的Union:将多个非连续区域连接起来成为一个区域,从而可以实现对多个非连续区域一起进行操作,但union一次性处理30个以上的不连续区域,读写速度就会下降很多,可通过反复读写来解决。

而数组的大小是自己定义的,目前听课下来是没有限制定义大小。

关于数组的特点,老师做了以下对比演示:

v4:直接调用 内存中的值 运算,让变量m=m+1000,运行时间:0.01s

v5:调用 单元格中的值 进行运算,让变量m=m+cells(1,1),运行时间:1.5s

直接调用内存运行时间更快,这就是为什么要使用数组的原因。

v5实际运行时间比老师写的还慢233333


二、数组存在形态

VBA数组是以变量形式存放的一个空间,它也有行有列,也可以是三维空间。

1) 常量数组

array(1,2)

array(array(1,2,4),array("a","b","c"))

2) 静态数组

x(4) 有5个位置,编号从0~4

arr(1 to 10) 有10个位置,编号1~10

arr(1 to 10,1 to 2) 10行2列的空间,总共20个位置,这是二维数组

arr(1 to 10,1 to 2,1 to 3) 三维数组,总10*2*3=60个位置。这是三维数组

3)动态数组

arr() 不知道有多少行多少列

(使用动态数组后,在得知数组长度要重新声明数组大小)


三、读入数组

1、按编号(标)写入和读取

①写入一维数组

Sub t1()
'定义一维静态数组,有10个位置,编号1~10
Dim arr(1 To 10)
Dim x As Integer
'利用循环把单元格依次放入数组
For x = 1 To 10
    arr(x) = cell(x, 1) * 100
Next x
'或者直接把常量/变量数值放入数组   
arr(2) = 190
arr(10) = 5
End Sub

②向二维数组写入数据和读取

Sub t2()
'定义二维静态数组,有5行四列,20个位置
Dim x As Integer, y As Integer
Dim arr(1 To 5, 1 To 4)
'利用循环把单元格依次放入数组
For x = 1 To 5
    For y = 1 To 4
        arr(x, y) = Cells(x, y)
    Next y
Next x
'或者直接把常量/变量数值放入数组   
arr(2,1) = 190
MsgBox arr(3, 1)
End Sub

2、动态数组

Sub t3()
'定义动态数组
Dim arr()
Dim row
Dim x As Integer
'获取到行后重新声明数组大小
row = Sheets("sheet2").Range("a65536").End(xlUp).row - 1
ReDim arr(1 To row)
'利用循环把单元格依次放入数组
For x = 1 To row
    arr(x) = Cells(x, 1)
Next x
MsgBox arr(3)
End Sub

3、批量写入

①由常量数组导入,不定义变量类型,直接赋值静态数组,变量就被定义为数组。

Sub t4() 
Dim arr
arr = Array(1, 2, 3, "a")
End Sub

②由单元格区域导入

Sub t5()
Dim arr