动态类型一时爽,代码重构火葬场。

虽然我并没有很好的理解这句话的意思,不过在经历过的VBA开发过程中,已经体会到了动态类型的可怕之处:明明跑了无数次的代码,突然就报错了,调试模式一看,这玩意怎么会是这个值,哪里来的?!

今天我就来讲讲VBA的可变类型Variant的一些用法和注意事项。

刚接触VBA的时候,在VBA中创建数组是一个麻烦的事情,尤其是要把单元格区域的值批量赋值给数组的时候,只要是声明好的数组,就只能一个一个地给数组赋值。

后来,就知道了一个简单粗暴的方法:

dim arr
arr=Range("A1:B12")

通过这个方法,能够一次性的将单元格区域转化为数组赋值给arr。同样的,用split函数同样可以返回数组赋值给一个可变类型,而你提前声明好的数组却不能用。

动态类型使用姿势1:

一个变量声明时若没有指定类型,则默认为Variant,你能够给它赋任何类型的数据,也能够在任何时间给它赋其他类型的数据并修改其类型。

这个性质可以在处理数据的时候加以利用,利用同一个变量就实现数据类型的转化,不用声明一堆变量。

动态类型使用姿势2:

一个数组声明时若未指定类型,则默认为Variant,这样的数组能够放入任何类型的数据,同一个数组内也可以存在多种类型的数据,不像C++那样,一个数组只能存放一种类型的数据。

这一性质在处理数据的时候能够带来极大的方便:字符串类型和数值类型存在于同一数组内,可以直接对数据进行处理并输出,不用特意去分割处理相关联的不同类型数据。这个性质实在是方便,是我最常用的性质,以至于我刚转到C++时因为不同数据不能混放而感到不方便,当然,习惯了之后C++还是很强大的。

动态类型使用姿势3:

一切未制定类型的变量都是Variant,可以放入任何数据,包括数组、对象等等。

这是一个神奇的性质,理论上来说,是要函数能够返回的数据,无论是单个的数据、数组、对象还是什么其他结构,都能赋值给可变类型,我们能在一个变量中放入一个数组、一个对象(当然,放对象时要用set),这样就产生了一些神奇的操作:数组里面存放的是数组,字典里面也可以存放数组,数组里面还可以放字典,字典里也可以放字典,只有想不到没有做不到。例如:

dim arr1(1 to 10)
dim arr2(1 to 10)
dim i as integer
for i=1 to ubound(arr1)
    arr1(i)=arr2	'每个arr1()的成员都是一个数组
next i
'此时arr1是一个存着10个数组的数组,使用方法如下
arr1(1)(2)=1
'这跟VBA的二维数组是不同的,更接近于C/C++中的二维数组,即嵌套数组的数组
dim arr3(1 to 10,1 to 10)	'VBA的二维数组是这样声明的:
arr3(1,2)=1	'使用方法也更直观

正是这些乱七八糟的用法,使得我们能够非常方便的创建我们想要的数据结构,以各种奇怪的姿势存储数据而不是想C++中非要创建一个class/struct。

当然,也正是这样灵活的性质,使得我们在使用时不得不确保它就是我们想要的数据类型,因为我们是在这个基础上进行编程的,如果出现了意料之外的数据而我们没有进行处理的话,程序在后面的处理中就会崩溃,所以,在必要的地方加上数据类型验证、对可能出现的意外数据类型进行处理,以便下面的程序能够正常运行。

以上。

本来想写写我在使用excel过程中的心得体会的,结果想写的时候才发现什么都想不起来,所以就把VBA的东西也写进来吧,想到什么写什么了,最近要教新人学VBA,应该会有点东西写。