2010-05-06 157 views
186

如何從函數返回結果?如何從VBA函數返回結果

例如:

Public Function test() As Integer 
    return 1 
End Function 

這給出了一個編譯錯誤。

如何讓這個函數返回一個整數?

+5

文檔:http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx – 2014-09-15 07:07:55

回答

286

對於非對象返回類型,您必須將值分配給你的函數的名稱,如:

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

+26

爲了完整起見,應該注意的是,當您返回一個對象例如'Range'),您需要像使用常規方法設置對象變量那樣使用'Set'。因此,例如,如果「test」是一個返回Range的函數,則返回語句看起來像這樣:'set test = Range(「A1」)'。 – 2013-03-21 15:23:08

+0

這是爲什麼@JayCarr? – PsychoData 2014-02-11 14:07:52

+3

@PsychoData - 簡單地說,因爲這就是你如何設置一個對象變量的一般情況,而沒有'set'就會導致問題。我有問題沒有,但如果我使用'set'我不:)。 – 2014-02-11 14:36:38

75

VBA函數將函數名本身作爲一種變量。因此,而不是使用「return」的聲明,你只是說:

test = 1 

通知,不過,這並沒有打出來的功能。此聲明後的任何代碼也將被執行。因此,可以有許多賦值語句將不同的值賦予test,並且當到達函數結尾時的任何值都將返回值。

+0

其實你用更多的信息更清楚地回答了這個問題(這可能會導致另一個問題,從新到VBA的人)。保持良好的工作 – Adarsha 2010-05-06 14:39:22

+0

對不起,看起來你只是回答了我的回答,我剛剛回答了同樣的事情,但只是增加了它沒有突破功能的事實。這是一個很好的補充,我只是覺得它更適合作爲評論。我不確定什麼是適當的禮儀,我想這樣做是不禮貌的,因爲這是一個很好的答案,但它不會讓我撤銷它。 – Dan 2010-05-06 15:20:21

28

只需設置返回值函數名仍然沒有完全相同一樣的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 
+2

「也很高興知道你可以像方法中的任何其他變量一樣使用返回變量」is * mostly * true - 但例如,如果返回類型是「Variant」,並且您的目標是返回一個數組,那麼像'ReDim test(1到100)'會引發錯誤。另外,即使它*可以像對待像Integers這樣的基本類型,它被認爲有點單一。它使代碼更難閱讀。 VBA程序員掃描分配給函數名稱的行來理解函數的功能。使用函數名稱作爲常規變量不必要地掩蓋了這一點。 – 2016-04-04 13:49:46

+0

@JohnColeman,完全同意這兩點。絕不應該將最後一個例子作爲推薦的方法之一。但是,主題問題是關於如何返回一個變量,所以這只是一個試圖全面解釋VB的返回結果,以及它們如何工作。當然,最後一種情況並不是建議。 (我當然不會將代碼作爲一個例子。) 所以,你的觀點是很好的,很好的補充。謝謝。 – LimaNightHawk 2016-04-04 15:00:48

+0

它*對於小函數很有用,並且是任何VBA程序員都應該知道的東西,所以我沒有提到它的問題。我只是認爲應該包括一個警告。 – 2016-04-04 15:10:57

-2

在下面的代碼保存返回值的變量retVal然後MsgBox可用於顯示的值:

Dim retVal As Integer 
retVal = test() 
Msgbox retVal