¿Cómo devuelvo un resultado de una función?
Por ejemplo:
Public Function test() As Integer
return 1
End Function
Esto da un error de compilación.
¿Cómo puedo hacer que esta función devuelva un entero?
Para los tipos de retorno que no son objetos, tienes que asignar el valor al nombre de tu función, así:
Public Function test() As Integer
test = 1
End Function
Ejemplo de uso:
Dim i As Integer
i = test()
Si la función devuelve un tipo de objeto, entonces debe utilizar la palabra clave Set
de esta manera:
Public Function testRange() As Range
Set testRange = Range("A1")
End Function
Ejemplo de uso:
Dim r As Range
Set r = testRange()
Tenga en cuenta que la asignación de un valor de retorno al nombre de la función no termina la ejecución de su función. Si desea salir de la función, debe decir explícitamente "Salir de la función". Por ejemplo:
Function test(ByVal justReturnOne As Boolean) As Integer
If justReturnOne Then
test = 1
Exit Function
End If
'more code...
test = 2
End Function
Documentación: http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx
Las funciones VBA tratan el propio nombre de la función como una especie de variable. Así que en lugar de utilizar un "Retorno`" declaración, usted acaba de decir:
test = 1
Tenga en cuenta, sin embargo, que esto no se sale de la función. Cualquier código después de esta declaración también se ejecutará. Por lo tanto, puede tener muchas sentencias de asignación que asignen diferentes valores a test
, y cualquiera que sea el valor cuando llegue al final de la función será el valor devuelto.
Establecer el valor de retorno al nombre de la función no es exactamente lo mismo que la sentencia return
de Java (u otra), porque en java, return
sale de la función, así:
public int test(int x) {
if (x == 1) {
return 1; // exits immediately
}
// still here? return 0 as default.
return 0;
}
En VB, el equivalente exacto lleva dos líneas si no se establece el valor de retorno al final de la función. Así que, en VB el corolario exacto sería así:
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
Dado que este es el caso, también es bueno saber que puede utilizar la variable de retorno como cualquier otra variable en el método. Así:
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
O, el ejemplo extremo de cómo la variable de retorno funciona (pero no necesariamente un buen ejemplo de cómo deberías codificar realmente)-el que te mantendrá despierto por la noche:
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