关于EXCEL中VBA的数组理解_第1页
关于EXCEL中VBA的数组理解_第2页
关于EXCEL中VBA的数组理解_第3页
关于EXCEL中VBA的数组理解_第4页
关于EXCEL中VBA的数组理解_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、关于EXCEL中VBA的数组理解一、什么是VBA数组不要把VBA数组想的太神秘,它其实就是一组数字而已。把一组 数按行、列排在一起,放在内存中。就是一个VBA数组。二、数组的维数数组的维数其实和文件管理的目录一样的,只有一层时就是一维。 如果有两层则是二维数组(有行有列为二维),如果有三层,则 是三维数 组。VBA中支持13维数组运算。Sub数组示例0Dim x As Long, y As LongDim arr(1 To 10, 1 To 3)'创建一个可以容下10行3列的数组空间For x = 1 To 4For y = 1 To 3arr(x, y) = Cells(x, y),

2、通过循环把单元格区域a1 :c4的数据装进数组中Next yNext xMsgBox arr(4, 3),根据提供的行数和列数显示数组arr(1,2)="我改一下试试你可以随时修改数组内指定位 置的数 据MsgBox arr(1,2)End Sub总结:二维是由行和列表示的数组,如ARR(3,2)表示数组中第3 排第2列的元素。而一维数组只是由一个元素决定,如ARR( 4)表 示数 组中第4个元素三、把单元格数据搬入内存:、声明:Dim arr as Variant'声明一个变量,不能声明其他数据类 型Dim arr(1 to 10, 1 to 2 ),这种声明也是 错误 的

