redirect通过url_for传递参数_Excel VBA解读 | 进阶篇(127):Sub过程的参数传递技术...
學習Excel技術,關注微信公眾號:
excelperfect
前面用了幾篇文章詳細講解了Sub過程的語法及相關知識,本文進一步講解與Sub過程相關的一些“重要事項”,以進一步理解Sub過程的使用。
ByRef和ByVal
我們知道,可以在調用其他過程時,向該過程傳遞參數。通常使用ByVal來指定參數通過值傳遞,或者使用ByRef來指定參數通過引用傳遞。如果沒有指定限定詞,則默認為ByRef,即參數通過引用傳遞。
那么,什么是通過引用傳遞呢?先看下面的示例代碼:
Sub testMy()
??? Dim my As Long
??? my = 1
??? Call testYour(my)
??? Debug.Print my
End Sub
Sub testYour(ByRef your As Long)
??? your = your + 8
End Sub
運行testMy過程后的結果如下圖1所示,打印出變量my的值為9。
圖1
所謂引用傳遞,就是將調用過程的變量的引用傳遞給了被調用過程的參數變量。也就是說,它傳遞的是一個指針,該指針包含調用過程中的變量在內存中的地址。因此,調用過程中的變量與被調用過程中的變量都是指向內存中的同一地址,如下圖2所示。
圖2
這樣,被調用過程中對變量值的修改,實際上是對變量指向的內存中地址存儲的值的修改,因此,調用過程中的變量值也相應被修改。
與引用傳遞不同,值傳遞只是將調用過程中的變量的值賦給了被調用過程中的變量。如下面的代碼所示:
Sub testMy()
??? Dim my As Long
??? my = 1
??? Call testYour(my)
??? Debug.Print my
End Sub
Sub testYour(ByVal your As Long)
??? your = your + 8
End Sub
運行代碼后的結果如下圖3所示,打印出變量my的值仍為1。
圖3
可以看出,值傳遞并不會改變所傳遞的變量的值。這是因為,調用過程中的變量與被調用過程中的參數變量分別在不同的內存地址中存儲各自的值,如下圖4所示。
圖4
因此,被調用過程中的參數變量值的修改不會影響到調用過程中變量的值。
Sub過程不返回值嗎?
一般來說,Sub過程不返回值,Function過程才返回值(完美Excel后續文章將詳細講解Function過程)。然而,使用ByRef方式傳遞參數值,我們可以得到其“返回的值”。正如上文圖1所示的代碼,調用過程testYour后,my的值變為了9。
ParamArray
可以使用ParamArray來指定參數是一個包含任意元素的變體數組,但是只能作為Sub過程的參數列表的最后一個元素。也就是說,通過使用ParamArray指定參數,可以實現給Sub過程傳遞任意數量的變量。
看看下面的示例代碼:
Sub testParam()
??? Dim my As Long
??? my = 10
??? Call testOur(my, 1, 2, 3)
End Sub
Sub testOur(our As Long, ParamArray ArgsList() As Variant)
??? Dim lResult As Long
??? Dim vArg As Variant
??? For Each vArg In ArgsList
??????? lResult = our + vArg
???? ???Debug.Print lResult
??? Next
End Sub
打印的結果為11、12、13,如下圖5所示。
圖5
從代碼中可以看出,在調用過程testParam中,并沒有將參數作為數組來顯示傳遞,而是以逗號分隔的值來傳遞。
當然,也可以變量列表的形式來傳遞。例如:
Sub testParamByVar()
???Dim my As Long
???Dim your1 As Long
???Dim your2 As Long
???Dim your3 As Long
???my = 10
???your1 = 1
???your2 = 2
???your3 = 3
???Call testOur(my, your1, your2, your3)
End Sub
Sub testOur(our As Long,ParamArray ArgsList() As Variant)
???Dim lResult As Long
???Dim vArg As Variant
???For Each vArg In ArgsList
??????? lResult = our + vArg
??????? Debug.Print lResult
???Next
End Sub
運行testParamByVar過程后,打印出與上圖5相同的結果。
注意,ParamArray不能與ByRef、ByVal或者Optional同時使用。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的redirect通过url_for传递参数_Excel VBA解读 | 进阶篇(127):Sub过程的参数传递技术...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 反向传播算法_反向传播算法:定义,概念,
- 下一篇: 全球地区资料json 含中英文 经纬度_