VBA 数组定义,赋值,一维数组

1VBA数组的基础定义

1.1什么是数组?

就是一组数/字符等用同一个名字(这个名字就是:数组名),作为一个整体存储在一起1.2什么是元素

这些被保存在同一个数组名下的,多个内容,称为element 元素数组里的元素是可以重复的1.3元素是怎么在数组内排序的?

数组是有序的用什么来标识顺序呢?,就是index index 是一串连续的整数(也可以为负数),index必须 连续,整数,可以为正负index默认是从0开始,但是不同的数组 赋值方式会导致index初始为0,或1index默认为0的情况:动态数组每一维的index都默认从0开始, dim arr1() 或 arr2=array(1,2,3)index默认为1的情况:数组被excel对象赋值时默认从1开始,range() 或 [{1,2,3}]index可以被控制,直接写 arr(1 to 3) 或 option base 1

2数组的生成

2.1数组的定义方式

Dim arr1 '定义了一个变量Dim arr2() '定义了一个动态数组,定义时重大变化,其中arr2就是数组名Dim arr3(3) '定义为静态数组

2.2数组的赋值方式

逐个赋值?? 有区别吗?静态数组的逐个赋值动态数组的逐个赋值

整体赋值整体赋值1:用array()函数进行整体赋值,arr1=array(1,2,3)整体赋值2:用[{}] 的表达式形式赋值,arr1=[{"a",2,3}]整体赋值3:用range,row, column等EXCEL的对象, 如 arr1=range("a1:a10")

3 数组的分类

3.1数组按来源分

VBA原生数组EXCEL对象的数组理论上,从EXCEL对象导入的range一定是二维数组

如果导入是cells等可以试试

可以试试row cloumn ,selection

3.2 VBA原生数组分类

常量数组静态数组动态数组:动态数组的维数,长度都不确定

3.3数组按维度区分

区分的意义不是很大,一般都只用1维数组,2维数组,最多3维数组把。

1维2维3维

4 用不同的方式 定义 和赋值 数组

4.0 数组名

不管通过定义 dim arr1() 还是通过赋值 arr1= array() 或 arr1=range()一旦arr1() 成为数组,arr1 等价于 arr1() 都表示这个数组

4.1先定义为变量,再赋值为数组

(如果没有option explict)如果最初定义为变量Dim arr1 等价于 dim arr1 as variant 等价于 先无定义那么当变量被赋值为一个数组时变量名arr1就成了数组名,arr1()就表示是数组了当这个变量有又被赋值为其他内容时,就不再代表数组了Sub ponyma_array101()

Dim arr1 '定义了一个变量

arr1 = Array(1, 2, 3, 4, 5)

'赋值时,重大变化,arr1就是数组了,arr1也是数组名

'使用array函数,构造一个1维数组,然后赋值给变量。默认是从index的0开始

For i = 0 To UBound(arr1, 1)

Debug.Print "arr1的第" & i & "个元素是" & arr1(i), "i是index"

Next

Debug.Print ""

k = 0

For Each i In arr1

Debug.Print "arr1的第" & k & "个元素是" & i, "但是k不是index"

k = k + 1

Next

Debug.Print ""

'变量仍然可以被赋值为其他内容

arr1 = 1

Debug.Print "arr1现在的的为" & arr1

End Sub

4.2 定义为动态数组

我理解动态数组,dim arr1() 是维度,长度都没确定的数组要使用数组(也就是读,写的时候),数组必须 先界定维度和大小。如何先定义数组呢?方法1:都先redim方法2:直接给数组赋值(不光界定了维度和大小,还赋值了)redim arr2() 的用法 几乎等价于 arr2=array() 赋值(赋值更进了一步) 动态数组的赋值arr2=array() ,或arr2=range() 等等,各种数组赋值都可以arr2=1 是错误的,数组不能再被赋值为1个数值!只能是数组! 数组可以随意redim,改变维度,长度都可以就像数组可以被覆盖赋值一样除非 redim preserve 要保留数组之前的值,就得让新redim的内容,包含之前的index范围!

Sub ponyma_array101()

Dim arr2() '定义了一个动态数组,定义时重大变化,其中arr2就是数组名

Dim arr20()

Dim arr30()

Dim arr40()

arr2 = [{0,1,2,3,4,5}]

'arr2() 和arr2这2个不是一个东西? 事实证明是一个东西

'事实上不能同时声明 dim arr2 和 arr2(),会报错重复声明

'Debug.Print arr2(0) 出错证明这种赋值,是从index1开始的,不是默认方式

For i = 1 To UBound(arr2, 1)

Debug.Print "arr2的第" & i & "个元素是" & arr2(i), "i是index"

Next

Debug.Print ""

k = 1

For Each i In arr2

Debug.Print "arr2的第" & k & "个元素是" & i, "但是k不是index"

k = k + 1

Next

Debug.Print ""

'由于arr2已经数数组,不能直接把1个值,赋值给数组,数组名的

'arr2 = 1

'Debug.Print arr2

arr2() = Array("a", "b", "c")

'arr2 和arr2() 是等价的

'arr2== Array("a", "b", "c")

For i = 0 To UBound(arr2, 1)

Debug.Print "arr2的第" & i & "个元素是" & arr2(i), "i是index"

