Respuestas:
Para los tipos de retorno sin objeto, debe asignar el valor al nombre de su función, de esta manera:
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, debe usar la Set
palabra clave 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 asignar 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ícitamenteExit Function
. 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
Range
por ejemplo), debe usarlo Set
como lo haría si configura una variable de objeto en un método regular. Entonces, si, por ejemplo, "prueba" fuera una función que devolviera un Rango, la declaración de retorno se vería así set test = Range("A1")
.
set
problemas puede generar problemas. He tenido problemas para hacerlo sin, pero si lo uso set
no lo hago :).
set test = Range("A1")
es exactamente equivalente a test = Range("A1").Value
, donde "prueba" se define como una Variante, en lugar de un Rango.
Las funciones de VBA tratan el nombre de la función como una especie de variable. Entonces, en lugar de usar una return
declaración " ", simplemente diría:
test = 1
Tenga en cuenta, sin embargo, que esto no se escapa de la función. Cualquier código después de esta declaración también se ejecutará. Por lo tanto, puede tener muchas instrucciones de asignación que asignen valores diferentes test
, y cualquiera que sea el valor cuando llegue al final de la función será el valor devuelto.
Simplemente establecer el valor de retorno para el nombre de la función todavía no es exactamente lo mismo que la return
instrucción 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 toma dos líneas si no está configurando el valor de retorno al final de su función . Entonces, en VB, el corolario exacto se verí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
Como este es el caso, también es bueno saber que puede usar la variable de retorno como cualquier otra variable en el método. Me gusta esto:
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 bien, la extrema ejemplo de cómo las variables de retorno obras (pero no necesariamente un buen ejemplo de cómo en realidad se debe código) -la que le mantendrá en 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
Variant
y su objetivo es devolver una matriz, algo como ReDim test(1 to 100)
esto provocará un error. Además, aunque es posible tratar un tipo básico Integers
como ese, se considera algo unidiomático. Hace que el código sea más difícil de leer. Los programadores de VBA buscan líneas que se asignan al nombre de la función para comprender qué hace una función. Usar el nombre de la función como una variable regular oscurece innecesariamente esto.
Exit Function
relaciona conreturn
ReDim test(1 to 100)
sin activar un error simplemente porque 'test' no se declara como una matriz! ¡y por ninguna otra razón! No puede declarar una función como una matriz. Declare como a Variant
, luego simplemente construya su matriz de salida (puede ser Dinámica o Estática) dentro de esta función test
y luego asigne ("=") esta matriz test
como un valor de retorno. Para manipular aún más, como ReDim
si fuera necesario, debe asignar el valor devuelto a una variable, por ejemplo, Dim x as Variant
y llamar x = test
, ¡después de lo cual x
es lo que hizo test
que sea!