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?
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
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.
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 ' <-- 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
Ou, o extremo exemplo de como a variável de retorno funciona (mas não necessariamente um bom exemplo de como você deve realmente codificar)-aquele que vai mantê-lo acordado à noite:
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