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