志在指尖
用双手敲打未来

vba数组(操作方法详解)

vba数组

1.1什么是数组?
便是一组数/字符等用同一个姓名(这个姓名便是:数组名),作为一个全体存储在一起
1.2什么是元素
这些被保存在同一个数组名下的,多个内容,称为element元素
数组里的元素是能够重复的
1.3元素是怎么在数组内排序的?
数组是有序的
用什么来标识顺序呢?,便是index
index是一串接连的整数(也能够为负数),index有必要接连,整数,能够为正负
index默许是从0开端,可是不同的数组赋值办法会导致index初始为0,或1
index默许为0的情况:动态数组每一维的index都默许从0开端,dimarr1()或arr2=array(1,2,3)
index默许为1的情况:数组被excel目标赋值时默许从1开端,range()或[{1,2,3}]
index能够被控制,直接写arr(1to3)或optionbase1
2数组的生成
2.1数组的界说办法
Dimarr1’界说了一个变量
Dimarr2()’界说了一个动态数组,界说时严重改动,其中arr2便是数组名
Dimarr3(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等能够试试
能够试试rowcloumn,selection
3.2VBA原生数组分类
常量数组
静态数组
动态数组:动态数组的维数,长度都不确认
3.3数组按维度区别
区别的含义不是很大,一般都只用1维数组,2维数组,最多3维数组把。
1维
2维
3维
4用不同的办法界说和赋值数组
4.0数组名
不论经过界说dimarr1()
仍是经过赋值arr1=array()或arr1=range()
一旦arr1()成为数组,arr1等价于arr1()都表明这个数组
4.1先界说为变量,再赋值为数组
(假如没有optionexplict)
假如最初界说为变量
Dimarr1等价于dimarr1asvariant等价于先无界说
那么当变量被赋值为一个数组时
变量名arr1就成了数组名,arr1()就表明是数组了
当这个变量有又被赋值为其他内容时,就不再代表数组了
Subponyma_array101()
Dimarr1’界说了一个变量
arr1=Array(1,2,3,4,5)
‘赋值时,严重改动,arr1便是数组了,arr1也是数组名
‘运用array函数,结构一个1维数组,然后赋值给变量。默许是从index的0开端
Fori=0ToUBound(arr1,1)
Debug.Print”arr1的第”&i&”个元素是”&arr1(i),”i是index”
Next
Debug.Print””
k=0
ForEachiInarr1
Debug.Print”arr1的第”&k&”个元素是”&i,”可是k不是index”
k=k+1
Next
Debug.Print””
‘变量依然能够被赋值为其他内容
arr1=1
Debug.Print”arr1现在的的为”&arr1
EndSub
4.2界说为动态数组
我理解动态数组,dimarr1()是维度,长度都没确认的数组
要运用数组(也便是读,写的时分),数组有必要先界定维度和巨细。
如何先界说数组呢?
办法1:都先redim
办法2:直接给数组赋值(不光界定了维度和巨细,还赋值了)
redimarr2()的用法简直等价于arr2=array()赋值(赋值更进了一步)
动态数组的赋值
arr2=array(),或arr2=range()等等,各种数组赋值都能够
arr2=1是过错的,数组不能再被赋值为1个数值!只能是数组!
数组能够随意redim,改动维度,长度都能够
就像数组能够被覆盖赋值一样
除非redimpreserve要保存数组之前的值,就得让新redim的内容,包括之前的index规模!
Subponyma_array101()
Dimarr2()’界说了一个动态数组,界说时严重改动,其中arr2便是数组名
Dimarr20()
Dimarr30()
Dimarr40()
arr2=[{0,1,2,3,4,5}]
‘arr2()和arr2这2个不是一个东西?事实证明是一个东西
‘事实上不能一起声明dimarr2和arr2(),会报错重复声明
‘Debug.Printarr2(0)出错证明这种赋值,是从index1开端的,不是默许办法
Fori=1ToUBound(arr2,1)
Debug.Print”arr2的第”&i&”个元素是”&arr2(i),”i是index”
Next
Debug.Print””
k=1
ForEachiInarr2
Debug.Print”arr2的第”&k&”个元素是”&i,”可是k不是index”
k=k+1
Next
Debug.Print””
‘由于arr2现已数数组,不能直接把1个值,赋值给数组,数组名的
‘arr2=1
‘Debug.Printarr2
arr2()=Array(“a”,”b”,”c”)
‘arr2和arr2()是等价的
‘arr2==Array(“a”,”b”,”c”)
Fori=0ToUBound(arr2,1)
Debug.Print”arr2的第”&i&”个元素是”&arr2(i),”i是index”
Next
Debug.Print””
k=1
ForEachiInarr2
Debug.Print”arr2的第”&k&”个元素是”&i,”可是k不是index”
k=k+1
Next
Debug.Print””
‘不论数组里有没有赋值,只要不preserve,数组随便redim
‘redim功用,其实和全部重新赋值一样
‘写在这里会报错,后面这句arr20(1)=1’动态数组没赋值前,是不能操作array的读和写的
ReDimarr20(5)
ReDimarr20(1,7)
ReDimarr20(3)
arr20(1)=100
Debug.Printarr20(1)
arr20=Array(6,66,666)
Debug.Printarr20(1)
Debug.Print””
ReDimarr40(5)
arr40(1)=2
ReDimarr40(1,7)
arr40(1,1)=22
ReDimarr40(3)
arr40(1)=222
Debug.Printarr40(1)
‘假如redimpreserve,有必要让新的redim包括老的index规模
arr30=Array(10,20,30)
‘ReDimPreservearr30(0To2)这样会报错
ReDimPreservearr30(0To20)
Debug.Printarr30(0)
Debug.Print””
EndSub
[特别]redim还能够带参数,比方redim(k)
假如知道数组巨细,能够一次redim到位
合适不知道数组巨细时,还能够屡次redim
Subponyma_array101()
Dimarr5()
Dimarr6()
‘redim(k)说明redim能够带变量
‘两种redim都可行
Fori=0To10
ReDimarr5(i)’屡次redim,合适不知道数组巨细时
arr5(i)=i*i
Debug.Printarr5(i)
Next
Debug.Print”换行”;’不换行
Debug.Print””‘打印1个空格
Debug.Print””‘换行
Debug.Print’换行
ReDimarr6(10)’知道数组巨细,一次redim到位
Fori=0To10
arr6(i)=i*i
Debug.Printarr6(i)
Next
EndSub
动态数组,能够全体赋值,或单独赋值
动态数组,单独赋值前,有必要先界定好数组,比方redim或arr1=array等
动态数组,能够随意,全体赋值,改动数组内容。但不能被赋值为非数组的变量值等
静态数组
redim(5)
静态数组不能再被重新redim比方redim(3)会报错
5数组的遍历
5.0对数组的遍历存在2个思路
思路1:遍历index,然后查找对应的element
思路2:或许直接遍历element
遍历index真实保险的写法是
lbound()和ubound()其实都是取的index的上下规模
Fori=lbound(arr2,1)ToUBound(arr2,1)
Debug.printarr2(i)
next
5.1一维数组
Subponyma_array1()
‘先学习1维数组,和数组赋值,以及取1维数组index和element
Dimarr1’界说了一个变量
Dimarr2()’界说了一个动态数组,界说时严重改动,其中arr2便是数组名
Dimarr3(3)
arr1=Array(1,2,3,4,5)’赋值时,严重改动,arr1便是数组了,arr1也是数组名
‘运用array函数,结构一个1维数组,然后赋值给变量。默许是从index的0开端
Fori=0ToUBound(arr1,1)
Debug.Print”arr1的第”&i&”个元素是”&arr1(i),”i是index”
Next
Debug.Print””
k=0
ForEachiInarr1
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个不是一个东西?事实证明是一个东西
‘事实上不能一起声明dimarr2和arr2(),会报错重复声明
‘Debug.Printarr2(0)出错证明这种赋值,是从index1开端的,不是默许办法
Fori=1ToUBound(arr2,1)
Debug.Print”arr2的第”&i&”个元素是”&arr2(i),”i是index”
Next
Debug.Print””
k=1
ForEachiInarr2
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
Fori=0ToUBound(arr3,1)
Debug.Print”arr3的第”&i&”个元素是”&arr3(i),”i是index”
Next
Debug.Print””
k=0
ForEachiInarr3()
Debug.Print”arr3的第”&k&”个元素是”&i,”可是k不是index”
k=k+1
Next
Debug.Print””vba

vba数组操作方法详解

声明数组
由于数组也是变量,所以,你必须用声明其它变量的类似方法声明数组——运用Dim句子。当你声明一个数组时,你便设定了该数组贮存数据所需求的内存空间。
咱们来看看一个数组声明的比如:
Dimcities(6)AsString
DimdaysOfWeek(7)AsString
Dimlotto(6)AsInteger
Dimexchange(5,3)AsVariant
留意,变量称号后边带有括号以及括号里有数字。一维数组要求括号里带一个数字,这个数字决议了这个数组能够贮存的最大成员数。二维数组后边总是带有两个数字——第一个数字是行索引号,而第二个数字是列索引号。在上面的比如里,数组exchange最多能够贮存15个数据(5*3=15)。
数组声明的最终一部份是定义数组即将贮存数据的数据类型。数组能够贮存下列任何一种数据类型:Integer,Long,Single,Double,Variant,Currency,String,Boolean,Byte,orDate。
当你声明晰一个数组,VB会主动占据足够的内存空间,分配的内存空间取决于该数组的大小和数据类型。当你声明一个名叫lotto的带有6个成员的一维数组时,VB将留出12个字节——数组的每个成员各占2个字节(回想整型数据类型为2个字节,因而2*6=12)。数组越大,贮存数据需求的内存空间就越大。由于数组会吃掉许多内存,并因而影响你电脑的运转,因而,建议你仅仅根据你或许运用的成员数来声明数组。
数组的上界和下界
VBA默许将数组的第一个成员设置为0(索引号),因而,数字1代表数组中的第二个成员,而数字2则代表第三个,等等。由于数字编号起始于0,所以,一维数组cities(6)包含从0到6的七个成员。假如你甘愿从1开端计数你数组里的成员,那么你能够运用OptionBase1句子来强制指定该数组的下界。该指令必须置于VBA模块任何Sub句子上面的声明部分。假如你不清晰OptionBase1,那么VBA在运用数组是就会假定运用OptionBase0来从0开端编号你的数组成员。
你也能够让数组从除0或1之外的数字开端编号,要到达该意图,你在声明数组变量时就必须清晰该数组的边界。数组的边界是指它最小和最大的索引号。咱们来看看下面的比如:
Dimcities(3To6)AsInteger
上面的句子声明晰一个带有四个成员的一维数组。数组称号后边括号里的数字清晰了数组的下界(3)和上界(6)。该数组的第一个成员编号为3,第二个为4,第三个为5,以及第四个为6。留意下界和上界之间的关键字To。
技巧:数组规模
Dim句子清晰的数组的下标区间就称为数组的规模,例如:DimmktgCodes(5To15)
在VBA进程里运用数组
你声明晰数组后,就必须给该数组的每个成员赋值,这也经常成为“填充数组”。咱们来测验运用一维数组有规划地显现六个美国城市的清单:
1.打开一个新作业簿,并保存为Chap07.xls
2.切换到VB编辑器窗口,并从头命名VBA工程为Tables
3.刺进一新模块,从头命名为StaticArrays
4.输入下列进程FavoriteCities:
‘startindexingarrayelementsat1从1开端给数组成员编号
OptionBase1
SubFavoriteCities()
‘nowdeclarethearray
Dimcities(6)AsString
‘assignthevaluestoarrayelements
cities(1)=”Baltimore”
cities(2)=”Atlanta”
cities(3)=”Boston”
cities(4)=”Washington”
cities(5)=”NewYork”
cities(6)=”Trenton”
‘displaythelistofcities
MsgBoxcities(1)&Chr(13)&cities(2)&Chr(13)_
&cities(3)&Chr(13)&cities(4)&Chr(13)_
&cities(5)&Chr(13)&cities(6)
EndSub
在FavoriteCities进程开端之前,缺省的索引编号方法改动了,留意,OptionBase1句子是位于模块窗口Sub句子之上的。该句子告诉VB给数组的第一个成员赋值数字1,而不是缺省的0。
数组cities()声明为带六个成员的字符串类型变量。然后,给数组的每个成员都赋上了值。最终的句子运用Msgbox函数显现城市清单。当你运转该进程时,城市称号将会出现在分开的行上(参见图7-1)。你能够改动显现数据的次序,改动索引号。
Msgbox
图7-1你能够用Msgbox函数来显现一维数组的成员
5.运转FavoriteCities进程而且查看结果
6.修正FavoriteCities进程,让它逆序显现城市称号(从6到1)
技巧:数组成员的初始值
在给数组成员赋值之前,该成员具有缺省值。数字变量的缺省值为0,而字符串变量的缺省值为空字符串。

未经允许不得转载:IT技术网站 » vba数组(操作方法详解)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载