大家好,我們今日繼續(xù)講解VBA代碼解決方案的第124講內(nèi)容:VBA程序執(zhí)行過程中,參數(shù)的傳遞形式。在代碼的編寫過程中,為了深入的理解代碼,有時候要對一些理論的知識必須要做必要的深入了解。我將在這節(jié)和下階內(nèi)容中著重講解程序在運行時參數(shù)是如何傳遞的。理論的成分多些,但還是希望朋友們能好好掌握。
首先,我們先來理解一下幾個定義:什么是形式參數(shù),什么是實際參數(shù),什么是參數(shù)的傳遞,參數(shù)傳遞有幾種形式。
1形式參數(shù) 指出現(xiàn)在Sub 和Function過程中的變量名、數(shù)組名。該過程在被調(diào)用前,沒有為它們分配內(nèi)存,其作用是說明自變量的類型和形態(tài)以及在過程中的作用。形參可以是變量名,也可以是數(shù)組名。
2 實際參數(shù):就是在調(diào)用Sub 和Function過程時,從主調(diào)過程傳遞給被調(diào)用過程的參數(shù)值。實參可以是變量名、數(shù)組名、常數(shù)或表達式。在過程調(diào)用傳遞參數(shù)時,形參與實參是按位置結(jié)合的,形參表和實參表中對應的變量名可以不必相同,但它們的數(shù)據(jù)類型、參數(shù)個數(shù)及位置必須一一對應。
3 參數(shù)的傳遞:在程序運行過程中,實際參數(shù)將參數(shù)值傳遞給相應的形式參數(shù),然后在函數(shù)中實現(xiàn)數(shù)據(jù)處理和返回的過程。
4 參數(shù)的傳遞有兩種:按值傳遞和按地址傳遞
① 按值傳遞:在過程被調(diào)用時,傳遞給形參的是調(diào)用過程中的相應實參的值,形參與實參各占有不同位置的儲存空間,被調(diào)用過程在執(zhí)行過程中,改變了形參變量的值,但不會調(diào)用過程的實參值。在函數(shù)聲明行在參數(shù)名稱之前加上關(guān)鍵字ByVal。
② 按地址傳遞:就是當調(diào)用一個過程時,是把實參變量的內(nèi)存地址(指針)傳遞給被調(diào)用過程的形參,也就是說形參與實參使用相同地址的內(nèi)存單元。因此當在被調(diào)用過程中改變形參的值,就等于改變了實參的值。
上面的幾個定義或許你不是很理解,下面我們看一個實例:
Sub MynzNumbers()
Dim a As Integer, b As Integer, c As Integer
a = 10
b = 20
c = 30
MsgBox MyAverage(a, b, c) & ' ' & a & ' ' & b & ' ' & c
End Sub
Function MyAverage(ByVal a, ByVal b, ByVal c)
a = a + 60
MyAverage = (a + b + c) / 3
End Function
代碼截圖:
看了上面的代碼,大家想想maxbox彈出的對話框是什么內(nèi)容呢?
看看上面的結(jié)果,是否和你想的一致呢?
上述過程中使用關(guān)鍵字ByVal在參數(shù)名稱前,可以防止函數(shù)改變參數(shù)值。MynzNumbers給三個變量賦值,再調(diào)用函數(shù)MyAverage來計算該三個變量的平均值。函數(shù)的參數(shù)就是變量a,b和 c。注意,所有變量的前面都有關(guān)鍵字ByVal。在計算均值之前,函數(shù)MyAverage 改變了變量a的值,在函數(shù)內(nèi)部,變量a等于70(10+60),因此,當函數(shù)將計算的均值傳遞給過程MynzNumbers時,MyAverage顯示的結(jié)果是40而不是20,接下來的三個顯示每個變量的內(nèi)容,變量儲存的內(nèi)容和它們開始被賦的值一致——10,20,30。
那么:
1 如果不是按值傳遞,結(jié)果會是什么呢?
2 a,b,c 變量傳遞的又是如何由實參變成形參的呢?過程又是如何進行的呢?
3 形參會改變指針嗎?
我們下節(jié)內(nèi)容再接著談。
今日內(nèi)容回向:
1 什么是形參、實參?
2 如何理解參數(shù)的傳遞過程?參數(shù)的傳遞有幾種形式?