Kaip grąžinti rezultatą iš VBA funkcijos

Kaip grąžinti funkcijos rezultatą?

Pavyzdžiui:

Public Function test() As Integer
    return 1
End Function

Gaunama kompiliavimo klaida.

Kaip padaryti, kad ši funkcija grąžintų sveikąjį skaičių?

Sprendimas

Jei grąžinami ne objektų tipai, reikšmę reikia priskirti funkcijos pavadinimui, pvz., taip:

Public Function test() As Integer
    test = 1
End Function

Naudojimo pavyzdys:

Dim i As Integer
i = test()

Jei funkcija grąžina Objekto tipą, turite naudoti raktinį žodį Set, pvz:

Public Function testRange() As Range
    Set testRange = Range("A1")
End Function

Naudojimo pavyzdys:

Dim r As Range
Set r = testRange()

Atkreipkite dėmesį, kad funkcijos pavadinimui priskyrus grįžtamąją vertę, funkcijos vykdymas nenutraukiamas. Jei norite užbaigti funkciją, turite aiškiai nurodyti Exit Function. Pavyzdžiui:

Function test(ByVal justReturnOne As Boolean) As Integer
    If justReturnOne Then
        test = 1
        Exit Function
    End If
    'more code...
    test = 2
End Function

Dokumentacija: http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx

Komentarai (7)

VBA funkcijos patį funkcijos pavadinimą laiko tam tikru kintamuoju. Taigi, užuot naudoję "return" teiginį, tiesiog pasakykite:

test = 1

Tačiau atkreipkite dėmesį, kad tai nepadeda ištrūkti iš funkcijos. Bet koks kodas po šio teiginio taip pat bus vykdomas. Taigi, galite turėti daugybę priskyrimo teiginių, kurie test priskiria skirtingas reikšmes, ir bet kokia reikšmė bus grąžinama, kai pasieksite funkcijos pabaigą.

Komentarai (2)

Vien tik grąžinimo reikšmės nustatymas į funkcijos pavadinimą vis tiek nėra tiksliai tas pats, kas Java (ar kitas) return teiginys, nes Java sistemoje return išveda funkciją, pvz., taip:

public int test(int x) {
    if (x == 1) {
        return 1; // exits immediately
    }

    // still here? return 0 as default.
    return 0;
}

VB kalba tikslus atitikmuo užtrunka dvi eilutes, jeigu funkcijos pabaigoje nenustatote grąžinimo reikšmės. Taigi, VB tikslioji pasekmė atrodytų taip:

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 

Kadangi taip yra, taip pat malonu žinoti, kad grąžinimo kintamąjį galite naudoti kaip bet kurį kitą metodo kintamąjį. Pavyzdžiui, taip:


Public Function test(ByVal x As Integer) As Integer

    test = x ' 
Komentarai (7)