1. 程式人生 > 其它 >資料學習系列1-VBA陣列和迴圈語句(3)

資料學習系列1-VBA陣列和迴圈語句(3)

現在要執行一些例如填充陣列或顯示陣列成員的任務了,你在第六章裡學過的好些個迴圈語句(參見For…Next和For Each …Next迴圈)就變得非常方便了。現在是時候將你所學到的技巧結合起來使用了。如何重新編寫FavoriteCities過程,讓每個城市名稱在不同的資訊框裡顯示出來?下面顯示的過程FavoriteCities2將原來過程的最後部分取代為For Each…Next迴圈:

Sub FavoriteCities2()
'now declare the array
Dim cities(6) As String
Dim city As Variant
'assign the values to array elements
cities(1) = "Baltimore"
cities(2) = "Atlanta"
cities(3) = "Boston"
cities(4) = "Washington"
cities(5) = "New York"
cities(6) = "Trenton"
'display the list of cities in separate messages
For Each city in cities
MsgBox city
Next
End Sub

注意For Each…Next迴圈使用的是Variant資料型別的變數city。回想在前面的章節裡,ForEach…Next讓你在一個集合的所有物件間或者一個數組的所有的成員間迴圈,並且對每個物件或成員執行同樣的操作。當你執行過程FavoriteCities2時,數組裡有幾個成員迴圈就會執行幾次。

我們來看一下過程FavoriteCities的另一種變化。在第四章裡,你練習了將引數作為變數傳遞給子過程和函式。過程FavoriteCities3示範瞭如何將陣列的成員傳遞給另一個過程。

1. 在當前模組裡,輸入下述兩個過程:

Sub FavoriteCities3()
'now declare the array
Dim cities(6) As String
'assign the values to array elements
cities(1) = "Baltimore"
cities(2) = "Atlanta"
cities(3) = "Boston"
cities(4) = "Washington"
cities(5) = "New York"
cities(6) = "Trenton"
'call another procedure and pass the array as argument
Hallo cities()
End Sub
Sub Hallo (cities() As String)
Dim counter As Integer
For counter = 1 to 6
MsgBox "Hello " & cities(counter)
Next
End Sub

過程Hallo的聲明裡有一個數組型別的引數——cities()。

2. 執行過程FavoriteCities3。將一個子過程的陣列成員傳遞給另一個子過程或者函式過程讓你可以在許多過程裡使用相同的陣列,而不需要重複的程式程式碼。

技巧:在過程之間傳遞陣列
當一個數組在一個過程裡被宣告時,它是區域性的,並且是不為其他過程所知的。然而,你可以將區域性陣列傳遞給其它的過程,通過在宣告語句裡,寫上陣列名稱,並且後面緊跟一對空括號。例如,語句Hallo cities() 呼叫一個名叫Hallo的過程,並且將陣列cities()傳遞給它。

這裡有個例子,如何將你新學到的關於陣列的知識和迴圈運用到現實生活中。如果你是個狂熱的彩票玩家的話,當你厭倦了選擇你的幸運號碼,你可以讓VB為你選擇。下面的過程Lotto使用1到51的六個數字填充陣列:

Sub Lotto()
Const spins = 6
Const minNum = 1
Const maxNum = 51
Dim t As Integer ‘looping variable in outer loop 外部迴圈變數
Dim i As Integer ‘looping variable in inner loop 內部迴圈變數
Dim myNumbers As String ‘string to hold all picks 儲存選號的字串
Dim lucky(spins) As String ‘array to hold generated picks 儲存產生的選號的陣列
myNumbers = ""
For t = 1 To spins
Randomize
lucky(t) = Int((maxNum-minNum+1) * Rnd )+ minNum)
'see if this number was picked before 檢查本數字是否之前被選出來過
For i = 1 To (t-1)
If lucky(t)=lucky(i) Then
lucky(t) = Int((maxNum–minNum+1) * Rnd)+ minNum) i = 0
End If
Next i
MsgBox "Lucky number is " & t & lucky(t)
myNumbers = myNumbers & " –" & lucky(t)
Next t
MsgBox "Lucky numbers are " & myNumbers
End Sub

Randomize語句將隨機數字發生器初始化。指令Int((maxNum-minNum+1) * Rnd + minNum)使用函式Rnd來產生一個在minNum和maxNum之間的隨機數值。函式Int將隨機數轉變為一個整數。除了給minNum和maxNum賦予常量之外,你也可以使用函式InputBox從使用者那裡獲得資料。

內部For…Next迴圈確保每個選出的數字是唯一的——它不能是之前選出的任何一個數字。如果你忽略了內部迴圈並且多次執行該過程,你很可能看到重複的號碼。

摘自-VBA陣列和迴圈語句_w3cschool