Como faço para retornar um resultado de uma função?
Por exemplo:
Public Function test() As Integer
return 1
End Function
Isso gera um erro de compilação.
Como faço para que essa função retorne um número inteiro?
Como faço para retornar um resultado de uma função?
Por exemplo:
Public Function test() As Integer
return 1
End Function
Isso gera um erro de compilação.
Como faço para que essa função retorne um número inteiro?
Respostas:
Para tipos de retorno sem objeto, você deve atribuir o valor ao nome da sua função, assim:
Public Function test() As Integer
test = 1
End Function
Exemplo de uso:
Dim i As Integer
i = test()
Se a função retornar um tipo de objeto, você deverá usar a Set
palavra - chave assim:
Public Function testRange() As Range
Set testRange = Range("A1")
End Function
Exemplo de uso:
Dim r As Range
Set r = testRange()
Observe que atribuir um valor de retorno ao nome da função não encerra a execução da sua função. Se você deseja sair da função, é necessário dizer explicitamente Exit Function
. Por exemplo:
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
Range
por exemplo), você precisa usar Set
como faria se definisse uma variável de objeto em um método regular. Portanto, se, por exemplo, "test" fosse uma função que retornasse um Range, a instrução return ficaria assim set test = Range("A1")
.
set
pode levar a problemas. Eu tive problemas em fazê-lo sem, mas se eu usar set
, não :).
set test = Range("A1")
é exatamente equivalente a test = Range("A1").Value
, onde "teste" é definido como uma Variante, em vez de um Intervalo.
As funções do VBA tratam o próprio nome da função como uma espécie de variável. Então, em vez de usar uma return
instrução " ", você apenas diria:
test = 1
Observe, no entanto, que isso não interrompe a função. Qualquer código após esta instrução também será executado. Assim, você pode ter muitas instruções de atribuição que atribuem valores diferentes a test
, e seja qual for 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 return
instrução 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;
}
No VB, o equivalente exato leva duas linhas se você não estiver definindo o valor de retorno no final de sua função . Assim, no 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 esse é o caso, também é bom saber que você pode usar a variável de retorno como qualquer outra variável no método. Como isso:
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 exemplo extremo de como a variável de retorno funciona (mas não necessariamente um bom exemplo de como você realmente deve codificar) - aquele que o manterá 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
Variant
e seu objetivo é retornar uma matriz, algo como ReDim test(1 to 100)
isso provocará um erro. Além disso, embora seja possível tratar um tipo básico Integers
como esse, ele é considerado um tanto unidiomatic. Isso torna o código mais difícil de ler. Os programadores do VBA pesquisam as linhas atribuídas ao nome da função para entender o que uma função faz. O uso do nome da função como uma variável regular oculta desnecessariamente isso.
Exit Function
se relaciona comreturn
ReDim test(1 to 100)
sem desencadear um erro simplesmente porque 'test' não é declarado como uma matriz! e por nenhuma outra razão! Você não pode declarar uma função como uma matriz. Declare-o como a Variant
, então apenas construa sua matriz de saída (pode ser Dinâmica ou Estática) dentro dessa função test
e atribua ("=") essa matriz test
como um valor de retorno. Para manipular ainda mais, como ReDim
ele, é necessário atribuir o valor retornado a uma variável, por exemplo, Dim x as Variant
e chamar x = test
, após o que x
você criou o test
que é!