Como devolver um resultado de uma função VBA

Como posso devolver um resultado de uma função?

Por exemplo:

Public Function test() As Integer
    return 1
End Function

Isto dá um erro de compilação.

Como faço para que esta função devolva um número inteiro?

Solução

Para os tipos de retorno que não são objetos, você tem que atribuir o valor ao nome da sua função, desta forma:

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

Exemplo de uso:

Dim i As Integer
i = test()

Se a função retorna um tipo de Objeto, então você deve utilizar a palavra-chave Set assim:

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

Exemplo de uso:

Dim r As Range
Set r = testRange()

Note que a atribuição de um valor de retorno ao nome da função não encerra a execução da sua função. Se você quiser sair da função, então você precisa dizer explicitamente 'Sair da Função'. Por exemplo, se você quiser sair da função:

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

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

Comentários (7)

As funções VBA tratam o próprio nome da função como uma espécie de variável. Então, ao invés de utilizar um "retorno" declaração, você diria apenas:

test = 1

Note, no entanto, que isto não se afasta da função. Qualquer código após esta declaração também será executado. Assim, você pode ter muitas instruções de atribuição que atribuem valores diferentes ao "teste", e qualquer que seja o valor quando você chegar ao final da função, será o valor retornado.

Comentários (2)

Apenas definir o valor de retorno para o nome da função ainda não é exatamente o mesmo que a instrução return do Java (ou outra), porque em java, return sai da função, assim:

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

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

Em VB, o equivalente exato leva duas linhas se você não estiver definindo o valor de retorno no final da sua função. Então, em VB, o corolário exato ficaria assim:

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 

Como este é o caso, é também bom saber que você pode usar a variável de retorno como qualquer outra variável do método. Como esta:


Public Function test(ByVal x As Integer) As Integer

    test = x ' 
Comentários (7)