vb 數組
從一個實例開始 Subv4()"運行時間0.01秒Dimt t=Timer Forx=1To100000 m=m+1000"真接調用內存中的值Nextx MsgBoxTimer-tEndSub Subv5()"運行時間0.5秒Dimt t=Timer Forx=1To100000 m=m+Cells(1,1)"調用單元格中的值Nextx MsgBoxTimer-tEndSub 運行的結果是直接調用內存中的值比調用單元格的值快了50倍,為什麼會這樣呢?我們需要了解一下VBA的運算原理 **********VBA的運算原理********* VBA中的運算最終是在內存中進行的,如果數據已經在內存中,則直接進行運算,但如果數據是儲存在第三方對象(如單元格里,控制項里)里,則還需要先把數據從第三方對象里調入到內存中,然後再在內存中對數據進行運算。 如果把v5的程序進行稍微改動,運行時間會大大縮短。Subv5_2()"運行時間0.5秒Dimx,tt=Timer x=Cells(1,1)"把單元格的值先交給變數Forx=1To100000m=m+xNextx MsgBoxTimer-tEndSub 如果VBA多次調用同一樣單元格,我們可以先把這個單元格放在一個變數中,如果是多行多列的單元 格區域呢?我們同樣可以把把這個區域的值裝入一個VBA變數。Subv6() x=Range("a1:10000")EndSub 這個VBA變數裝入大於1個的數據時,就構成了VBA內存數組。 那什麼是VBA數組呢? 1、什麼是VBA數組呢? VBA數組就是儲存一組數據的數據空間。數據類型可以數字,可以是文本,可以是對象,也可以是VBA數組。2VBA數組的分類 A.按維數劃分 1維數組 Subt1() Dimarr(1To10)Forx=1To10arr(x)=xNextxStopEndSub 2維數組 Subt2() Dimarr(1To10,1To2)Forx=1To10Fory=1To2 arr(x,y)=x*yNextyNextxStopEndSub 3維數組 Subt3() Dimarr(1To10,1To2,1To3)Forx=1To10Fory=1To2Forz=1To3 arr(x,y,z)=x*y+zNextzNextyNextx StopEndSub B按儲存類型劃分 常量數組 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數組(不知道它能盛多少數據)Dimk k=Application.WorksheetFunction.CountIf(Range("a2:a60"),">10")"計算大於10的個數ReDimarr(1Tok)"再次聲明arr的大小,正好盛下k數量的值Forx=2To6 IfCells(x,1)>10Thenm=m+1 arr(m)=Cells(x,1)"通過循環把大於10的數字裝入數組EndIfNextx MsgBoxarr(2)EndSub 如果數組需要隨一個變數不斷的擴充,數組就需要多次聲明,每擴充一次就聲明一次: RedimPreserve(1tok) 如果數組是多維的,只能動態聲明第末維的,如果需要把讓第一維不斷擴充,還需要先轉置,有點麻煩,這裡就不再詳述,遇到這種情況,我們可以聲明一個足夠大的靜態數組來取代動態數組,運行速度較前者快。 1單元格區域存入VBA數組 Subtest() Dimarr"聲明一個變數用來盛放單元格數據DimxAsInteger arr=Range("a2:d5")"把單元格數據搬入到arr里,它有4列4行Forx=1To4"通過循環在arr數組中循環 arr(x,4)=arr(x,3)*arr(x,2)"數組的第4列(金額)=第3列*第2例Nextx Range("a2:d5")=arr"把數組放回到單元格中EndSub 2一維VBA數組放入單元格區域中 Subtest1() Dimarr(1To5)"聲明一維數組Forx=1To5 arr(x)=x*2"通過循環給每個位置賦值Nextx Range("A1:E1")=arr"把數組導入到excel中的a1:e1單元格中 Range("A1:A5")=Application.Transpose(arr)"如果是放在一列中,就需要對數組進行轉置後 再存放 EndSub 1.計算VBA數組的大小 Subb1() Dimarr(-3To4) MsgBoxUBound(arr)"下標MsgBoxLBound(arr)"上標Forx=-3To4arr(x)=x*2Nextx MsgBoxApplication.Count(arr)"含有數據元素的個數EndSub Subb2()Dimarr arr=Sheets(1).UsedRange"Usedrange的行數和列數是未知的MsgBoxUBound(arr,1)"可以計算這個區域有多少行MsgBoxUBound(arr,2)"可以計算出這個區域有多少列EndSub 2.VBA數組的篩選 Subb3() arr=Array("ABC","A","D","CA","ER") arr1=VBA.Filter(arr,"A",True)"篩選所有含A的數值組成一個新數組arr2=VBA.Filter(arr,"A",False)"篩選所有不含A的數值組成一個新數組StopEndSub 3VBA數組的拆分與合併 Subt2() arr2=Range("A1:B4")"把單元格區域A1:B4的值裝入數組arr2 arr3=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賦值單元格
如果想把兩個數組進行組合成一個數組,只有一個辦法,就是通過循環
另通過用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)"最小值EndSub Subt4() arr=Array(1,35,4,13) MsgBoxApplication.Large(arr,2)"第2大值MsgBoxApplication.Small(arr,2)"第2小值EndSub 5數組的統計與求和 Subt5() arr=Array(1,35,4,13) MsgBoxApplication.Sum(arr)"對數組進行求和 Dmsch大師的觀點 EndSub Subt6() arr=Array(1,35,"a",4,13,"b") MsgBoxApplication.Count(arr)"返回數字的個數4 MsgBoxApplication.CountA(arr)"返回數組文本和數字的總個數EndSub 6.數組的查詢 Subt7() arr=Array(1,35,4,13) MsgBoxApplication.Match(4,arr,0)"查詢數值4在數組Arr中的位置EndSub 7數組的轉置 Subt8() arr=Array(1,35,"a",4,13,"b")arr1=Application.Transpose(arr)StopEndSub Subt9() arr=Range("a1:a5") arr1=Application.Transpose(arr)StopEndSub 8.字元串與VBA數組 Subt1() Dimarr,mystAsString myst="A-REW-E-RWC-2-RWC" arr=Split(myst,"-")"按-分隔成一組數裝入數組中 k=Join(arr,",")"再用","把數組的每個值連接成一個字元串,結果為"A,REW,StopE,RWC,2,RWC"EndSub 9.巧妙利用數組的標 因為數組的標是唯一的,所以我們就利用這個特點去除重複的數值 Subr1() Dimarr,arr2(1To13,1To1) arr=Range("a1:a13")Forx=1ToUBound(arr) arr2(arr(x,1),1)=arr(x,1)Nextx Range("b1").Resize(13)=arr2EndSub 10.重新初始化數組 Subr2() Dimarr(1To10)Forx=1To10arr(x)=xNextxStop Erasearr"如果arr是動態數組,下次使用前還需要用redim設置數組的大小Stop Forx=1To10arr(x)=xNextxStopEndSub
推薦閱讀:
※【Excel應用】數組公式的應用
※八星數組來源於八宅的九宮落宮裡
※樹狀數組徹底入門
※Excel|sumif()相當於包含sum()函數的數組公式
TAG:數組 |