關(guān)于EXCEL中VBA的數(shù)組理解_第1頁
關(guān)于EXCEL中VBA的數(shù)組理解_第2頁
關(guān)于EXCEL中VBA的數(shù)組理解_第3頁
關(guān)于EXCEL中VBA的數(shù)組理解_第4頁
關(guān)于EXCEL中VBA的數(shù)組理解_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、關(guān)于EXCEL中VBA的數(shù)組理解 一、什么是VBA數(shù)組不要把VBA數(shù)組想的太神秘,它其實就是一組數(shù)字而已。把一組數(shù)按行、列排在一起,放在內(nèi)存中。就是一個VBA數(shù)組。二、數(shù)組的維數(shù)數(shù)組的維數(shù)其實和文件管理的目錄一樣的,只有一層時就是一維。如果有兩層則是二維數(shù)組(有行有列為二維),如果有三層,則是三維數(shù)組。VBA中支持13維數(shù)組運算。Sub 數(shù)組示例()Dim x As Long, y As LongDim arr(1 To 10, 1 To 3)  '創(chuàng)建一個可以容下10行3列的數(shù)組空間For x = 1 To 4For y = 1 To 3arr(x, y) = C

2、ells(x, y)  '通過循環(huán)把單元格區(qū)域a1:c4的數(shù)據(jù)裝進數(shù)組中Next yNext x MsgBox arr(4, 3) '根據(jù)提供的行數(shù)和列數(shù)顯示數(shù)組arr(1, 2) = "我改一下試試" '你可以隨時修改數(shù)組內(nèi)指定位置的數(shù)據(jù) MsgBox arr(1, 2)End Sub總結(jié):二維是由行和列表示的數(shù)組,如ARR(3,2)表示數(shù)組中第3排第2列的元素。而一維數(shù)組只是由一個元素決定,如ARR(4)表示數(shù)組中第4個元素三、把單元格數(shù)據(jù)搬入內(nèi)存:一、聲明: Dim arr as Variant  

3、9;聲明一個變量,不能聲明其他數(shù)據(jù)類型Dim arr(1 to 10, 1  to  2 ) , 這種聲明也是錯誤的,固定大小的VBA數(shù)組是不能一次性裝入單元格數(shù)據(jù)或:dim arr()    這種聲明方式是聲明一個動態(tài)數(shù)組,也可以裝入單元格區(qū)域,構(gòu)成一個VBA數(shù)組。二、裝入arr =range("a9:c100")   '裝入很簡單,變量 = 單元格區(qū)域三、讀出裝入數(shù)組后的單元格數(shù)值,可以按 數(shù)組名稱(行數(shù),列數(shù)) 直接讀取該位置的值,如下面的代碼。Msgbox 

