VBA數(shù)組中的常見(jiàn)錯(cuò)誤

2021-12-08 14:30 更新
使用數(shù)組時(shí),出錯(cuò)是很容易的。如果你試圖給數(shù)組賦予比聲明數(shù)組時(shí)更多的成員的話(huà),VBA就會(huì)顯示錯(cuò)誤信息“下標(biāo)越界”。


運(yùn)行錯(cuò)誤

圖7-4 該錯(cuò)誤出現(xiàn)于試圖訪(fǎng)問(wèn)并不存在的數(shù)組成員


假設(shè)你聲明了一個(gè)包含6個(gè)成員的一維數(shù)組,而你卻試圖給第八個(gè)成員賦值,當(dāng)你運(yùn)行該過(guò)程時(shí),VB無(wú)法找到第八個(gè)成員,所以顯示錯(cuò)誤信息。點(diǎn)擊調(diào)試按鈕,VB將導(dǎo)致錯(cuò)誤的代碼行(見(jiàn)圖7-5)加亮。檢查數(shù)組的聲明語(yǔ)句,并且更改被加亮代碼行括號(hào)里的索引號(hào)?!跋聵?biāo)越界”錯(cuò)誤經(jīng)常是由使用循環(huán)的過(guò)程引發(fā)的。下面的過(guò)程Zoo1就是這種情況的一個(gè)例子。在用戶(hù)取消在輸入框里輸入數(shù)據(jù)之前,循環(huán)里的語(yǔ)句反復(fù)被執(zhí)行。在執(zhí)行該過(guò)程時(shí),當(dāng)變量 i 等于4的時(shí)候,VB無(wú)法在這個(gè)只有三個(gè)成員的數(shù)組里找到第四個(gè)成員,那么錯(cuò)誤信息就出現(xiàn)了。修改后的過(guò)程Zoo2示范了前面章節(jié)里介紹的LBound和UBound函數(shù)如何能夠避免試圖訪(fǎng)問(wèn)不存在的數(shù)組成員的錯(cuò)誤。


錯(cuò)誤調(diào)試

圖7-5 當(dāng)你點(diǎn)擊錯(cuò)誤信息的調(diào)試按鈕,VB就會(huì)加亮引發(fā)錯(cuò)誤的語(yǔ)句


1.在當(dāng)前工程里插入新模塊,命名為Errors_In_Arrays
2.輸入下列過(guò)程Zoo1和Zoo2:

Sub Zoo1()
'this procedure triggers an error "Subscript out of range" 本過(guò)程引發(fā)“下標(biāo)越界”錯(cuò)
誤
Dim zoo(3) As String
Dim i As Integer
Dim response As String
i = 0
Do
i = i +1
response = InputBox("Enter a name of animal:")
zoo(i) = response
Loop until response = ""
End Sub
Sub Zoo2()
'this procedure avoids the error "Subscript out of range"本過(guò)程避免“下標(biāo)越界”錯(cuò)誤
Dim zoo(3) As String
Dim i As Integer
Dim response As String
i = 1
Do While i>=LBound(zoo) And i <=UBound(zoo)
response = InputBox("Enter a name of animal:")
If response = "" Then Exit Sub
zoo(i) = response
i = i + 1
Loop
For i = LBound(zoo) To UBound(zoo)
MsgBox zoo(i)
Next
End Sub
另外一個(gè)使用數(shù)組時(shí)經(jīng)常碰到的錯(cuò)誤是類(lèi)型不匹配。要避免這類(lèi)錯(cuò)誤,就要牢記一個(gè)數(shù)組的每個(gè)成員都必須具有相同的數(shù)據(jù)類(lèi)型。如果你試圖給數(shù)組成員賦予和數(shù)組聲明的數(shù)據(jù)類(lèi)型矛盾的數(shù)據(jù)的話(huà),你就將在執(zhí)行代碼時(shí)收到“類(lèi)型不匹配”的錯(cuò)誤。要讓一個(gè)數(shù)組出錯(cuò)不同類(lèi)型的數(shù)據(jù)類(lèi)型的話(huà),你就得聲明數(shù)組為Variant類(lèi)型。

數(shù)組作為參數(shù)

在前面的章節(jié)中,你學(xué)習(xí)了數(shù)據(jù)可以在子過(guò)程或者函數(shù)過(guò)程之間作為必須或者可選參數(shù)傳遞。如果傳遞的參數(shù)不是過(guò)程執(zhí)行一定要的話(huà),那么這個(gè)參數(shù)名稱(chēng)就應(yīng)該在前面加關(guān)鍵字Optional。然而,有些時(shí)候,你事先并不知道你要傳遞多少個(gè)參數(shù)。一個(gè)典型的例子就是加法。你可能想要將兩個(gè)數(shù)字加和,或者,你也許要加和3個(gè),10個(gè),或者15個(gè)數(shù)字。使用關(guān)鍵字ParamArray,你就可以將一個(gè)包含任意個(gè)成員的數(shù)組傳遞給你的子過(guò)程和函數(shù)過(guò)程。下面的函數(shù)過(guò)程AddMultipleArgs將加和你所需要的任何多個(gè)數(shù)字。該函數(shù)以數(shù)組myNumbers的聲明開(kāi)始,注意關(guān)鍵字ParamArray的使用。該數(shù)組必須聲明為Variant類(lèi)型,并且它必須是函數(shù)過(guò)程的最后一個(gè)參數(shù)。

1.在當(dāng)前工程里插入一新模塊,命名為ParameterArrays
2.輸入如下函數(shù)過(guò)程AddMultipleArgs:

Function AddMultipleArgs(ParamArray myNumbers() As Variant)
Dim mySum As Single
Dim myValue As Variant
For each myValue in myNumbers
mySum=mySum+myValue
Next
AddMultipleArgs = mySum
End Function
3.  激活立即窗口來(lái)試驗(yàn)上面的函數(shù),在立即窗口里輸入指令:
?AddMultipleArgs(1, 23.24, 3, 24, 8, 34)
當(dāng)你按下回車(chē)鍵,VB就會(huì)返回上面參數(shù)的總和:93.24。你可以提供無(wú)限制的參數(shù)數(shù)目。注意,每個(gè)函數(shù)的參數(shù)之間要用逗號(hào)分開(kāi)。



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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)