数组Array

时间:2022-07-22
本文章向大家介绍数组Array,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

官方文档:

https://docs.microsoft.com/zh-cn/office/vba/language/glossary/vbe-glossary#array

数组

一组顺序索引的元素,这些元素具有相同的内在数据类型。 数组的每个元素具有唯一的识别索引号。 对数组的一个元素进行的更改不会影响其他元素。

1、数组特点

从文档中可以看到,数组的几个特点:

  • 具有相同的内在数据类型
  • 每个元素具有唯一的识别索引号

这2点很好理解,1个数组里面只能存放一种数据类型的东西,每个元素都能通过索引号找到。

但是还有一点,数组使用的时候,我们必须要明确定义出他的大小,也就是能容纳的元素个数。

文档中描述的比较简单,其实我们可以这样去理解数组,就像我们数学里学过的集合,数组就类似集合的意思。

2、数组的作用

当你能写一点像模像样的小程序的时候,你将会发现离开了数组都没法写代码了。

数组真是太重要了,用起来也非常的简单。能很好的帮助我们管理程序所需要的数据,一旦程序复杂一点,处理的数据多了,必然会用到数组。

比如你写个程序,要处理1000个数据,我们不可能去写1000个变量去处理,我们需要的是用1个数组来存储数据。

Dim Arr(999) As Long

像这个,就是定义了一个变量Arr,它是一个能存储1000个Long类型的数组。一定要记住,默认数组的下标(可以理解就是开始的编号)是0开始的。Excel VBA提供了修改为1的方法,强烈建议不要用这个方法,尽量去习惯这个下标0。

(个人看法):这种设计应该也是为了照顾非专业人员吧,毕竟人还是习惯从1开始的。不过以后程序写多了,你会发现从0开始在一些循环、取余数等等操作中还是非常方便的。

要使用数组中的某个元素也非常的简单,直接引用它的下标就可以,比如我们给下标10的元素赋值1000:

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对象表示方式,那如何赋值给一个数组呢。

如果你已经看过一些官方的文档,应该发现确实很简单:

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边换个位置就可以了,是不是太方便了:

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,而数组起到了一个很好的中间转换作用。

但是,再次强调一点,真正的编程没有这么简单。