VBA işlevinden sonuç döndürme


Yanıtlar:


429

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, Setanahtar 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


32
Tamlık için, bir nesneyi döndürürken ( Rangeörneğin gibi ), Setnormal 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").
Jay Carr

Neden @JayCarr?
PsychoData

4
@PsychoData - Bunun nedeni, genel olarak bir nesne değişkenini bu şekilde ayarlamanızdır ve bunu onsuz setyapmak sorunlara yol açabilir. Ben olmadan sorunları yaşadım, ama eğer kullanmazsam set:).
Jay Carr

1
Ben de başka bir VBA işlevi veya Sub çağırma ile karşılaştırıldığında, bir elektronik tablodan çağırdığınızda işlevin davranış farklı olduğunu belirtmek gerekir.
Doug Jenkins

2
Böylece, VBA içinde çağrıldığında işlevi, bir aralık nesnesi döndürür, ancak bir çalışma çağrıldığında sadece değeri döndürecektir set test = Range("A1")tam olarak eşdeğer olan test = Range("A1").Value"test" yerine bir Range daha Variant, olarak tanımlanır.
Doug Jenkins

86

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 testve işlevin sonuna ulaştığınızda değer ne olursa olsun döndürülen değer olacaktır.


Aslında soruyu daha fazla bilgi ile daha açık bir şekilde cevapladınız (bu, potansiyel olarak yeni bir VBA adamına başka bir soruya yol açabilir). İyi çalışmaya devam edin
Adarsha

Üzgünüm, sanki ilk cevabımla aynı şeyi cevapladınız, ama sadece fonksiyondan kopmadığı gerçeğini eklediniz. Güzel bir ek, sadece bir yorum olarak daha uygun olacağını düşündüm. Doğru görgü kuralının ne olduğundan emin değilim, sanırım sadece bunun için aşağı oy vermek biraz kaba oldu, çünkü iyi bir cevap, ama onu geri almama izin vermiyor.
Dan

41

Dönüş değerinin işlev adına ayarlanması hala Java (veya diğer) ifadesiyle tam olarak aynı değildir return, çünkü returnjava'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

2
"Dönüş değişkenini yöntemdeki diğer değişkenler gibi kullanabileceğinizi bilmek de güzel" çoğunlukla doğrudur - ancak örneğin, dönüş türü Variantve 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.
John Coleman

@ JohnColeman, her iki konuda da tamamen katılıyorum. Son örnek hiçbir şekilde önerilen yöntemlerden biri olmamalıdır. Ancak, konu sorusu Bir değişkenin nasıl döndürüleceği ile ilgilidir ve bu sadece VB'nin dönüş sonucunun tam bir açıklamasına ve nasıl çalıştıklarına dair bir girişimdir. Kesinlikle son dava bir öneri değildir. (Ben kesinlikle bir örnek olarak daha fazla kod olmaz.) Yani, puan iyi alınır ve iyi eklemeler. Teşekkür ederim.
LimaNightHawk

O ise ufacık fonksiyonlar için faydalıdır, ve bunu söz ile hiçbir sorun vardı bu yüzden herhangi bir VBA programcısı, yaklaşık bilmeli şeydir. Sadece bir uyarının dahil edilmesi gerektiğini düşündüm.
John Coleman

Nasıl olduğunu açıklayan teşekkürler Exit Function ilgilidirreturn
Austin D

@JohnColeman, Açıkçası, 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) testve sonra bu diziyi testbir 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 Variantve çağırın x = test, bundan sonra xyaptığınız şey budur test!
Gene

-6

Değişkene kod mağaza aşağıdaki dönüş değeri retValve daha sonra MsgBoxdeğerini göstermek için kullanılabilir:

Dim retVal As Integer
retVal = test()
Msgbox retVal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.