墻上那一串串紅辣椒——數(shù)組入門(mén)講座轉(zhuǎn)自 山菊花老師的作品 :http://club./viewthread.php?tid=196095&px=0
寫(xiě)個(gè)學(xué)習(xí)數(shù)組的帖子,送給初學(xué)的朋友。
1、什么是數(shù)組 數(shù)組就是把數(shù)據(jù)組合起來(lái)以方便管理,在程序中運(yùn)用數(shù)組可簡(jiǎn)化程序、提高效率。 學(xué)習(xí)數(shù)組并不難。我奶奶就是玩數(shù)組的高手,她到地里,用根紅繩子將采下的辣椒一只一只串起來(lái)帶回家掛在門(mén)前那墻上,她把這串辣椒稱(chēng)為“紅繩子”,墻上還有“大串”、“初一”、“五兒”……,現(xiàn)在我才明白,那是數(shù)組名。中午,奶奶要我把紅繩子第5顆辣椒摘下來(lái),我不知道奶奶為什么要摘第5顆,反正我照辦就是,奶奶說(shuō),她要我摘“紅繩子(5)”是想考考我數(shù)數(shù)的能力,暈,一二三四五,上山打老虎,我還能數(shù)錯(cuò)嗎?那年我已經(jīng)四歲了。奶奶說(shuō)話(huà)總喜歡用數(shù)組,好比“尚云嫂她家那七個(gè)孩子啊就是有出息!”,你知道奶奶用哪個(gè)數(shù)組說(shuō)話(huà)?如果還不知道,等會(huì)再告訴你。 山版主的文章讀起來(lái)瑯瑯上口,用幾個(gè)簡(jiǎn)單的生活中的例子就可以把一個(gè)問(wèn)題講得很透徹。本文確實(shí)是新手學(xué)習(xí)的好材料,歡迎大家補(bǔ)充?!猲orthwolves
2、用Array創(chuàng)建數(shù)組 今天,我們?cè)?/span>Excel上來(lái)玩?zhèn)€串辣椒的游戲。新建一Excel文件,按Alt+F11打開(kāi)VBE窗口,如圖所示打開(kāi)本地窗口備用。
插入一新的模塊,在代碼窗口中寫(xiě)入代碼: Sub test() 紅繩子 = Array("辣1", "辣2", "辣3", "辣4", "辣5", "辣6", "辣7", "辣8", "辣9", "辣10") End Sub 按F8,逐行運(yùn)行代碼,如圖所示,我們可以看到,程序成功創(chuàng)建了一個(gè)數(shù)組,數(shù)組名稱(chēng)是“紅繩子”,"辣1", "辣2", "辣3", "辣4", "辣5", "辣6", "辣7", "辣8", "辣9", "辣10"是數(shù)組元素。
用Array()創(chuàng)建數(shù)組,各元素之間用逗號(hào)隔開(kāi)。元素如果是文本,要用半角引號(hào)作定界符。 練習(xí),創(chuàng)建兩個(gè)數(shù)組: ⑴數(shù)組名為cName,數(shù)據(jù)為10個(gè)同學(xué)的姓名:林思明、曾玉婷、曾國(guó)文、林偉權(quán)、林興發(fā)、劉卓懷、曾仙婷、林平 ⑵數(shù)組名為cj,數(shù)據(jù)為10個(gè)數(shù)值:99, 85, 92.5, 70, 78.5, 65, 84, 100 參考答案:數(shù)組入門(mén)01.xls 3、像和尚數(shù)念珠一樣把數(shù)組玩轉(zhuǎn) 我們已經(jīng)初步認(rèn)識(shí)了數(shù)組,數(shù)組是把一組數(shù)保存到一個(gè)數(shù)組變量中,它有兩個(gè)重要特征。 ⑴它是一個(gè)變量,對(duì)一組數(shù)進(jìn)行統(tǒng)一管理帶來(lái)方便。上面建立的姓名數(shù)組,我們要把它寫(xiě)入到工作表區(qū)域A1向右連續(xù)8個(gè)單元格中,可用命令: Range(“a1:h 我們認(rèn)識(shí)的這類(lèi)數(shù)組,稱(chēng)為一維數(shù)組,一維數(shù)組是一個(gè)水平數(shù)組,相當(dāng)于工作表中的行。如果要把姓名按垂直方向填充到單元格,可轉(zhuǎn)置命令。如,把這個(gè)數(shù)組寫(xiě)入到A1:A8單元格中: Range(“a1:a 練習(xí):把數(shù)組cname分別寫(xiě)入到單元格C4:J4、D8:D15。 答案:數(shù)組入門(mén)02.xls ⑵第二上重要的特征,是數(shù)組元素的有序性,一組數(shù)據(jù)有序地保存到數(shù)組變量中。數(shù)組中,用數(shù)組名加序號(hào)(稱(chēng)索引值)構(gòu)成唯一的名稱(chēng)對(duì)元素進(jìn)行引用。元素與序號(hào)一一對(duì)應(yīng),根據(jù)序號(hào),可以修改和讀取指定位置上的元素。 把一串姓名保存到數(shù)組cName中,數(shù)據(jù)在數(shù)組中按順序保存,默認(rèn)從0開(kāi)始,依次是1、2、3……,用cName(0)表示第一個(gè)姓名、cName(1)表示第二個(gè)姓名,等等。 在工作表中插入一個(gè)按鈕,點(diǎn)擊按鈕,把姓名填入單元格A1:A8中: Private Sub CommandButton1_Click() cname = Array("林思明", "曾玉婷", "曾國(guó)文", "林偉權(quán)", "林興發(fā)", "劉卓懷", "曾仙婷", "林平") For i = 1 To 8 Range("a" & i) = cname(i - 1) Next End Sub 數(shù)組序號(hào)(索引值)默認(rèn)從0開(kāi)始,也可以通過(guò)命令OPTION BASE 1修改為從1開(kāi)始。該命令寫(xiě)在模塊的前面。如果設(shè)定索引值從1開(kāi)始,則上面的代碼修改為: Private Sub CommandButton1_Click() cname = Array("林思明", "曾玉婷", "曾國(guó)文", "林偉權(quán)", "林興發(fā)", "劉卓懷", "曾仙婷", "林平") For i = 1 To 8 Range("a" & i) = cname(i ) ‘工作表行號(hào)與數(shù)組序號(hào)相吻合 Next End Sub 參考:數(shù)組入門(mén)03.xls 4、想起瑞士軍刀 Array()很好用,但有時(shí)Split()更好用,我們?nèi)〕鲞@瑞士軍刀的第二利器。 Split()把一個(gè)文本,根據(jù)指定的分隔符,建立一個(gè)數(shù)組。 看一個(gè)實(shí)例: 單元格A1中有一串姓名: 朱清燕(女),林鑫,林秋靜(女),林永鑫,林云艷(女),林嘉惠(女),曾文婷(女),林悅,陳誠(chéng),林偉健,賴(lài)紫嵐(女),曾雁(女),賴(lài)文強(qiáng),鐘娟(女),張琪(女),林文彬,黃曉婷(女),李朕,林依婷(女),林佳利(女),曾德福 要求:用Split(),把這串文本創(chuàng)建為一個(gè)數(shù)組: Sub test() XM = End Sub 同樣可以用本地窗口檢查轉(zhuǎn)換結(jié)果。 注意,Split()函數(shù)把文本轉(zhuǎn)換成數(shù)組,并不受Option Base的影響,索引號(hào)總是從0開(kāi)始。 很自然想知道,A1單元格中有多少個(gè)姓名?創(chuàng)建的數(shù)組有多少個(gè)元素?瑞士軍刀中有把小尺子,可以量一量: Ubound()——返回?cái)?shù)組的最大下標(biāo)。 Sub test() xm = MsgBox "數(shù)組最大下標(biāo)是 " & UBound(xm) & Chr(13) _ & "數(shù)組共有 " & UBound(xm) + 1 & " 個(gè)元素" End Sub 參考:數(shù)組入門(mén)04.xls 5、三維表示一個(gè)空間,四維、五維、六維呢? 三維已經(jīng)可以代表寬廣無(wú)垠的宇宙,而數(shù)組卻允許聲明為4維、5維、6維,直至60維。這是一個(gè)什么樣的概念?我曾經(jīng)打過(guò)一個(gè)這樣的比方: http://club./dispbbs.asp?BoardID=3&ID=185500&replyID=504536&skin=0 6、由工作表區(qū)域創(chuàng)建數(shù)組。 與Array()和Split()相比,由工作表區(qū)域創(chuàng)建數(shù)組更加直觀(guān)而簡(jiǎn)易,一個(gè)等號(hào)便解決問(wèn)題: 如:用Sheet2工作表A1:E83的數(shù)據(jù)創(chuàng)建一個(gè)數(shù)組: Private Sub CommandButton1_Click() arr = Sheet2.Range("a1:e83") End Sub 如果把該數(shù)據(jù)復(fù)制到Sheet1工作表相同區(qū)域,用數(shù)組操作,代碼如下: Private Sub CommandButton1_Click() arr = Sheet2.Range("a1:e83") Range("a1:e83") = arr End Sub 共兩句,前一句把數(shù)據(jù)保存到數(shù)組,第二句,把數(shù)組內(nèi)容寫(xiě)入到工作表。 選擇第3行代碼,按F9設(shè)置斷點(diǎn)。點(diǎn)擊按鈕運(yùn)行代碼,到該行,程序自動(dòng)中斷,此時(shí),可從本地窗口中觀(guān)察到運(yùn)行結(jié)果,一個(gè)83行2列的數(shù)組已經(jīng)創(chuàng)建。
也可以按F8逐行運(yùn)行代碼,查看數(shù)組創(chuàng)建的結(jié)果。 參考:數(shù)組入門(mén)05.xls 7、隨心所欲創(chuàng)建數(shù)組 以上幾種辦法都是根據(jù)已有的數(shù)據(jù)創(chuàng)建數(shù)組。實(shí)際使用中,更多時(shí)候,程序需要先創(chuàng)建數(shù)組,然后對(duì)數(shù)組進(jìn)行賦值和修改。 Private、Public、Dim、Static,這些語(yǔ)句都可聲明數(shù)組變量,區(qū)別在于聲明的數(shù)組的使用范圍,可查看各語(yǔ)句的幫助。 新建一個(gè)過(guò)程: Sub 聲明數(shù)組() Dim MyArray(10) '在過(guò)程中間聲明一個(gè)數(shù)組,過(guò)程結(jié)束,本數(shù)組將被釋放。 MyArray(1) = 100 '給數(shù)組賦值 MyArray(5) = 90 End Sub 按F8逐行運(yùn)行程序,在本地窗口中可以看到數(shù)組MyArray()已成功創(chuàng)建。 Dim是聲明變量的語(yǔ)句; MyArray是數(shù)組名稱(chēng); 10是數(shù)組最大下標(biāo)。當(dāng)Option Base 0的模式下,數(shù)組的序號(hào)(索引值)從0到10,表示數(shù)組有11個(gè)元素,當(dāng)Option Base 1的模式下,數(shù)組的索引值從1到10,該語(yǔ)句創(chuàng)建的數(shù)組共有10個(gè)元素。 上面聲明的數(shù)組是一維數(shù)組,數(shù)組最大可以定義60維。多維數(shù)組的表示方法,維與維之間用逗號(hào)相隔。 Sub 聲明數(shù)組b() Dim Data(10,5) ’聲明一個(gè)二維數(shù)組 Data (1,1) = “A Data (1,2) = 90 Data (3,1) = “A Data (3,2) = 80 End Sub 這里,Data是一個(gè)二維數(shù)組。二維數(shù)組的兩維,我們通常用“行、列”稱(chēng)呼它,如Data,最大行號(hào)是10,最大列號(hào)是5,在Option Base 1 模式下,表示是一個(gè)10行5列共50個(gè)元素的數(shù)組空間。在Option Base 0 模式下,表示一個(gè)11行6列共66個(gè)元素的數(shù)組空間。 二維數(shù)組是使用頻率最高的數(shù)組形式,因?yàn)槲覀兊墓ぷ鞅硪彩嵌S的。 用工作表來(lái)領(lǐng)會(huì)二維數(shù)組,將會(huì)更加直觀(guān): Data(1,1)相當(dāng)于Cells(1,1),表示第1行,第1列; Data(5,3)相當(dāng)于Cells(5,3),表示第5行,第3列。 下面的語(yǔ)句,聲明的是一個(gè)三維數(shù)組: Sub 聲明數(shù)組b() Dim x(3,30,3) X (1,1,1) = “1班” '給數(shù)組賦值 X (1,1,2) = “張三” X (1,1,3) = 88 X (1,2,1) = “1班” '給數(shù)組賦值 X (1,2,2) = “李四” X (1,2,3) = 95 X (2,1,1) = “2班” '給數(shù)組賦值 X (2,1,2) = “劉日” X (2,1,3) = 92 End Sub 我們可以用工作簿的概念來(lái)遷移領(lǐng)會(huì)三維數(shù)組: X(1,2,3):第1個(gè)工作表第2行第3列; X(2,14,10):第2個(gè)工作表第14行第10列。 假如我們要測(cè)量數(shù)組各維的最大下標(biāo),可以在UBound()函數(shù)使用第二個(gè)參數(shù): UBound(x,1),返回?cái)?shù)組x第1維的最大下標(biāo); UBound(x,2),返回?cái)?shù)組x第2維的最大下標(biāo); UBound(x,3),返回?cái)?shù)組x第3維的最大下標(biāo)。 參考:數(shù)組入門(mén)06.xls 8、進(jìn)階操作聲明數(shù)組 ⑴聲明數(shù)組還可以根據(jù)需要自己指定下標(biāo)和上標(biāo),而且不受Option Base 的影響: Sub 聲明數(shù)組() Dim cArr(11 To 20) ‘聲明一個(gè)數(shù)組cArr,下標(biāo)從11到20,共有10個(gè)元素。 cArr(11) = "上" cArr(12) = "中" cArr(13) = "下" End Sub 數(shù)組的索引值還允許為負(fù)整數(shù): Sub 聲明數(shù)組() Dim nArr(-10 To 10) ‘聲明一個(gè)數(shù)組 nArr,下標(biāo)從-10到10,共21個(gè)元素。 nArr(-10) = 123 nArr(-9) = 456 nArr(-2) = 789 End Sub 可變的下標(biāo)給你的程序帶來(lái)靈活性,推薦另一個(gè)函數(shù):UBound()函數(shù)的姐妹花LBound()。 LBound()可以返回指定數(shù)組維可用的最小下標(biāo)。如: xb = LBound(nArr) MsgBox xb ⑵聲明數(shù)組時(shí),還允許像聲明單值變量一樣為數(shù)組指定為數(shù)據(jù)類(lèi)型。 Sub 聲明數(shù)組() Dim cArr(11 To 20) As String cArr(11) = "上" cArr(12) = "中" cArr(13) = "下" End Sub As String 表示數(shù)組cArr()是一個(gè)字符型變量,在本地窗口中可以看到,沒(méi)有賦值的元素默認(rèn)為空文本。 Sub 聲明數(shù)組() Dim nArr(-10 To 10) As Integer nArr(-10) = 123 nArr(-9) = 456 nArr(-2) = 789 End Sub As Integer表示數(shù)組nArr()是一個(gè)整型變量,在本地窗口中可以看到,沒(méi)有賦值的元素默認(rèn)為0。 沒(méi)有指定類(lèi)型的變量,默認(rèn)為Variant,沒(méi)有賦值的元素默認(rèn)為“空值”。 參考:數(shù)組入門(mén)07.xls ⑶變量的級(jí)別問(wèn)題 以上都是在過(guò)程內(nèi)部聲明變量,當(dāng)過(guò)程結(jié)果時(shí),變量自動(dòng)被釋放。 在模塊級(jí)別中聲明變量,對(duì)該模塊中的所有過(guò)程都是可用的。 參考:數(shù)組入門(mén)08.xls 如果要聲明級(jí)別更高的變量,可使用Public語(yǔ)句。詳見(jiàn)幫助。 9、動(dòng)態(tài)數(shù)組 以上聲明的數(shù)組都屬于“靜態(tài)數(shù)組”,每個(gè)數(shù)組有確定的維數(shù),每維有確定的最大下標(biāo)。與之相對(duì)應(yīng)的是動(dòng)態(tài)數(shù)組。程序中,數(shù)組的大小有時(shí)不是固定的,而是隨數(shù)據(jù)的變化而變化。 聲明數(shù)組的時(shí)候,不指定數(shù)組的維數(shù)與下標(biāo),這樣的數(shù)組就是動(dòng)態(tài)數(shù)組,在程序中可用命令Redim為動(dòng)態(tài)數(shù)組變量重新分配存儲(chǔ)空間。 例:?jiǎn)卧?/span>A1中有一串姓名: 朱清燕(女),林鑫,林秋靜(女),林永鑫,林云艷(女),林嘉惠(女),曾文婷(女),林悅,陳誠(chéng),林偉健,賴(lài)紫嵐(女),曾雁(女),賴(lài)文強(qiáng),鐘娟(女),張琪(女),林文彬,黃曉婷(女),李朕,林依婷(女),林佳利(女),曾德福 要求:把名單整理成兩列,第一列是姓名,第二列是性別,把它輸出到B:C兩列。 與例4相同,用Split(),把這串文本創(chuàng)建為一個(gè)數(shù)組,然后根據(jù)這個(gè)數(shù)組的大小,創(chuàng)建另一個(gè)數(shù)組: ReDim Arr(1 To s, 1 To 2) 其中s是數(shù)組xm()的最大下標(biāo),xm()有多少行,Arr()就有多少行,列數(shù)為2,一列是姓名,另一列是性別。 參考:數(shù)組入門(mén)09.xls 允許使用ReDim語(yǔ)句反復(fù)地改變數(shù)組的元素以及維數(shù)的數(shù)目,請(qǐng)自己練習(xí)。 10、對(duì)同一數(shù)組的反復(fù)定義 對(duì)同一數(shù)組反復(fù)改變大小的時(shí)候,也有規(guī)則必須遵守。如果數(shù)組中存在數(shù)據(jù),再次定義的時(shí)候默認(rèn)把原數(shù)據(jù)清除,重新定義后的數(shù)組是一個(gè)空的數(shù)組。如果你要保留原來(lái)的數(shù)據(jù),必須加上參數(shù)Preserve。使用Preserve參數(shù)又有一個(gè)限制,只能改變最后一維的大小,比如二維數(shù)組,只能改變第2維(列)的大小而不能改第1維(行)的大小。 還是使用上個(gè)示例,要求把A1單元格中的女同學(xué)的姓名整理成兩列,第一列序號(hào),第二列是姓名。 使用數(shù)組Arr()記錄整理結(jié)果,我們?cè)诒闅v原始數(shù)組xm()的時(shí)候,根據(jù)性別的判斷即時(shí)改變Arr()的大小。但不能把數(shù)組Arr()定義為n行2列,第1列保存序號(hào),第2列保存姓名,因?yàn)槲覀儽仨毷褂?/span>Preserve參數(shù)保留原來(lái)的數(shù)據(jù),此時(shí)數(shù)組Arr(n,2)的第一維是不允許改變的。為了解決為個(gè)矛盾,我們可以把數(shù)組定義為2行n列,第一行記錄序號(hào),第二行記錄姓名,列數(shù)在程序過(guò)程中反復(fù)改變。 n = n + 1 ReDim Preserve Arr(1 To 2, 1 To n) '改變動(dòng)態(tài)數(shù)組的大小,共2行,n列 數(shù)組第1行記錄序號(hào),第2行記錄姓名: Arr(1, n) = n Arr(2, n) = Left(Xm(i), Len(Xm(i)) - 3) 對(duì)數(shù)組xm()遍歷結(jié)束后,把結(jié)果寫(xiě)入工作表,因?yàn)閿?shù)組的方向與結(jié)果要求的方向不一致,所以要加一個(gè)轉(zhuǎn)置函數(shù): Range("b6").Resize(n, 2) = WorksheetFunction.Transpose(Arr) 參考:數(shù)組入門(mén)10.xls 11、搜索數(shù)組 園子里是不是有紅蘋(píng)果? 你手中的牌是不是有紅桃K? 我們用眼睛一瞄就知道。數(shù)組元素中是不是有“張三”,是不是有“李四”,我們?nèi)绾沃??不用?dān)心,Filter()函數(shù)剛好可以幫你忙。 Filter()函數(shù)在一維數(shù)組中搜索文本型數(shù)據(jù),并把結(jié)果保存到指定的數(shù)組中。 A1單元格是以逗號(hào)分隔的姓名串,部分有重復(fù),要求剔除其中重復(fù)的姓名,把不重復(fù)的姓名寫(xiě)入單元格A2向右的區(qū)域。 第一步,把所有姓名保存到數(shù)組xm()中; 第二步,建立一個(gè)數(shù)組Arr()保存結(jié)果,遍歷xm()過(guò)程中,檢查Arr()中是否存在當(dāng)前的姓名,用命令: Temp = Filter(Arr, xm(i)) '在數(shù)組Arr()中搜索當(dāng)前值xm(i),如果找到,結(jié)果保存到Temp()數(shù)組中,如果找不到,返回一個(gè)空的數(shù)組Temp() 根據(jù)Temp()數(shù)組的大小,可以知道當(dāng)前值xm(i)是不是一個(gè)重復(fù)的值。 參考:數(shù)組入門(mén)11.xls 12、連接數(shù)組元素 有一個(gè)函數(shù),是Split()的反向操作函數(shù),把數(shù)組的元素連接成一個(gè)字符串,這個(gè)函數(shù)就是Join()。 在上例中,把要求改為,剔除重復(fù)值后,把結(jié)果依原樣輸出到A2單元格中。 我們只需改變最后一行代碼: 把這一行: 'Range("a2").Resize(1, r) = Arr '填充到工作表 換成這一行,用上Join()函數(shù),把Arr()數(shù)組中的元素用“,”連接成一個(gè)字符串: Range("a2") = Join(Arr, ",") 13、清除數(shù)組 當(dāng)數(shù)組不需要使用時(shí),可用Erase語(yǔ)句清除數(shù)組元素,釋放變量占用的空間。 語(yǔ)句: Erase xm,Arr 每條Erase語(yǔ)句,可清除一個(gè)數(shù)組,也可同時(shí)清除多個(gè)數(shù)組,數(shù)組名之間用逗號(hào)分隔。 |
|
來(lái)自: 9 1 1 > 《Excel VBA》