vba 傳遞參數值時,分為Byval 和Byref
參數分為形參和實參,
形參指的是過程名稱中用括號括起來的參數,
實參指的的是調用過程中,向過程傳遞的數據參數。
可以理解為:形參相當於公式中的自變量,實參相當於使用公式時代入自變量中的具體數值。
Byref,地址傳遞參數,傳遞的是地址,過程操作的是變量的地址
Byval,值傳遞參數,將變量的內容復制了一遍,過程操作的是另外一個變量,只不過這兩個變量名稱一樣,值一樣
Vba中,參數傳遞的默認方式是Byref,因為本質想法是對於相同命名的參數,在系統中采用同一個數值。
Sub ByRefByVal() Dim A As Integer, B As Integer A = 1 B = 2 VarPtr (A) VarPtr (B) Call AAA(A, B) Debug.Print A, B Call BBB(A, B) Debug.Print A, B End Sub
Sub BBB(ByRef Abbb As Integer, ByRef Bbbb As Integer) Abbb = Abbb + 1 VarPtr (Abbb) Bbbb = Bbbb + 1 VarPtr (Bbbb) End Sub
Sub AAA(ByVal Aaaa As Integer, ByVal Baaa As Integer) Aaaa = Aaaa + 1 VarPtr (Aaaa) Baaa = Baaa + 1 VarPtr (Baaa) End Sub
其中,call BBB(A,B)后,A=2,B=3
call AAA(A,B)后,A=1,B=2
值傳遞,相當於傳的是一個副本,對於副本的操作不影響正本
地址傳遞,相當於是一個共有變量,傳的是地址,該變量可以在過程中改變。
所以,聯合編寫程序時,我不希望自己的函數值受到別人的影響,通常會設定要按值傳遞,
值傳遞只是將變量的內容復制一份而已,函數進行操作的其實是另一個變量,只是另一個變量的值和傳遞的變量值是相同的。 而地址傳遞是直接把變量的地址傳遞給函數,這時函數是直接對原來的變量進行操作的。所以值會變化。 舉例說吧:值傳遞就相當於克隆了一個同樣的變量,操作的是克隆出來的那個,原來的變量沒有變化,但是地址傳遞是直接對原來的變量進行操作,沒有克隆新的變量。。。懂了吧,,, 也可以這樣理解:比如要考試了,你有一份復習題,值傳遞就相當於別人借你的試卷去復印,然后在復印的那份上面做筆記,而地址傳遞就是別人直接在你原有的試卷上做筆記,沒有復印,所以等你拿回來你會發現自己的試卷亂七八糟的,,,這下應該懂了哦。。。