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 Setpalavra - 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
Rangepor exemplo), você precisa usar Setcomo 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").
setpode 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 returninstruçã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 returninstrução Java (ou outra) , porque em java returnsai 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
Variante 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 Integerscomo 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 Functionse 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 teste atribua ("=") essa matriz testcomo um valor de retorno. Para manipular ainda mais, como ReDimele, é necessário atribuir o valor retornado a uma variável, por exemplo, Dim x as Variante chamar x = test, após o que xvocê criou o testque é!