VBA二維數(shù)組的基礎(chǔ)介紹

2021-12-08 14:30 更新

既然你已經(jīng)知道了如何有規(guī)劃地產(chǎn)生一個清單(一維數(shù)組),是時候仔細(xì)看一下如何使用數(shù)據(jù)表了。下面的過程產(chǎn)生一個二維數(shù)組,儲存國家名稱,貨幣名稱和交換匯率。

Sub Exchange()
Dim t As String
Dim r As String
Dim Ex(3, 3) As Variant
t = Chr(9) 'tab
r = Chr(13) 'Enter
Ex(1, 1) = "Japan"
Ex(1, 2) = "Yen"
Ex(1, 3) = 128.2
Ex(2, 1) = "Mexico"
Ex(2, 2) = "Peso"
Ex(2, 3) = 9.423
Ex(3, 1) = "Canada"
Ex(3, 2) = "Dollar"
Ex(3, 3) = 1.567
MsgBox "Country " & t & t & "Currency" & t & "per US$" _
& r & r _
& Ex(1, 1) & t & t & Ex(1, 2) & t & Ex(1, 3) & r _
& Ex(2, 1) & t & t & Ex(2, 2) & t & Ex(2, 3) & r _
& Ex(3, 1) & t & t & Ex(3, 2) & t & Ex(3, 3), , _
"Exchange"
End Sub

當(dāng)你運(yùn)行過程Exchange時,你將看到一個信息框,顯示三列信息(見圖7-2)



圖7-2 顯示在信息框上的文本是可以自定義格式的。



數(shù)組的維數(shù):

Sub 數(shù)組示例():

Dim?x?As?Long,?y?As?Long
Dim?arr(1?To?10,?1?To?3)?'創(chuàng)建一個可以容下10行3列的數(shù)組空間
For?x?=?1?To?4
    For?y?=?1?To?3
        arr(x,?y)?=?Cells(x,?y)?'通過循環(huán)把單元格區(qū)域a1:c4的數(shù)據(jù)裝進(jìn)數(shù)組中
    Next?y
Next?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個元素

靜態(tài)和動態(tài)數(shù)組

到目前為止,本章介紹的都是靜態(tài)數(shù)組。靜態(tài)數(shù)組是具有確定大小的數(shù)組。當(dāng)你事先知道數(shù)組的大小時使用靜態(tài)數(shù)組。靜態(tài)數(shù)組的大小是在數(shù)組的聲明語句里確定的,例如,語句 DimFruits(10)AsString 聲明了一個由10個成員組成的叫做 Fruits 的靜態(tài)數(shù)組。

但是,萬一你不肯定你的數(shù)組會包含多少個成員呢?如果你的過程由用戶輸入決定,每次程序執(zhí)行時,用戶提供的成員數(shù)可能會變化的。你如果確保你聲明的數(shù)組不會浪費(fèi)內(nèi)存呢?

回想你聲明了一個數(shù)組后,VBA 會留出足夠的內(nèi)存來儲存數(shù)組。如果你聲明一個比你需要的更多成員的數(shù)組的話,你將浪費(fèi)計算機(jī)資源。這個問題的解決方法是讓你的數(shù)組變?yōu)閯討B(tài)的。動態(tài)數(shù)組是大小可以改變的數(shù)組。如果數(shù)組的大小每次都由程序運(yùn)行而決定的話,就使用動態(tài)數(shù)組。

1.  在當(dāng)前工程里插入一個新模塊并且重新命名為 DynamicArrays
2.  輸入下列過程 DynArray:
Sub DynArray( )
Dim counter As Integer
'declare a dynamic array
Dim myArray( ) As Integer
'specify the initial size of the array
Redim myArray(5)
Workbooks.Add
'populate myArray with values
For counter = 1 to 5
myArray(counter) = counter +1
ActiveCell.Offset(counter-1, 0).Value = myArray(counter)
Next
'change the size of myArray to hold 10 elements
Redim Preserve myArray(10)
'add new values to myArray
For counter = 6 To 10
myArray(counter) = counter * counter
With ActiveCell.Offset(counter-1, 0)
.Value = myArray(counter)
.Font.Bold = TrueEnd with
Next counter
End Sub
3.  將你的 Excel 窗口和 VB 編輯器窗口并排顯示
4.  逐步運(yùn)行過程 DynArray。你可以將鼠標(biāo)置于代碼中間,并且按下F8來執(zhí)行逐條語句。程序
DynArray 的結(jié)果如下圖所示。

圖7-3 顯示10個數(shù)據(jù)的數(shù)組

在過程 DynArray 里,Dim myArray() As Integer 語句聲明了一個叫做 myArray 的動態(tài)數(shù)組。盡管該語句聲明了數(shù)組,但是,沒有分配任何內(nèi)存給該數(shù)組。第一條 ReDim 語句明確了 myArray 的開始大小并且占據(jù)了10個字節(jié)的內(nèi)存讓它儲存5個成員,正如你所知,每個整型數(shù)據(jù)需要兩個字節(jié)的內(nèi)存。

語句 Workbooks.Add 打開一新工作簿,然后 For…Next 循環(huán)用數(shù)據(jù)填充數(shù)組 myArray 并且將數(shù)組的成員寫入工作表。在循環(huán)開始之前,變量 counter 等于1。循環(huán)里的第一條語句:
myArray(counter) = counter + 1
分配數(shù)值2給 myArray 的第一個成員。第二條語句:
ActiveCell.Offset(counter-1, 0).Value = myArray(counter)
將 myArray 成員的值輸入到當(dāng)前單元格里。當(dāng)前單元格為A1。因為變量 counter 等于1,所以上面的語句就等于:
ActiveCell.Offset(1-1, 0).Value = myArray(1)
或者
ActiveCell.Offset(0,0).Value = myArray(1)
上面的語句在單元格A1里輸入數(shù)據(jù)。循環(huán)里面的語句被執(zhí)行5次。VB在合適的工作表單元格里馬輸入數(shù)據(jù)并且進(jìn)行到下一語句:
ReDim Preserve myArray(10)
通常,當(dāng)你改變一個數(shù)組的大小時,你將失去該數(shù)組原來的所有數(shù)據(jù)。語句 ReDim 將數(shù)組重新初始化。然而,你可以將新成員加入到現(xiàn)存的數(shù)組里去,通過在語句 ReDim 后面帶上關(guān)鍵字 Preserve。換句話說,關(guān)鍵字 Preserve 保證重新改變大小的數(shù)組不會弄丟現(xiàn)有的數(shù)據(jù)。如果你忽略它,新數(shù)組將會
是空的。

第二個 For…Next 循環(huán)給數(shù)組 myArray 的第六,第七,第八,第九和第十個成員賦值。這次,數(shù)組成員的數(shù)值是相乘的:counter * counter。VB使用粗體將數(shù)組其它的數(shù)值輸入到合適的工作表的單元格里面。

技巧:確定數(shù)組大小
在使用數(shù)組之前,必須在 Dim 或 ReDim 語句里確定數(shù)組的大小。這意味著你不可以給數(shù)組成員賦值,直到你使用 Dim 或者 ReDim 語句聲明了該數(shù)組。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號