国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
第8章 數(shù)組
 
第8章 數(shù)組
  本書前面介紹的都是通過(guò)簡(jiǎn)單變量名來(lái)訪問(wèn)數(shù)據(jù)。在VBA中,除了使用這些簡(jiǎn)單變量名外,對(duì)于在批量的數(shù)據(jù)還可使用數(shù)組來(lái)訪問(wèn)。本章介紹數(shù)組的定義和使用方法。
  8.1 數(shù)組簡(jiǎn)介
  在程序中,如果要處理大量的數(shù)據(jù),為每個(gè)數(shù)據(jù)定義一個(gè)變量將使程序變得很難閱讀,并且代碼很煩瑣。
  對(duì)于大量有序的數(shù)據(jù),可以使用數(shù)組對(duì)其進(jìn)行存儲(chǔ)和處理。在其他程序設(shè)計(jì)語(yǔ)言中,數(shù)組中的所有元素都必須為同樣的數(shù)據(jù)類型。在VBA中,數(shù)組中各元素可以是相同的數(shù)據(jù)類型,也可以是不同的數(shù)據(jù)類型。數(shù)組用來(lái)保存一組有序的數(shù)據(jù),如圖8-1所示的數(shù)據(jù)共有5項(xiàng),可使用數(shù)組來(lái)保存這些數(shù)據(jù)。
                          
  如圖8-1所示的數(shù)據(jù)又稱為列表數(shù)據(jù),可使用前面的項(xiàng)目名稱加上數(shù)據(jù)元素在列表中的序號(hào)來(lái)表示每一個(gè)數(shù)據(jù)元素。這類數(shù)據(jù)只具有行或列,稱為一維數(shù)組。
  如果將由行和列組成的數(shù)據(jù)表定義為一個(gè)數(shù)組,那么這個(gè)數(shù)組就是二維數(shù)組。Excel的工作表就可用一個(gè)二維數(shù)組表示,表中每個(gè)元素的位置由它的行號(hào)和列號(hào)決定,如圖8-2所示。
                                                    
  如果需要處理的數(shù)據(jù)除了在行和列上進(jìn)行排列之外,還具有深度(即多個(gè)二維表格),類似于Excel工作簿中的多個(gè)工作表,如圖8-3所示。保存這種結(jié)構(gòu)數(shù)據(jù)的數(shù)組稱為三維數(shù)組。
                                                           
  盡管VBA數(shù)組最大可以達(dá)到六十維,但是超過(guò)三維的數(shù)組是非常難于理解的,所以常用的也就是一維、二維和三維數(shù)組。
  8.2 聲明數(shù)組
  計(jì)算機(jī)中數(shù)組占用一片連續(xù)的內(nèi)存空間。在使用之前,必須先對(duì)數(shù)組進(jìn)行定義,讓系統(tǒng)為其分配一片連續(xù)的內(nèi)存空間。
  8.2.1 定義一維數(shù)組
  數(shù)組的聲明方式和其他的變量是一樣的,可以使用Dim,Static,Private或Public語(yǔ)句來(lái)聲明。聲明標(biāo)量變量(非數(shù)組)與數(shù)組變量的不同在于必須為數(shù)組指定大小。若數(shù)組的大小被指定的話,則它是個(gè)大小固定的數(shù)組;若程序運(yùn)行時(shí)數(shù)組的大小可以被改變,則它是個(gè)動(dòng)態(tài)數(shù)組。
  可使用兩種方法定義大小固定的一維數(shù)組。第一種的語(yǔ)法格式如下:
  Dim 數(shù)組名(上界) As 數(shù)據(jù)類型
  該格式與其他程序設(shè)計(jì)語(yǔ)言定義數(shù)組的格式相同,只給出數(shù)組下標(biāo)的上界(即可以使用的最大下標(biāo)值)而流程圖下標(biāo)的下界,這時(shí)默認(rèn)值為0,即數(shù)組的下標(biāo)從0開始至定義的上界。例如,
     Dim MyArray(10) As String
  定義了一個(gè)名為MyArray的數(shù)組,共有11個(gè)元素,分別為MyArray(0),MyArray(1)……MyArray(10)。
  如果希望數(shù)組下標(biāo)從1開始,可以通過(guò)Option Base語(yǔ)句來(lái)設(shè)置。其語(yǔ)法格式如下:
  Option Base 1
  使用該語(yǔ)句指定的數(shù)組下標(biāo)的默認(rèn)下界只能為0或1。該語(yǔ)句只能出現(xiàn)在用戶窗體或模塊的聲明部分,不能出現(xiàn)在過(guò)程中,且必須放在數(shù)組定義之前。
  定義數(shù)組的第二種語(yǔ)法格式如下:
  Dim 數(shù)組名(下界 To 上界) As 數(shù)據(jù)類型
  這種格式可定義數(shù)組的下標(biāo)下界為任意值,例如,
  Dim MyArray(-1 To 10) AsString
  定義了一個(gè)數(shù)組MyArray,共有12個(gè)元素,分別為MyArray(-1),MyArray(0),……MyArray(10)。
  以上介紹了兩種定義數(shù)組的方法。定義數(shù)組時(shí)需要注意以下幾點(diǎn):
  ★與變量名相同,數(shù)組名的命名也需要符合標(biāo)識(shí)符的規(guī)則,并盡可能有一定意義。
  ★在同一過(guò)程中,數(shù)組名不能與變量名相同,否則會(huì)出錯(cuò)。
  ★在VBA中定義數(shù)組時(shí),要求其下標(biāo)必須為常數(shù),不能是變量或表達(dá)式。例如以下代碼在執(zhí)行時(shí)將會(huì)報(bào)錯(cuò),如圖8-4所示。
  Dim?。椤s Integer,jAs Integer
  i=5
  Dim?。幔ǎ椋?/div>
  For j = 1  To 5
        a(j) = j
  Next
                                                     
  8.2.2 定義二維數(shù)組
  二維數(shù)組的定義方式與一維數(shù)組類似,不同的是需要設(shè)置兩個(gè)下標(biāo)變量。其語(yǔ)法格式如下:
  Dim 數(shù)組名(第1維上界,第2維上界) As 數(shù)據(jù)類型
  或者是:Dim 數(shù)組名(第1維下界 To 第1維上界,第2維下界 To 第2維上界) As 數(shù)據(jù)類型
  例如,定義以下數(shù)組用來(lái)保存如圖8-2所示的數(shù)據(jù)表。
  Dim MyArray(1 To 3,1 To 5)
  其中MyArray(1,1)保存值為“朱元軍”,MyArray(1,2)保存值為“男”,各元素與值的對(duì)應(yīng)關(guān)系如圖8-5所示。
              
  定義多維數(shù)組的格式與二維數(shù)組類似,每一維都使用逗號(hào)隔開即可。要注意的是,定義大數(shù)據(jù)量的數(shù)組將占用很大的內(nèi)存空間,特別是定義多維數(shù)組時(shí)要考慮這一點(diǎn)。例如:
  Dim MyArray(1 To 10000) As Integer
  定義一個(gè)數(shù)組,具有10000個(gè)元素,相當(dāng)于定義10000個(gè)變量。
  Dim MyArray(1 To 10,1 To 10000) As Integer
  定義一個(gè)二維數(shù)組,具有10×10000=10萬(wàn)個(gè)元素,而
  Dim MyArray(1 To 10,1 To 10,1 To 10000) As Integer
  定義一個(gè)三維數(shù)組,具有10×10×10000=100萬(wàn)個(gè)元素。
  8.2.3 默認(rèn)數(shù)組
  在VBA中,允許定義默認(rèn)數(shù)組,即數(shù)據(jù)類型為Variant(默認(rèn)類型)的數(shù)組。一般情況下,定義數(shù)組時(shí)都要設(shè)置其數(shù)據(jù)類型,例如:
  Dim MyArray(10) As String
  表示定義一個(gè)名為MyArrayr數(shù)組,該數(shù)組為字符串類型(即每個(gè)元素都為一個(gè)字符串型的變量)。
  若將其定義改為:
  Dim MyArray(10)
  則表示定義一個(gè)名為MyArray的默認(rèn)數(shù)組,與以下語(yǔ)句相同:
  Dim MyArray(10) As Variant
  使用默認(rèn)數(shù)組的好處是可以讓每個(gè)數(shù)組元素保存一個(gè)不同類型的值,得到一種混合狀態(tài)的數(shù)組。例如:
  Dim MyArray(1 To 5)
  MyArray(1)="朱元軍"
  MyArray(2)="男"
  MyArray(3)="30"
  MyArray(4)="大專"
  MyArray(5)="北京市"
  在以上數(shù)組中,第3個(gè)元素保存的是一個(gè)整型數(shù),其余元素保存的是字符串。
  8.3 動(dòng)態(tài)數(shù)組
  動(dòng)態(tài)數(shù)組是指在程序運(yùn)行時(shí)大小可以改變的數(shù)組。大小不可改變的數(shù)組稱為靜態(tài)數(shù)組。定義靜態(tài)數(shù)組時(shí),其下標(biāo)的下界和上界只能由常量來(lái)進(jìn)行設(shè)置,而動(dòng)態(tài)數(shù)組可使用變量來(lái)設(shè)置下標(biāo)。定義動(dòng)態(tài)數(shù)組一般分兩個(gè)步驟:首先在用戶窗體、模塊或過(guò)程中使用Dim或Public聲明一個(gè)沒(méi)有下標(biāo)的數(shù)組(不能省略括號(hào)),然后在過(guò)程中用ReDim語(yǔ)句重新定義該數(shù)組的大小。
  ReDim語(yǔ)句在過(guò)程級(jí)別中使用,用于為動(dòng)態(tài)數(shù)組變量重新分配在存儲(chǔ)空間。其語(yǔ)法格式如下:
  ReDim?。跴reserve]數(shù)組名(下標(biāo))?。跘s 數(shù)據(jù)類型]
  可以使用ReDim語(yǔ)句反復(fù)改變數(shù)組的元素及維數(shù)的數(shù)目,但是不能在將一個(gè)數(shù)組定義為某種數(shù)據(jù)類型之后,再使用ReDim將該數(shù)組改為其他數(shù)據(jù)類型,除非是Variant所包含的數(shù)組。
  如果使用了Preserve關(guān)鍵字,那么只能重定義數(shù)組最后一維的大小,并且不能改變維數(shù)的數(shù)目。例如,以下代碼中,首先由用戶輸入一個(gè)數(shù)值,設(shè)置數(shù)組下標(biāo)的上界;然后要求用戶輸入每個(gè)元素的值,并將用戶輸入的值輸出到“立即窗口”中。
  Dim i As Integer, j As Integer
  i = Val(InputBox("請(qǐng)輸入數(shù)組的上界","定義動(dòng)態(tài)數(shù)組",5))
  ReDim DArray(i)
  For j = 1 To i
   DArray(j) = InputBox("請(qǐng)輸入數(shù)組的第" & j & "個(gè)元素的值")
  Next
  For j = 1 To i
             Debug.Print DArray(j)
   Next
  End Sub
  以上代碼在模塊的聲明部分定義了一個(gè)動(dòng)態(tài)數(shù)組DArray,然后在“動(dòng)態(tài)數(shù)組”過(guò)程中使用變量i重新定義該動(dòng)態(tài)數(shù)組的大?。╥的值由用戶輸入)。執(zhí)行以上代碼時(shí),將首先打開如圖8-6所示的對(duì)話框,讓用戶設(shè)置數(shù)組的上界。
                                          
  按用戶輸入的值對(duì)數(shù)組重設(shè)大小后,將打開如圖8-7所示對(duì)話框,要求用戶輸入每一個(gè)元素的值,最后在“立即窗口”中輸出數(shù)組中每個(gè)元素的值。
  8.4 數(shù)組的基本操作
  聲明一個(gè)數(shù)組后,就可以對(duì)數(shù)組或數(shù)組中的元素進(jìn)行操作了。操作通常包括數(shù)組的初始化、數(shù)組元素的復(fù)制及刪除等。
  8.4.1數(shù)組的初始化
  在VBA中,創(chuàng)建數(shù)組后將自動(dòng)初始化數(shù)組中的每個(gè)元素:對(duì)于數(shù)值型的數(shù)組,每個(gè)元素都將清零件如果是字符串型的數(shù)組,每個(gè)元素將初始化為空字符串。
  注意:如果是重定義動(dòng)態(tài)數(shù)組,并且使用了Preserve關(guān)鍵字,則不會(huì)對(duì)已有元素進(jìn)行初始化,而只對(duì)新增加的元素進(jìn)行初始化。
  在對(duì)數(shù)組中的元素進(jìn)行處理之前,仍可能需要對(duì)數(shù)組元素進(jìn)行初始化。一般使用循環(huán)語(yǔ)句來(lái)進(jìn)行操作,可讓用戶逐個(gè)輸入數(shù)組的初始值;也可按一定的規(guī)則讀取工作表單元格中的值來(lái)對(duì)數(shù)組賦初始值。例如,以下代碼要求用戶集資輸入10個(gè)數(shù)組元素的初始值。
  For?。椋??。裕铩?0
   MyArray(i) = InputBox("請(qǐng)輸入數(shù)組的第" & i & "個(gè)元素的值")
  Next
  執(zhí)行以上代碼,將反復(fù)顯示輸入框,讓用戶輸入值,并保存到對(duì)應(yīng)的數(shù)組元素中。
  注意:InputBox函數(shù)返回的是字符串類型。如果數(shù)組定義為數(shù)值型,還需要使用相關(guān)的函數(shù)將用戶輸入的內(nèi)容進(jìn)行轉(zhuǎn)換,如用Val函數(shù)將字符串轉(zhuǎn)換為數(shù)值,也可以使用如Ccur,Cdate,CDbl,Cint等相關(guān)函數(shù)進(jìn)行轉(zhuǎn)換。
  以下代碼使用工作表單元格中的數(shù)據(jù)來(lái)為數(shù)組元素賦初始值。
  Sub ArrayInit()                                                          '使用工作表單元格中的數(shù)據(jù)來(lái)為數(shù)組元素賦初始值
    Dim MyArray(5,5)
    Dim i As Integer, j As Integer
    For i = 1 To 5
     For j = 1 To 5
       MyArray(i,j) = Worksheets("sheet2").Cells(i,j)
     Next j
    Next i
  End Sub
  工作表就相當(dāng)于一個(gè)二維數(shù)組,每個(gè)單元格就是二維數(shù)組中的一個(gè)元素。使用工作表中某部分單元格為數(shù)組賦初值時(shí),通過(guò)兩個(gè)循環(huán)的嵌套就可完成。
  通過(guò)InputBox函數(shù)初始化數(shù)組時(shí),需要用戶逐個(gè)輸入,速度很慢。在VBA中,還可使用Array函數(shù)來(lái)為數(shù)組元素賦值,把一個(gè)數(shù)據(jù)集讀入數(shù)組中。其語(yǔ)法格式如下:
  數(shù)組變量名?。健rray(數(shù)據(jù)集)