4、arr(3,2)   '就可以取出搬過去的而構(gòu)成的數(shù)組第3行第2列的內(nèi)容四、示例 Sub s3()Dim arr() '聲明一個動態(tài)數(shù)組(動態(tài)指不固定大?。〥im arr1  '聲明一個Variant類型的變量arr = Range("a1:c7")   '把單元格區(qū)域A1:C7的值裝入數(shù)組arrarr1 = Range("a1:c7")   '把單元格區(qū)域A1:C7的值裝入數(shù)組arr1 MsgBox arr(1, 1)

5、60;  '讀取arr數(shù)組中第1行第1列的數(shù)值 MsgBox arr1(2, 3)  '讀取arr1數(shù)組的第2行第3列的數(shù)值 End Sub四、把內(nèi)存數(shù)據(jù)搬入單元格Sub test()Dim arr     '聲明一個變量用來盛放單元格數(shù)據(jù)Dim x As Integerarr = Range("a2:d5")     '把單元格數(shù)據(jù)搬入到arr里,它有4列4行 For x = 1 To 4  

6、   '通過循環(huán)在arr數(shù)組中循環(huán)arr(x, 4) = arr(x, 3) * arr(x, 2)      '數(shù)組的第4列(金額)=第3列*第2例 Next xRange("a2:d5") = arr     '把數(shù)組放回到單元格中End SubSub test1()Dim arr(1 To 5) '聲明一維數(shù)組For x = 1 To 5arr(x) = x * 2  '通過循環(huán)給每個位置賦值Next

7、 xRange("A1:E1") = arr  '把數(shù)組導入到excel中的a1:e1單元格中Range("A1:A5") = Application.Transpose(arr) '如果是放在一列中,就需要對數(shù)組進行轉(zhuǎn)置后再存放End Sub五、動態(tài)數(shù)組的聲明Sub darr()Dim arr()  '聲明一個動態(tài)的arr數(shù)組(不知道它能盛多少數(shù)據(jù))Dim kk = Application.WorksheetFunction.CountIf(Range("a2:a6"), "&g

8、t;10") '計算大于10的個數(shù)ReDim arr(1 To k)  '再次聲明arr的大小,正好盛下k數(shù)量的值For x = 2 To 6If Cells(x, 1) > 10 Thenm = m + 1arr(m) = Cells(x, 1)  '通過循環(huán)把大于10的數(shù)字裝入數(shù)組End IfNext xMsgBox arr(2)End Sub六、數(shù)組的上標(lBOUND)和下標(UBOUND)arr(-19 to 8)  這個數(shù)組的編號就是從-19開始的.那么它的最小編號就是-19,最大編號是8, 如果用語句返回就是:

9、 Sub t1()Dim arr(-19 To 8)MsgBox UBound(arr) '返回最大編號,結(jié)果為8MsgBox LBound(arr) '返回最小編號,結(jié)果為-19End Sub如果是有行列組成的二維數(shù)組呢?二維數(shù)組返回行的下標和列的下標見下例Sub t2()Dim arr(-19 To 8, 2 To 5)MsgBox UBound(arr) '返回第1維(行的)最大編號,結(jié)果為8MsgBox LBound(arr) '返回第1維(行的)小編號,結(jié)果為-19MsgBox UBound(arr, 2) '返回第2維(列的)最大編號,結(jié)果為

10、5MsgBox LBound(arr, 2) '返回第2維(列的)最小編號,結(jié)果為2End SubSub t3()Dim arrarr = Sheets(1).UsedRange 'Usedrange的行數(shù)和列數(shù)是未知的MsgBox UBound(arr, 1) '可以計算這個區(qū)域有多少行MsgBox UBound(arr, 2) '可以計算出這個區(qū)域有多少列End Sub七、使用Array函數(shù)創(chuàng)建常量數(shù)組:使用Array函數(shù)創(chuàng)建數(shù)組1維常量數(shù)組:Array("A",1,"C") 2維常量數(shù)組: Array(Array(&

11、quot;a", 10), Array("b", 20), Array("c", 30) 也可以調(diào)用excel工作表內(nèi)存數(shù)組:1維數(shù)量:  "A",1,"C" 2維數(shù)量: "a",10;"b",20;"c",30內(nèi)存常量數(shù)組有什么作用呢?1、簡化賦值比如:我需要給數(shù)組arr分別賦值10 ,20,30,40 ,一般就需要分別賦值,即:arr(1)=10arr(2)=20arr(3)=30arr(4)=40而使用常量數(shù)量

12、,只一句話:arr=array(10,20,30,40)2、調(diào)用工作表函數(shù)時使用: Sub mylook() Dim arrarr = "a",10;"b",20;"c",30MsgBox Application.VLookup("b", arr, 2, 0)  '調(diào)用vlookup時可以作為第二個參數(shù)End Sub 八、數(shù)組的合并和字符串拆分(Join & Split): 多個字符的合并和字符串按規(guī)律的拆分是經(jīng)常遇到的,如:A-REW-E-RWC-

13、2-RWC 按分隔符-拆分成6個字符放在一個數(shù)組中有一組數(shù)array(23,45,7,1,76)想用分隔符-連接成一個字符串上面兩種情況VBA提供了一對函數(shù),即: split(字符串,"分隔符") 拆分字符串join(數(shù)組,"分隔符")   用分隔連接數(shù)組的每個元成一個字符串Sub t1()Dim arr, myst As Stringmyst = "A-REW-E-RWC-2-RWC"arr = Split(myst, "-")  '按-分隔成一組數(shù)裝入數(shù)組中

14、60;'MsgBox arr(0) '顯示數(shù)組的第一個數(shù)(分隔后的數(shù)組最小下標為0,不是1),顯示結(jié)果為A MsgBox Join(arr, ",") '再用","把數(shù)組的每個值連接成一個字符串,結(jié)果為"A,REW,E,RWC,2,RWC"End Sub值得注意的是:split和join只能對一維數(shù)組進行操作,如果是單元格或二維數(shù)組怎么辦?只有一條途徑,想辦法轉(zhuǎn)換為一維數(shù)組:Sub t2()Dim ARRARR = Application.Transpose(Range("a1:a3&quo

15、t;) 用轉(zhuǎn)置的方法,把單元格一列數(shù)據(jù)轉(zhuǎn)換成一維數(shù)組MsgBox Join(ARR, "-")End Sub九、Filter函數(shù)實現(xiàn)數(shù)組篩選: 數(shù)組的篩選就是根據(jù)一定的條件,從數(shù)組中篩選符合條件的值,組成一個新的數(shù)組,實現(xiàn)數(shù)組篩選的VBA函數(shù)是:Filter函數(shù)用法:Filter(數(shù)組, 篩選的字符,  是否包含)  Sub DD()arr = Array("ABC", "A", "D", "CA", "ER")arr1 = VBA.Filter

16、(arr, "A", True) '篩選所有含A的數(shù)值組成一個新數(shù)組arr2 = VBA.Filter(arr, "A", False) '篩選所有不含A的數(shù)值組成一個新數(shù)組MsgBox Join(arr2, ",") '查看篩選的結(jié)果End Sub遺憾的是函數(shù)只能進行模糊篩選,不能精確匹配。他山之石,可以攻玉,VBA中除可以利用的VBA函數(shù)外,還可以調(diào)用眾多的Excel工作表函數(shù)對數(shù)組進行分解、查詢和分析等,調(diào)用工作表函數(shù)可以省去循環(huán)判斷的麻煩,進而提高運行效率。 一、數(shù)組的最值  1、M

17、ax和Min 工作表函數(shù)Max和Min是求最大值和最小值的函數(shù),同樣在VBA中也可以求數(shù)組的最大值和最小值。如:Sub t()arr = Array(1, 35, 4, 13)MsgBox Application.Max(arr)  '最大值MsgBox Application.Min(arr)   '最小值End Sub 2、large和small工作表函數(shù)large和small 是返回一組數(shù)的第N大和第N小,對VBA數(shù)組同樣適用,如:Sub t1()arr = Array(1, 35, 4, 13)Msg

18、Box Application.Large(arr, 2) '第2大值 MsgBox Application.Small(arr, 2)  '第2小值End Sub 二、數(shù)組的統(tǒng)計與求和1、SumSum函數(shù)可以在工作表中求,同樣也可以對VBA數(shù)組求和,如:Sub t2()arr = Array(1, 35, 4, 13)MsgBox Application.Sum(arr)  '對數(shù)組進行求和End Sub2、Count和CountaCount和Counta可以統(tǒng)計數(shù)組中數(shù)字的個數(shù)和數(shù)字+文本的個數(shù)。Sub t

19、3() arr = Array(1, 35, "a", 4, 13, "b")MsgBox Application.Count(arr)  '返回數(shù)字的個數(shù)4MsgBox Application.CountA(arr)  返回數(shù)組文本和數(shù)字的總個數(shù)End Sub三、數(shù)組的查詢和拆分1、Mach查詢數(shù)組Match函數(shù)可以查詢一個指定值在一組數(shù)中的位置,它也可以用于VBA數(shù)組的查詢。如:Sub t4()arr = Array(1, 35, 4, 13)MsgBox Application.Match(4, ar

20、r, 0)  '查詢數(shù)值4在數(shù)組Arr中的位置End Sub2、Index拆分數(shù)組數(shù)組的拆分在VBA中是一個難題,如果是按行拆分數(shù)組,除了用循環(huán)外也只能借用API函數(shù)完成了。幸好我們可以借用工作表函數(shù)index達到按列拆分數(shù)組,即多列構(gòu)成的數(shù)組,你可以任意拆分出一列構(gòu)成新的數(shù)組。方法是:Application.Index(數(shù)組, , 列數(shù)) ,例:Sub t2()arr2 = Range("A1:B4") 把單元格區(qū)域A1:B4的值裝入數(shù)組arr2arr3 = Application.Index(arr2, , 2)  '把數(shù)組第2列拆分出來裝入新數(shù)組arr3中,新數(shù)組為二維數(shù)組MsgBox arr3(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論