Yanıtlar:
Nesne dışı dönüş türleri için, değeri işlevinizin adına şu şekilde atamanız gerekir:
Public Function test() As Integer
test = 1
End Function
Örnek kullanım:
Dim i As Integer
i = test()
İşlev bir Nesne türü döndürürse, Set
anahtar sözcüğü aşağıdaki gibi kullanmanız gerekir :
Public Function testRange() As Range
Set testRange = Range("A1")
End Function
Örnek kullanım:
Dim r As Range
Set r = testRange()
İşlev adına bir dönüş değeri atamanın, işlevinizin yürütülmesini sonlandırmayacağını unutmayın. İşlevden çıkmak istiyorsanız, açıkça söylemeniz gerekir Exit Function
. Örneğin:
Function test(ByVal justReturnOne As Boolean) As Integer
If justReturnOne Then
test = 1
Exit Function
End If
'more code...
test = 2
End Function
Belgeler: http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx
Range
örneğin gibi ), Set
normal bir yöntemde bir nesne değişkeni ayarlarsanız kullandığınız gibi kullanmanız gerekir . Dolayısıyla, örneğin, "test" bir Aralık döndüren bir işlev olsaydı, return ifadesi şöyle görünür set test = Range("A1")
.
set
yapmak sorunlara yol açabilir. Ben olmadan sorunları yaşadım, ama eğer kullanmazsam set
:).
set test = Range("A1")
tam olarak eşdeğer olan test = Range("A1").Value
"test" yerine bir Range daha Variant, olarak tanımlanır.
VBA işlevleri, işlev adının kendisine bir tür değişken olarak davranır. Yani, " return
" ifadesi kullanmak yerine şunu söylerdiniz:
test = 1
Bununla birlikte, bunun işlevden kopmadığına dikkat edin. Bu ifadeden sonraki kodlar da yürütülür. Böylece, farklı değerler atayan birçok atama ifadeniz olabilir test
ve işlevin sonuna ulaştığınızda değer ne olursa olsun döndürülen değer olacaktır.
Dönüş değerinin işlev adına ayarlanması hala Java (veya diğer) ifadesiyle tam olarak aynı değildir return
, çünkü return
java'da işlevden şu şekilde çıkar:
public int test(int x) {
if (x == 1) {
return 1; // exits immediately
}
// still here? return 0 as default.
return 0;
}
VB'de, işlevinizin sonunda dönüş değerini ayarlamıyorsanız tam eşdeğer iki satır alır . Yani, VB'de kesin sonuç şu şekilde görünecektir:
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
Bu durumda, dönüş değişkenini yöntemdeki diğer değişkenler gibi kullanabileceğinizi bilmek de güzel. Bunun gibi:
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
Ya da, dönüş değişkeninin nasıl çalıştığına dair en uç örnek (ancak aslında nasıl kod yazmanız gerektiğine dair iyi bir örnek değil) - sizi geceleri ayakta tutacak olan:
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
Variant
ve hedefiniz bir dizi döndürmekse, böyle ReDim test(1 to 100)
bir şey bir hatayı tetikler. Ayrıca, temel tip gibi davranmak mümkün olsa da ,Integers
biraz unidiomatik olarak kabul edilir. Kodun okunmasını zorlaştırır. VBA programcıları, bir işlevin ne yaptığını anlamak için işlev adına atanan satırları tarar. İşlev adını normal bir değişken olarak kullanmak gereksiz yere bunu gizler.
Exit Function
ilgilidirreturn
ReDim test(1 to 100)
'test' bir dizi olarak bildirilmediğinden bir hatayı tetiklemeden yapamazsınız ! ve başka hiçbir nedenle! Bir işlevi dizi olarak bildiremezsiniz. Bunu bir olarak ilan edin Variant
, sonra bu dizinin içinde çıkış dizinizi oluşturun (Dinamik veya Statik olabilir) test
ve sonra bu diziyi test
bir dönüş değeri olarak atayın ("=") . Bunun gibi ReDim
, daha fazla manipüle etmek için, döndürülen değeri bir değişkene atamanız gerekir, örneğin Dim x as Variant
ve çağırın x = test
, bundan sonra x
yaptığınız şey budur test
!