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