官方文档:
https://docs.microsoft.com/zh-cn/office/vba/language/glossary/vbe-glossary#array
数组
一组顺序索引的元素,这些元素具有相同的内在数据类型。 数组的每个元素具有唯一的识别索引号。 对数组的一个元素进行的更改不会影响其他元素。
1、数组特点
从文档中可以看到,数组的几个特点:
- 具有相同的内在数据类型
- 每个元素具有唯一的识别索引号
这2点很好理解,1个数组里面只能存放一种数据类型的东西,每个元素都能通过索引号找到。
但是还有一点,数组使用的时候,我们必须要明确定义出他的大小,也就是能容纳的元素个数。
文档中描述的比较简单,其实我们可以这样去理解数组,就像我们数学里学过的集合,数组就类似集合的意思。
2、数组的作用
当你能写一点像模像样的小程序的时候,你将会发现离开了数组都没法写代码了。
数组真是太重要了,用起来也非常的简单。能很好的帮助我们管理程序所需要的数据,一旦程序复杂一点,处理的数据多了,必然会用到数组。
比如你写个程序,要处理1000个数据,我们不可能去写1000个变量去处理,我们需要的是用1个数组来存储数据。
代码语言:javascript复制Dim Arr(999) As Long
像这个,就是定义了一个变量Arr,它是一个能存储1000个Long类型的数组。一定要记住,默认数组的下标(可以理解就是开始的编号)是0开始的。Excel VBA提供了修改为1的方法,强烈建议不要用这个方法,尽量去习惯这个下标0。
(个人看法):这种设计应该也是为了照顾非专业人员吧,毕竟人还是习惯从1开始的。不过以后程序写多了,你会发现从0开始在一些循环、取余数等等操作中还是非常方便的。
要使用数组中的某个元素也非常的简单,直接引用它的下标就可以,比如我们给下标10的元素赋值1000:
代码语言:javascript复制Arr(10) = 1000
很简单方便,不过这是任何一个语言的数组都有的功能,在Excel VBA里,使用数组最方便的是它和单元格对象很好的联系在了一起,2个东西相互赋值非常的方便。
3、举例:
继续说Function里面的例子,我们当时是用For循环从1到100的一个一个的读取单元格的数据来处理,这种处理方法在碰到数据量比较大的时候,你会明显感觉到程序的运行速度很慢,这是因为VBA处理Range对象的时候,一个一个的读取是非常慢的,因为每一个Range对象其实它都有很多的方法和属性,而我们需要的只是它的Value属性。就像我们只需要1棵树,却要操作整个森林,这对程序的运行速度影响是非常大的。
其实Excel VBA已经帮我们做好了一个好的方法,那就是用数组一次性的把Range对象的Value属性读取出来。
我们要处理的单元格范围是A1到B100,如果你使用过Excel的函数的话,应该知道,我们要在公式里引用A1到B100的话,只需要用鼠标点击A1,再拉到B100就可以,在公式的编辑框里出现的就是A1:B100的形式。如果你熟悉这种表示方式了,那VBA里的表示方式你也就会了,几乎是一样的,VBA里的表示方式是:Range("A1:B100"),可以说是一样吧。
好了,我们知道了一个单元格范围的VBA对象表示方式,那如何赋值给一个数组呢。
如果你已经看过一些官方的文档,应该发现确实很简单:
代码语言:javascript复制Dim Arr() As Variant
Arr = Range("A1:B100").Value
为什么声明的是存储Variant类型的数组?
首先这是这种赋值的硬性规定,它内部如何实现的我们并不知道。
然后我们可以这样去想,因为Excel单元格是可以存储任何数据的,所以要把Excel单元格的数据放到数组里去,这个数组自然要能存储任意类型了,所以用Variant就很正常了。
就这么一个声明语句,一条赋值语句就把一个范围的单元格Value属性读取到了一个数组。
(个人看法):但是这里希望初学者能够认识到一点点,这种操作这么方便,主要原因是微软在Excel VBA里帮忙做好了,真正的编程绝对不是这样的,这个虽然很方便,而且在VBA里有很多这种封装好了的东西,给使用者带来了极大的便利,但是,这也是有坏处的,这种过度的封装(而且我们看不到源码),让我们这些使用者对底层的一些知识一无所知。
得到了数组,我们先要知道得到的这个数组是个什么情况:
- 如果是单个单元格会出错
- 得到二维数组
- 数组的下标等于1
二维数组的引用方法你就想像它是个Excel表,你想引用第8行,第2列的数,数组表示方法就是:Arr(8, 2) 注意这个是下标等于1的
好了,这个时候我们再用循环语句处理数组,处理的方法和直接用Range对象是差不多的,处理完成后,我们又需要把数组里的数据赋值到单元格里去,还是非常的简单,只要把前面那条语句的左右2边换个位置就可以了,是不是太方便了:
代码语言:javascript复制Sub TestArr()
Dim Arr() As Variant
Arr = Range("A1:B100").Value
Dim i As Long
For i = 1 To 100
Arr(i, 2) = OddOrEnev(VBA.CStr(Arr(i, 1)))
Next
Range("A1:B100").Value = Arr
End Sub
Function OddOrEnev(lValue As Long) As String
If lValue Mod 2 = 1 Then
OddOrEnev = "奇数"
Else
OddOrEnev = "偶数"
End If
End Function
3、小结
简单了解了一下数组这个东西,并讲到了数组与Range的交互,一个在Excel VBA里帮我们封装的非常好的东西,我们在Excel里使用VBA,很多时候都是操作Range,而数组起到了一个很好的中间转换作用。
但是,再次强调一点,真正的编程没有这么简单。