[英]How to return a result from a VBA function
如何從 function 返回結果?
例如:
Public Function test() As Integer
return 1
End Function
這會產生編譯錯誤。
如何讓這個 function 返回 integer?
對於非對象返回類型,您必須將值分配給函數的名稱,如下所示:
Public Function test() As Integer
test = 1
End Function
示例用法:
Dim i As Integer
i = test()
如果函數返回一個 Object 類型,那么您必須像這樣使用Set
關鍵字:
Public Function testRange() As Range
Set testRange = Range("A1")
End Function
示例用法:
Dim r As Range
Set r = testRange()
請注意,為函數名稱分配返回值不會終止函數的執行。 如果你想退出函數,那么你需要明確地說Exit Function
。 例如:
Function test(ByVal justReturnOne As Boolean) As Integer
If justReturnOne Then
test = 1
Exit Function
End If
'more code...
test = 2
End Function
文檔: 函數語句
VBA 函數將函數名稱本身視為一種變量。 因此,與其使用“ return
”語句,不如說:
test = 1
但是請注意,這並沒有超出函數的范圍。 此語句之后的任何代碼也將被執行。 因此,您可以有許多賦值語句為test
分配不同的值,當您到達函數末尾時,無論該值是什么,都將是返回的值。
只是將返回值設置為函數名還是和Java(或其他) return
語句不完全一樣,因為在java中, return
退出函數,像這樣:
public int test(int x) {
if (x == 1) {
return 1; // exits immediately
}
// still here? return 0 as default.
return 0;
}
在 VB 中,如果您沒有在函數末尾設置返回值,則完全等價的代碼需要兩行。 因此,在 VB 中,確切的推論如下所示:
Public Function test(ByVal x As Integer) As Integer
If x = 1 Then
test = 1 ' does not exit immediately. You must manually terminate...
Exit Function ' to exit
End If
' Still here? return 0 as default.
test = 0
' no need for an Exit Function because we're about to exit anyway.
End Function
既然是這種情況,很高興知道您可以像方法中的任何其他變量一樣使用返回變量。 像這樣:
Public Function test(ByVal x As Integer) As Integer
test = x ' <-- set the return value
If test <> 1 Then ' Test the currently set return value
test = 0 ' Reset the return value to a *new* value
End If
End Function
或者,返回變量如何工作的極端例子(但不一定是你應該如何實際編碼的好例子)——會讓你徹夜難眠的例子:
Public Function test(ByVal x As Integer) As Integer
test = x ' <-- set the return value
If test > 0 Then
' RECURSIVE CALL...WITH THE RETURN VALUE AS AN ARGUMENT,
' AND THE RESULT RESETTING THE RETURN VALUE.
test = test(test - 1)
End If
End Function
以下代碼將返回值存儲到變量retVal
中,然后MsgBox
可用於顯示該值:
Dim retVal As Integer
retVal = test()
Msgbox retVal
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.