数组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,而数组起到了一个很好的中间转换作用。
但是,再次强调一点,真正的编程没有这么简单。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- pytorch实现查看当前学习率
- python3.x中安装web.py步骤方法
- pytorch 网络参数 weight bias 初始化详解
- PHP中单例模式的使用场景与使用方法讲解
- pytorch查看模型weight与grad方式
- php+ajax 文件上传代码实例
- PHP将整数数字转换为罗马数字实例分享
- PHP如何通过表单直接提交大文件详解
- PHP基于openssl实现的非对称加密操作示例
- python图片验证码识别最新模块muggle_ocr的示例代码
- virtualenv介绍及简明教程
- Keras 数据增强ImageDataGenerator多输入多输出实例
- TensorFlow中如何确定张量的形状实例
- 使用Dajngo 通过代码添加xadmin用户和权限(组)
- python和js交互调用的方法