如何從函數返回結果?如何從VBA函數返回結果
例如:
Public Function test() As Integer
return 1
End Function
這給出了一個編譯錯誤。
如何讓這個函數返回一個整數?
如何從函數返回結果?如何從VBA函數返回結果
例如:
Public Function test() As Integer
return 1
End Function
這給出了一個編譯錯誤。
如何讓這個函數返回一個整數?
對於非對象返回類型,您必須將值分配給你的函數的名稱,如:
Public Function test() As Integer
test = 1
End Function
用法示例:
Dim i As Integer
i = test()
如果該函數返回一個對象類型,那麼你必須使用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
文檔:http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx
爲了完整起見,應該注意的是,當您返回一個對象例如'Range'),您需要像使用常規方法設置對象變量那樣使用'Set'。因此,例如,如果「test」是一個返回Range的函數,則返回語句看起來像這樣:'set test = Range(「A1」)'。 – 2013-03-21 15:23:08
這是爲什麼@JayCarr? – PsychoData 2014-02-11 14:07:52
@PsychoData - 簡單地說,因爲這就是你如何設置一個對象變量的一般情況,而沒有'set'就會導致問題。我有問題沒有,但如果我使用'set'我不:)。 – 2014-02-11 14:36:38
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
或者極端例如如何返回變量工作(但不一定是一個很好的例子,你應該如何實際代碼)-the一個,將讓你在夜間:
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
「也很高興知道你可以像方法中的任何其他變量一樣使用返回變量」is * mostly * true - 但例如,如果返回類型是「Variant」,並且您的目標是返回一個數組,那麼像'ReDim test(1到100)'會引發錯誤。另外,即使它*可以像對待像Integers這樣的基本類型,它被認爲有點單一。它使代碼更難閱讀。 VBA程序員掃描分配給函數名稱的行來理解函數的功能。使用函數名稱作爲常規變量不必要地掩蓋了這一點。 – 2016-04-04 13:49:46
@JohnColeman,完全同意這兩點。絕不應該將最後一個例子作爲推薦的方法之一。但是,主題問題是關於如何返回一個變量,所以這只是一個試圖全面解釋VB的返回結果,以及它們如何工作。當然,最後一種情況並不是建議。 (我當然不會將代碼作爲一個例子。) 所以,你的觀點是很好的,很好的補充。謝謝。 – LimaNightHawk 2016-04-04 15:00:48
它*對於小函數很有用,並且是任何VBA程序員都應該知道的東西,所以我沒有提到它的問題。我只是認爲應該包括一個警告。 – 2016-04-04 15:10:57
在下面的代碼保存返回值的變量retVal
然後MsgBox
可用於顯示的值:
Dim retVal As Integer
retVal = test()
Msgbox retVal
文檔:http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx – 2014-09-15 07:07:55