其中“數(shù)組變量名”是預(yù)先定義的數(shù)組名,后面不跟括號(hào);函數(shù)中的“數(shù)據(jù)集”是由一些常數(shù)構(gòu)成的數(shù)據(jù)集合,各值之間用逗號(hào)分開。例如:
  Sub ArrayInitl()                                         '使用Array函數(shù)初始化數(shù)組
   Dim MyArray, i As Integer
   MyArray = Array("星期日","星期二","星期三","星期四","星期五","星期六")
   For i = 0 To 6
    Debug.Print MyArray(i)
   Next
  End Sub
  字符串“星期日”、“星期一”、“星期三”、“星期四”、“星期五”和“星期六”分別賦給數(shù)組MyArray中的各對(duì)應(yīng)元素,即MyArray(0)=“星期日”、MyArray(2)=“星期一”……MyArray(6)=“星期六”。
  注意:因?yàn)锳rray函數(shù)的返回值為Variant類型,所以在使用Array函數(shù)給數(shù)組變量賦初值之前,定義數(shù)組時(shí)只能將其定義為Variant類型,且不能設(shè)置其下標(biāo),否則將顯示“不能給數(shù)組賦值”錯(cuò)誤提示。
  8.4.2 數(shù)組元素的復(fù)制
  單個(gè)的數(shù)組元素可像普通變量一樣進(jìn)行訪問(wèn)和賦值。因此,要將一個(gè)數(shù)組中的值復(fù)制到另一個(gè)數(shù)組時(shí),使用For循環(huán)語(yǔ)句將數(shù)組元素逐個(gè)復(fù)制即可。例如:
  Sub 數(shù)組元素的復(fù)制()
    Dim MyArray1(5) As Integer,MyArray2(5) As Integer
    Dim i As Integer
    For i = 1 to 5
      MyArray1(i) = i
    Next
    For i = 1 To 5
                      MyArray2(i) = MyArray1(i)
    Next
  End Sub
  在以上代碼中,如果將數(shù)組MyArray2聲明為一個(gè)Variant變量,那么通過(guò)一條語(yǔ)句就能將MyArray1中的所有元素復(fù)制到MyArray2中。
  Sub 數(shù)組元素的復(fù)制()
    Dim MyArray1(5) As Integer,MyArray2 As Variant
      Dim?。椋健? To 5
      MyArray1(i)= i
    Next
    MyArray2 = MyArray1                                   '將數(shù)組元素保存到Variant變量中
  End Sub
  通過(guò)MyArray2=MyArray1語(yǔ)句賦值后,變量MyArray2將保存一個(gè)數(shù)組變量。可使用MyArray2(1),MyArrqy2(2)的形式訪問(wèn)數(shù)組中每個(gè)元素的值。
  8.4.3 數(shù)組的清除
  對(duì)于靜態(tài)數(shù)組,當(dāng)創(chuàng)建完成后,其內(nèi)存空間也分配完成,數(shù)組的大小將不能再改變。有時(shí)可能需要清除數(shù)組的內(nèi)容或?qū)?shù)組重新定義,可使用Erase語(yǔ)句來(lái)完成。其語(yǔ)法格式如下:
  Erase 數(shù)組名1,數(shù)組名2,……
  使用Erase語(yǔ)句可重新初始化大小固定的數(shù)組的元素,以及釋放動(dòng)態(tài)數(shù)組的存儲(chǔ)空間。
  注意:在Erase語(yǔ)句中,只給出數(shù)組名即可,不能帶括號(hào)和下標(biāo)。
  Erase語(yǔ)句根據(jù)參數(shù)是靜態(tài)數(shù)組還是動(dòng)態(tài)數(shù)組而采取完全不同的行為。
  如果參數(shù)為靜態(tài)數(shù)組,Erase按表8-1所示的規(guī)則來(lái)設(shè)置固定數(shù)組的元素。
          
   如果參數(shù)為動(dòng)態(tài)數(shù)組,將刪除整個(gè)數(shù)組結(jié)構(gòu)并釋放卻動(dòng)態(tài)數(shù)組所使用的內(nèi)存。在下次引用該動(dòng)態(tài)數(shù)組之前,程序必須使用ReDim語(yǔ)句來(lái)重新定義該數(shù)組變量的維數(shù)。
  也就是說(shuō),靜態(tài)數(shù)組在使用Erase語(yǔ)句后仍然存在,只是其內(nèi)容被清空;而動(dòng)態(tài)數(shù)組使用Erase語(yǔ)句后即不存在了。例如:
  Sub 刪除數(shù)組()
    Dim MyArray() As Integer          '動(dòng)態(tài)數(shù)組
    Dim MyArray1(5)  As Integer           '靜態(tài)數(shù)組
    Dim?。椤s Integer
    i=5
    ReDim MyArray(i)
    For?。椋? To 5
      MyArray1(i)?。健。?/div>
      MyArray(i)=?。?/div>
    Next
    Erase MyArray,MyArray1
    Debug.Print MyArray1(1)          ?。ъo態(tài)數(shù)組被初始化,其元素值為0
    Debug.Print MyArray(1)           '動(dòng)態(tài)數(shù)組被刪除,將出錯(cuò)
  End Sub
  程序中首先定義了一個(gè)動(dòng)態(tài)數(shù)組MyArray和一個(gè)靜態(tài)數(shù)組MyArray1,然后使用循環(huán)語(yǔ)句對(duì)兩個(gè)數(shù)組的元素賦初始值,再使用Erase語(yǔ)句刪除這兩個(gè)數(shù)組,最后再訪問(wèn)兩個(gè)數(shù)組中的一個(gè)元素。對(duì)于靜態(tài)數(shù)組,使用Erase語(yǔ)句只是將其初始化,所以MyArray1(1)的值為0;對(duì)于動(dòng)態(tài)數(shù)組,使用Erase語(yǔ)句后該數(shù)組就不存在了,所以將顯示錯(cuò)誤提示。
  8.4.4 數(shù)組函數(shù)
  在程序中,有時(shí)需要判斷某個(gè)變量是否為數(shù)組,或數(shù)組的下標(biāo)范圍等。VBA提供了相應(yīng)的函數(shù)來(lái)進(jìn)行這些操作。
  VBA中操作數(shù)組的主要有5個(gè)函數(shù):Array,IsArray,Erase,Lbound和Ubound。其中Array和Erase已在前面進(jìn)行了介紹,下面介紹另三個(gè)函數(shù)的使用方法。
  1. 檢測(cè)變量是否為數(shù)組
  IsArray函數(shù)可檢查指定的變量是否為一個(gè)數(shù)組:如果指定變量是一個(gè)數(shù)組,返回值為True,否則返回False。對(duì)于包含數(shù)組的Variant表達(dá)式來(lái)說(shuō),IsArray尤為有用。例如:
  Dim MyArray(1 To 5) As Integer,YourArray,MyCheck      ?。暶鲾?shù)組變量
  YourArray = Array(1,2,3)                    '使用數(shù)組函數(shù)
  MyCheck?。健sArray(MyArray)                    '返回True
  MyCheck?。健sArray(YourArray)                   '返回True
  2. 獲得數(shù)組下標(biāo)的范圍
  LBound函數(shù)和UBound函數(shù)可獲得數(shù)組下標(biāo)的下界和上界。其語(yǔ)法格式為:
  LBound(數(shù)組名[,維數(shù)])
  UBound(數(shù)組名[,維數(shù)])
  其中“維數(shù)”為“1”表示一維,“2”表示二維,如此類推。如果省略該參數(shù),表示返回一維的下標(biāo)下界或上界。例如,定義以下數(shù)組
  Dim A(1 To?。保埃?,0 To?。?,-3 To?。矗?/div>
  則使用LBound函數(shù)的返回值分別為:
  LBound(A,1)             ?。Х祷刂禐椋?/div>
  LBound(A,2)             ?。Х祷刂禐?
  LBound(A,3)             ?。Х祷刂禐?3
 
★★
 
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服