VBA数组与字典知识与实例---数组

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

********************************************************************************************************************************************************************************************************从一个实例开始Subv4()'运行时间0.01秒Dimtt=TimerForx=1To100000m=m+1000'真接调用内存中的值NextxMsgBoxTimer-tEndSubSubv5()'运行时间0.5秒Dimtt=TimerForx=1To100000m=m+Cells(1,1)'调用单元格中的值NextxMsgBoxTimer-tEndSub运行的结果是直接调用内存中的值比调用单元格的值快了50倍,为什么会这样呢?我们需要了解一下VBA的运算原理**********VBA的运算原理*********VBA中的运算最终是在内存中进行的,如果数据已经在内存中,则直接进行运算,但如果数据是储存在第三方对象(如单元格里,控件里)里,则还需要先把数据从第三方对象里调入到内存中,然后再在内存中对数据进行运算。如果把v5的程序进行稍微改动,运行时间会大大缩短。Subv5_2()'运行时间0.5秒Dimx,tt=Timerx=Cells(1,1)'把单元格的值先交给变量Forx=1To100000m=m+xNextxMsgBoxTimer-tEndSub如果VBA多次调用同一样单元格,我们可以先把这个单元格放在一个变量中,如果是多行多列的单元*VBA数组教程**--------excel精英培训网:兰色幻想*格区域呢?我们同样可以把把这个区域的值装入一个VBA变量。Subv6()x=Range(a1:10000)EndSub这个VBA变量装入大于1个的数据时,就构成了VBA内存数组。那什么是VBA数组呢?1、什么是VBA数组呢?VBA数组就是储存一组数据的数据空间。数据类型可以数字,可以是文本,可以是对象,也可以是VBA数组。2VBA数组的分类A.按维数划分1维数组Subt1()Dimarr(1To10)Forx=1To10arr(x)=xNextxStopEndSub2维数组Subt2()Dimarr(1To10,1To2)Forx=1To10Fory=1To2arr(x,y)=x*yNextyNextxStopEndSub3维数组Subt3()Dimarr(1To10,1To2,1To3)Forx=1To10Fory=1To2Forz=1To3arr(x,y,z)=x*y+zNextzNextyNextxStopEndSubB按储存类型划分常量数组Subt4()arr=Array(1,2,3,4,5)arr1=Array(Array(1,2),Array(10,20),Array(100,200))'数组的中储存数组arr2=[{a,1;b,2;c,3}]'调用工作表内存数组构成VBA二维数组StopEndSub静态数组:固定大小的数组静态数组声明方法dim/public/private数组名称(第一维数组上标to第一维数组下标,第二维上标to第二维下标......)Subt5()Dimarr1(10)'声明一个上标是0,下标是10的数组Dimarr2(1To10)'声明一个上标是1,下标是10的数组Dimarr3(1To10,1To2)'声明一个10行2列的二维数组EndSub动态数组:大小不固定的数组动态数组的声明方法:和静态数组不同的时,动态数组需要先用Dim声明,数组大小得出结果后还需要再用Redim进行二次声明。Dim数组名称()Redim数组名称(第一维数组上标to第一维数组下标,第二维上标to第二维下标...)例1:Subdarr()Dimarr()'声明一个动态的arr数组(不知道它能盛多少数据)Dimkk=Application.WorksheetFunction.CountIf(Range(a2:a60),10)'计算大于10的个数ReDimarr(1Tok)'再次声明arr的大小,正好盛下k数量的值Forx=2To6IfCells(x,1)10Thenm=m+1arr(m)=Cells(x,1)'通过循环把大于10的数字装入数组EndIfNextxMsgBoxarr(2)EndSub如果数组需要随一个变量不断的扩充,数组就需要多次声明,每扩充一次就声明一次:RedimPreserve(1tok)如果数组是多维的,只能动态声明第末维的,如果需要把让第一维不断扩充,还需要先转置,有点麻烦,这里就不再详述,遇到这种情况,我们可以声明一个足够大的静态数组来取代动态数组,运行速度较前者快。1单元格区域存入VBA数组Subtest()Dimarr'声明一个变量用来盛放单元格数据DimxAsIntegerarr=Range(a2:d5)'把单元格数据搬入到arr里,它有4列4行Forx=1To4'通过循环在arr数组中循环arr(x,4)=arr(x,3)*arr(x,2)'数组的第4列(金额)=第3列*第2例NextxRange(a2:d5)=arr'把数组放回到单元格中EndSub2一维VBA数组放入单元格区域中Subtest1()Dimarr(1To5)'声明一维数组Forx=1To5arr(x)=x*2'通过循环给每个位置赋值NextxRange(A1:E1)=arr'把数组导入到excel中的a1:e1单元格中Range(A1:A5)=Application.Transpose(arr)'如果是放在一列中,就需要对数组进行转置后再存放EndSub1.计算VBA数组的大小Subb1()Dimarr(-3To4)MsgBoxUBound(arr)'下标MsgBoxLBound(arr)'上标Forx=-3To4arr(x)=x*2NextxMsgBoxApplication.Count(arr)'含有数据元素的个数EndSubSubb2()Dimarrarr=Sheets(1).UsedRange'Usedrange的行数和列数是未知的MsgBoxUBound(arr,1)'可以计算这个区域有多少行MsgBoxUBound(arr,2)'可以计算出这个区域有多少列EndSub2.VBA数组的筛选Subb3()arr=Array(ABC,A,D,CA,ER)arr1=VBA.Filter(arr,A,True)'筛选所有含A的数值组成一个新数组arr2=VBA.Filter(arr,A,False)'筛选所有不含A的数值组成一个新数组StopEndSub3VBA数组的拆分与合并Subt2()arr2=Range(A1:B4)'把单元格区域A1:B4的值装入数组arr2arr3=Application.Index(arr2,,2)'把数组第2列拆分出来装入新数组arr3中,Stop新数组为二维数组EndSub如果想按行拆分,除了api函数外是没有其他办法的如果想把两个数组进行组合成一个数组,只有一个办法,就是通过循环另通过用index很容易解决arr2=Range(A1:B4)'把单元格区域A1:B4的值装入数组arr3arr4=Application.Index(arr2,1,0)'提取第一行数据放入数组arr5Range(d1).Resize(1,UBound(arr4))=arr4'把数组arr5赋值单元格4、VBA数组的最值Subt3()arr=Array(1,35,4,13)MsgBoxApplication.Max(arr)'最大值MsgBoxApplication.Min(arr)'最小值EndSubSubt4()arr=Array(1,35,4,13)MsgBoxApplication.Large(arr,2)'第2大值MsgBoxApplication.Small(arr,2)'第2小值EndSub5数组的统计与求和Subt5()arr=Array(1,35,4,13)MsgBoxApplication.Sum(arr)'对数组进行求和Dmsch大师的观点EndSubSubt6()arr=Array(1,35,a,4,13,b)MsgBoxApplication.Count(arr)'返回数字的个数4MsgBoxApplication.CountA(arr)'返回数组文本和数字的总个数EndSub6.数组的查询Subt7()arr=Array(1,35,4,13)MsgBoxApplication.Match(4,arr,0)'查询数值4在数组Arr中的位置EndSub7数组的转置Subt8()arr=Array(1,35,a,4,13,b)arr1=Application.Transpose(arr)StopEndSubSubt9()arr=Range(a1:a5)arr1=Application.Transpose(arr)StopEndSub8.字符串与VBA数组Subt1()Dimarr,mystAsStringmyst=A-REW-E-RWC-2-RWCarr=Split(myst,-)'按-分隔成一组数装入数组中k=Join(arr,,)'再用,把数组的每个值连接成一个字符串,结果为A,REW,StopE,RWC,2,RWCEndSub9.巧妙利用数组的标因为数组的标是唯一的,所以我们就利用这个特点去除重复的数值Subr1()Dimarr,arr2(1To13,1To1)arr=Range(a1:a13)Forx=1ToUBound(arr)arr2(arr(x,1),1)=arr(x,1)NextxRange(b1).Resize(13)=arr2EndSub10.重新初始化数组Subr2()Dimarr(1To10)Forx=1To10arr(x)=xNextxStopErasearr'如果arr是动态数组,下次使用前还需要用redim设置数组的大小StopForx=1To10arr(x)=xNextxStopEndSub开始日期7月1日结束日期7月30日代码原料名称规格型号类别期初数量本月发料本月用料A630001ACW9532406/1镜头100500300A630002CW5231606/1镜头100500300A630003CW6231706/1镜头100500300A6300043228LED3228LEDLED100500300A63000502010.1UF电容0201电容电容100500300A63000604020.1UF电容0402电容电容100500300A630007OV2655OV2655芯片芯片100500300A630008OV7675OV7675芯片芯片100500300A630009BF3603BF3603芯片芯片100500300A630010G0307G0307芯片芯片100500300A630011FPCKML084BKML084BFPC100500300A630012FPCKML083BKML083BFPC100500300A630013FPCKML142GKML142GFPC100500300A630014FPCKML040G-BKML040G-BFPC100500300A630015FPCKML040G-AKML040G-AFPC100500300A630016FPCKML075V-BKML075V-BFPC100500安泰原料库存一览表本月退料仓库结存202803027022278452556123931269242764125910290529562948292162841728321279600领料单号领料日期生产产品物料编码类别2010/7/10A6300012010/7/11A6300022010/7/12A63

1 / 3376
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功