Next

Debug.Print ""

k = 1

For Each i In arr2

Debug.Print "arr2的第" & k & "个元素是" & i, "但是k不是index"

k = k + 1

Next

Debug.Print ""

'不管数组里有没有赋值,只要不preserve,数组随便redim

'redim 功能,其实和全部重新赋值一样

'写在这里会报错,后面这句 arr20(1) = 1 '动态数组没赋值前,是不能操作array的读和写的

ReDim arr20(5)

ReDim arr20(1, 7)

ReDim arr20(3)

arr20(1) = 100

Debug.Print arr20(1)

arr20 = Array(6, 66, 666)

Debug.Print arr20(1)

Debug.Print ""

ReDim arr40(5)

arr40(1) = 2

ReDim arr40(1, 7)

arr40(1, 1) = 22

ReDim arr40(3)

arr40(1) = 222

Debug.Print arr40(1)

'如果redim preserve,必须让新的redim包含老的index范围

arr30 = Array(10, 20, 30)

'ReDim Preserve arr30(0 To 2) 这样会报错

ReDim Preserve arr30(0 To 20)

Debug.Print arr30(0)

Debug.Print ""

End Sub

[特别] redim 还可以带参数,比如 redim (k)

如果知道数组大小,可以一次redim到位适合不知道数组大小时,还可以多次redim

Sub ponyma_array101()

Dim arr5()

Dim arr6()

'redim(k) 说明redim可以带变量

'两种redim都可行

For i = 0 To 10

ReDim arr5(i) '多次redim,适合不知道数组大小时

arr5(i) = i * i

Debug.Print arr5(i)

Next

Debug.Print "换行"; '不换行

Debug.Print " " '打印1个空格

Debug.Print "" '换行

Debug.Print '换行

ReDim arr6(10) '知道数组大小,一次redim到位

For i = 0 To 10

arr6(i) = i * i

Debug.Print arr6(i)

Next

End Sub

动态数组,可以整体赋值,或单独赋值动态数组,单独赋值前,必须先 界定好数组,比如redim 或 arr1=array 等动态数组,可以随意,整体赋值,改变数组内容。但不能被赋值为非数组的变量值等

静态数组

redim (5) 静态数组不能再被重新redim 比如 redim(3) 会报错

5 数组的遍历

5.0 对数组的遍历存在2个思路

思路1:遍历index,然后查找对应的element思路2:或者直接遍历element

遍历index真正保险的写法是

lbound() 和 ubound() 其实都是取的 index的上下范围

For i = lbound(arr2,1) To UBound(arr2, 1)

Debug.print arr2(i)

next

5.1 一维数组

Sub ponyma_array1()

'先学习1维数组,和数组赋值,以及取1维数组index和element

Dim arr1 '定义了一个变量

Dim arr2() '定义了一个动态数组,定义时重大变化,其中arr2就是数组名

Dim arr3(3)

arr1 = Array(1, 2, 3, 4, 5) '赋值时,重大变化,arr1就是数组了,arr1也是数组名

'使用array函数,构造一个1维数组,然后赋值给变量。默认是从index的0开始

For i = 0 To UBound(arr1, 1)

Debug.Print "arr1的第" & i & "个元素是" & arr1(i), "i是index"

Next

Debug.Print ""

k = 0

For Each i In arr1

Debug.Print "arr1的第" & k & "个元素是" & i, "但是k不是index"

k = k + 1

Next

Debug.Print ""

'结论1:可以用变量,被赋值为一个数组

'获得数组元素的方法,可以遍历index,也可以直接遍历element

arr2 = [{0,1,2,3,4,5}]

'arr2() 和arr2这2个不是一个东西? 事实证明是一个东西

'事实上不能同时声明 dim arr2 和 arr2(),会报错重复声明

'Debug.Print arr2(0) 出错证明这种赋值,是从index1开始的,不是默认方式

For i = 1 To UBound(arr2, 1)

Debug.Print "arr2的第" & i & "个元素是" & arr2(i), "i是index"

Next

Debug.Print ""

k = 1

For Each i In arr2

Debug.Print "arr2的第" & k & "个元素是" & i, "但是k不是index"

k = k + 1

Next

Debug.Print ""

arr3(0) = 99

arr3(1) = 1

arr3(2) = 2

arr3(3) = 3

For i = 0 To UBound(arr3, 1)

Debug.Print "arr3的第" & i & "个元素是" & arr3(i), "i是index"

Next

Debug.Print ""

k = 0

For Each i In arr3()

Debug.Print "arr3的第" & k & "个元素是" & i, "但是k不是index"

k = k + 1

Next

Debug.Print ""

End Sub

二维数组

上一篇: 日本海淘 资生堂ELIXIR怡丽丝尔 营养抗皱眼霜15g 特价6264日元
下一篇: 《觅长生》道侣玩法详解 NPC答题攻略

相关推荐

开车省油16个技巧,自动挡怎样开出低油耗
传奇试穿!托雷斯、德罗巴、大罗、小罗上身新赛季球衣
选购指南|新5系选哪个颜色不会出错🤔
【杭州山水行画室】学费_地址_怎么样?
三国游戏
高清:世界杯历史经典点球大战 巴乔错失最后点球