3、,固定大小的VBA数组是不能一次性装入单元格数据或:dim arr()这种声明方式是声明一个动态数组,也可以装入单元格区域,构成一个VBA数组。二、装入arr =range("a9:c100")'装入很简单,变量=单元格区域三、读出装入数组后的单元格数值,可以按数组名称(行数,列数)直接 读取该位置的值,如下面的代码。Msgbox arr(3,2),就可以取出搬过去的而构成的数组第3行第2列的内容四、示例Sub s3()Dim arr(),声明一个动态数组(动态指不固定大小)Dim arr1 '声明一个Variant类型的变量arr = Range(&quo

4、t;a1 :c7")'把单元格区域A1 : C7的值装入数组arrarr1 = Range("a1 :c7")'把单元格区域A1 : C7的值装入数组arr1MsgBox arr(1, 1) '读取arr数组中第1行第1列的数值MsgBox arr1 (2, 3) '读取arr1数组的第2行第3列的数 值End Sub四、把内存数据搬入单元格Sub test() 1声明一个变量用来盛放单元格数据Dim arrDim x As Integerarr = Range("a2:d5")'把单元格数据搬入到arr

5、里,它有4列4行For x = 1 To 4 '通过循环在arr数组中循环arr(x3 4) = arr(x, 3) * arr(x, 2)'数组的第 4列(金额”第3列*第2例Next xRange(匕 2:d5")= arrEnd Sub'把数组放回到单元格中Sub testl ()Dim arr(1 To 5/声明一维数组For x = 1 To 5 arr(x) = x * 2 '通过循环给每个位置赋值Next xRange("A1:E1") = air'把数组导入至!J excel中的a1 :e1单元 格中Rang

6、e(HA1 :A5n) = Application.T ranspose(arr)1 如果是放在一列中,就需要对数组进行转置后再存放End Sub五、动态数组的声明Sub darr()Dim arr()'声明一个动态的arr数组(不知道它能盛多少数 据)Dim kk = Application.WorksheetFunction.Countlf(Range(na2:a6 计算大于10的个数ReDimarr(1 T。k),再次声明arr的大小,正好盛下k数量 的值For x = 2 To 6If Cells(x, 1) > 10 Then m = m + 1arr(m) = Cel

7、ls(x, 1),通过循环把大于10的数字装入数组End IfNext xMsgBox arr(2)End Sub六、数组的上标(旧OUND)和下标(UBOUND)arK-19to8)这个数组的编号就是从-19开始的.那么它的 最小编 号就是-19,最大编号是8,如果用语句返回就是:Subt1()Dim arr(-19 To 8)MsgBox UBound(arr),返回最大编号,结果为8MsgBox LBound(arr),返回最小编号,结果为-19End Sub如果是有行列组成的二维数组呢?二维数组返回行的下标 和列的下标见下例Sub t2()Dim arr(-19 To 8, 2 To

8、5)MsgBox UBound(arr),返回第1维(行的)最大编号,结果为8MsgBox LBound(arr),返回第1维(行的)小编号,结果为-19MsgBox UBound(arr, 2),返回第2维(列的)最大编号,结果为5MsgBox LBound(arr, 2),返回第2维(列的)最小编号,结果为2 EndSubarr = Sheets(1 ).UsedRange Usedrange 的行数和列数是未知MsgBox UBound(arr, 1) ,可以计算这个区域有多少行MsgBox UBound(arr, 2)1可以计算出这个区域有多少列End Sub1维常量数i 2维常量数A

9、PT ray(ncn3 30)七、使用Array函数创建常量数组:使用Array函数创建数组Array (“A JC”)Array(Array(Han, 10), Array”,20), Ar也可以调用excel工作表内存数组:1 维数量:JC”2 维数量:Han510;nbH,20;HcH,30内存常量数组有什么作用呢?1、简化赋值比如:我需要给数组arr分别赋值10 ,20,30,40 ,一般就需要分 别赋值,即:arr(1)=10arr(2)=20arr(3)=30arr(4)=40而使用常量数量,只一句话:arr=array(10,20,30,40)2、调用工作表函数时使用:arr =

10、 匕”,10;W,20;“c“,30Sub mylook()Dim arrMsgBox Application.VLookup("b", arr, 2, 0) okup 时可以 调用 vlo 作为第二个参数End Sub八、数组的合并和字符串拆分(Join & Split ):多个字符的合并和字符串按规律的拆分是经常遇到的,如:A-REW-E-RWC-2-RWC分隔符-拆分成6个字符放在一个数组中 有一组数array(23,45,7,1,76)想用分隔符-连接成一个字符串上面两种 情况VBA提供了一对函数,即:split (字符串,"分隔符")拆

11、分字符串join(数组,"分隔符")用分隔连接数组的每个元成一个字 符串Subt1()Dim arr, myst As Stringmyst = "A-REW-E-RWC-2-RWC"arr = Split(myst,'按-分隔成一组数装入数组中,MsgBox arr(O),显示数组的第一个数(分隔后的数组最小 下标 为0,不是1),显示结果为AMsgBox Join(arr, ";')'再用把数组的每个值连接成一个字符串,结果为"A,REW,E,RWC,2,RWC"End Sub值得注意的是:spl

12、it和join只能对一维数组进行操作, 如果是单元格或二维数组怎么办?只有一条途径,想办法转换为一维数 组:Sub t2()Dim ARRARR = Application.Transpose (Range("a1 :a3")'用转置的 方 法,把单元格一列数据转换成一维数组MsgBox Join(ARR,End Sub九、Filter函数实现数组筛选:数组的筛选就是根据一定的条件,从数组中筛选符合条件的值,组成一个新的数组,实现数组筛选的 VBA函数是:Filter函数用法:Filter(数组,筛选的字符,是否包含)Sub DD()arr = Array(”ABC

13、“,“D' “CA“,“ER”)arrl = VBA.Filter(arr, "A", True),筛选所有含 A 的数值组成一个新数组arr2 = VBA.Filter(arr, "A", False)'筛选所有不含 A 的数值组成一个新数组MsgBox Join(arr2,查看筛选的结果End Sub遗憾的是函数只能进行模糊筛选,不能精确匹配。他山之石,可以攻玉,VBA中除可以利用的VBA函数外,还可以 调用众多的Excel工作表函数对数组进行分解、查询和分析等,调用 工作表函数可以省去循环判断的麻烦,进而提高运行效率。一、数组的最值

14、1、Max 和 Min工作表函数Max和Min是求最大值和最小值的函数,同样在 VB A中也可以求数组的最大值和最小值。如:Sub t()arr = Array(1,35, 4, 13)MsgBox Application. Max(arr)1 最大值MsgBox Application. Min(arr)* 最小值End Sub2、large 和 small工作表函数large和small是返回一组数的第N大和第N小,对 VBA数组同样适用,如:Subt1()arr = Array(1,35, 4, 13)MsgBox Application. Large (arr, 2) ,第 2 大值M

15、sgBox Application. Small (arr, 2) ,第 2 小值 End Sub二、数组的统计与求和1、SumSum函数可以在工作表中求,同样也可以对VBA数组求和,如:Sub t2()arr = Array(1,35, 4, 13)MsgBox Application.Sum(arr), 对数组进行求和End Sub2、Count 和 CountaCount和Counta可以统计数组中数字的个数和数字+文本的个 数。Sub t3()arr = Array(1,35, HaH, 4, 13, "b")MsgBox Application.Count(arr

16、)1 返回数字的个数 4MsgBox Application.CountA(arr)'返回数组文本和数字的总个数End Sub三、数组的查询和拆分1 ' Mach查询数组Match函数可以查询一个指定值在一组数中的位置,它也可以用 于VBA数组的查询。如:Sub t4()arr = Array(1,35, 4, 13)MsgBox Application.Match(4, arr, 0), 查询数值 4 在数组Arr中的位置End Sub2、Index拆分数组数组的拆分在VBA中是一个难题,如果是按行拆分数组,除了用 循环外也只能借用API函数完成了。幸好我们可以借用工作表函数

17、 index达到按列拆分数组,即多列构成的数组,你可以任意拆分出一列构 成新的数组。方法是:Application. Index(数组,列数),例:Sub t2()arr2 = Range("A1 :B4")'把单元格区域A1 : B4的值装入数组arr2arr3 = Application.Index(arr2, , 2), 把数组第 2 歹(J拆分出来装入新数组arr3中,新数组为二维数组MsgBox arr3(2, 1),取出新数组第2行的值End Sub四、数组维数的转换Transpose转置数组在工作表中可以把行列转换。在VBA中同样 也可以做到转换的效果。1、一维转二维。Sub t9()arr = Array(1,35, Han, 4, 13, HbH)arr1 = Application.Transpose(arr)MsgBox arr1(2, 1)'转换后的数组是1列多行的二维数组End Sub2、二维数组转一维。Sub t2()arr2 = Range(nA1 :B4n)arr3 = Application.transpose(Application.lndex(arr2J , 2),取得arr2第2列数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论